Redis:通用命令 数据类型
Redis:通用命令 & 数据类型
- 通用命令
- SET
- GET
- KEYS
- EXISTS
- DEL
- EXPIRE
- TTL
- TYPE
- FLUSHALL
- 数据类型
Redis
的客户端提供了很多命令用于操控Redis
,在Redis
中,key
的类型都是字符串,而value
有多种类型,每种类型都有自己的操作命令,但是也有一些与类型无关的命令,称为通用命令
。
本博客讲解Redis
中的通用命令以及数据类型。
redis
的命令不区分大小写,由于小写可读性更好,所以博客后续使用小写。
通用命令
SET
- 设置一个键值对
set key value
此处要求key
和value
都是字符串,可以加单引号或双引号,也可以不加。
GET
- 获取键对应的值
get key
此处由于先前以及插入了key1
,成功查询到value1
。如果查询不存在的值,会返回nil
,这表示不存在,相当于C语言的NULL
。
KEYS
- 获取所有满足正则的
key
keys pattern
常见的正则符号:
?
:匹配一个任意字符*
:匹配任意多个任意字符[abc]
:只能匹配a
、b
、c
三者之一,匹配一次[^a]
:排除e
,其它的都能匹配,匹配一次[a-c]
:匹配a
到c
范围内的字符,匹配一次
再多的正则匹配法则就不讲解了,以上五个是官方给出的五种匹配法则。
如图,一开始插入了四个键值对,随后根据以上五种正则进行匹配,筛选出了不同的key
。
要注意的是,keys
会遍历Redis
内部的所有数据,时间复杂度为O(N)
。生产环境中一般会禁止使用这个命令。
EXISTS
- 判断一个或多个
key
是否存在
exists key [key ...]
在exists
后可以跟着多个key
,最后返回存在的key
的个数。
因为底层使用哈希表组织数据,所以该操作的复杂度为O(1)
。
上例中,先同时查询了hallo
和hello
,返回2
说明两个都存在。后面又分别查询两者。
问题来了,同时查询多个key
和分开查询有什么区别吗?
其实区别可大了,因为Redis
是基于网络实现的,客户端敲入的每一个命令都要包装为一个请求发给客户端,客户端再进行响应。如果一次性查询多个key
,一次请求就可以完成查询,而多次查询则需要多个网络请求,效率会低很多。
因为网络要与硬件进行IO
,封装层数多,速度是非常慢的。这是Redis
的缺陷,因此Redis
在设计时,就尽可能支持让一个命令完成多个操作。
DEL
- 删除指定的
key
del key [key ...]
同样的,del
也支持多个key
同时删除。
EXPIRE
- 为指定的
key
添加秒级的过期时间
expire key seconds
所谓过期时间
,就是一个数据的有效期,当数据超过过期时间,数据就会被自动删除。比如说常见的验证码,就可以用这个过期时间实现。
返回1
表示成功,0
表示失败,如果对不存在的key
设置过期时间,就会失败。
如图,设置了一个hello
变量,并设置过期时间为5 s
,随后立刻查询,可以查询到hello
,再过一段时间就被自动删除了,查询结果为nil
。
如果想要更加精确的时间,可以使用pexpire
命令,该命令的时间单位是毫秒。
TTL
- 获取
key
的秒级过期时间
ttl key
如果key
没有过期时间,返回-1
,如果key
不存在,返回-2
,其他情况返回剩余时间。
如图,设置hello
后,查询ttl
,由于key
没有设置过期时间,此时返回-1
。设置过期时间为5 s
,后两次查询分别查询到4
、1
,为剩余的过期时间。最后一次查询结果为-2
,表示key
不存在,因为已经过期删除了。
另外的,ttl
也有毫秒级别的指令pttl
。
那么Redis
是如何实现定期删除的?
此处采用了定期删除
+惰性删除
的策略:
定期删除
:每隔一段时间,抽取一部分数据检查,看是否有过期的数据,将其删除惰性删除
:当用户操作数据时,检测一遍这个数据是否过期,如果过期就删除,再给用户返回key
不存在
因为Redis
内部要存储不少数据,轮询一遍所有数据要浪费很多时间,所以不会遍历所有数据判断过期。而是等待用户访问数据才删除,或者抽样检查删除,以降低删除过期数据带来的时间浪费。
TYPE
- 返回
key
对应的value
的类型
type key
在Redis
中,所有的key
都是字符串类型,而value
有多种类型。如果返回none
表示key
不存在。
FLUSHALL
- 删除
Redis
中所有数据
flushall
这个命令在生产环境中千万不要敲,这就是删库操作,只是在学习过程中可能要清除以前的数据,才需要用到。
数据类型
官方文档中,给出了以下基础数据类型:
String
:字符串Hash
:哈希List
:列表Set
:集合Sorted set
:有序集合Stream
:流Bitmap
:位图Bitfield
:位字段Geospatial
:地理信息
除此之外,Redis
还支持一些其它的扩展类型。在基础类型中,最常用的是前五种类型。
Redis
非常追求高效,在数据类型方面,向用户承诺这些数据类型使用起来可以达到指定效果,但是底层具体如何实现,这就不能保证了。就比如说哈希表,它保证用户用起来和哈希表没有区别,可以以O(1)
的时间复杂度完成增删查改,但是底层是不是使用哈希表,就不一定了!
每种数据类型,都可能会有多种实现方式,Redis
称其为编码方式,常见编码方式如下表:
数据类型 | 内部编码 |
---|---|
string | raw |
int | |
embstr | |
hash | hashtable |
ziplist | |
list | linkedlist |
ziplist | |
set | hashtable |
intset | |
zset | skiplist |
ziplist |
string
raw
:最基本的字符串,底层就是一个字符数组int
:当value
是一个整数,此时会用int
来保存embstr
:针对短字符串的优化
value
默认传入时都是字符串,如果检测到字符串是一个数字,就转为int
存储。比如说字符串"12345678"
,如果用字符串存储需要8 byte
,但是Redis
检测到其为整数后,转为int
存储,只需要4 byte
。
-
hash
hashtable
:标准的哈希表ziplist
:压缩列表,当哈希表元素比较少,可以通过该结构压缩空间
-
list
linklist
:标准的链表ziplist
:压缩列表,当链表元素比较少,可以通过该结构压缩空间
在Redis 3.2
后,list
统一使用quicklist
,取消了linklist
和ziplist
,因为quicklist
兼顾了两者的特性。简单来说,quicklist
基本结构是一个linklist
,而每一个链表节点是一个ziplist
,也就是说耦合了前两者。
set
hashtable
:基于哈希表实现的集合intset
:如果集合都是整数,会优化为该结构
在现代编程语言中,常会使用平衡二叉搜索树,比如红黑树来实现set
,其时间复杂度为O(lgN)
。但是Redis
为了更加高效,采用了O(1)
时间复杂度的哈希表实现set
。
zset
skiplist
:跳表ziplist
: 压缩列表,当集合元素比较少,可以通过该结构压缩空间
此处的跳表也是一种搜索结构,时间复杂度属于O(lgN)
级别,与平衡二叉搜索树属于同一级别。
如果想要查看数据类型底层具体使用了什么编码,可以使用指令object encoding
:
object encoding key
如图,同为string
类型的三个value
,最后底层编码使用了不同的方式。
相关文章:

Redis:通用命令 数据类型
Redis:通用命令 & 数据类型 通用命令SETGETKEYSEXISTSDELEXPIRETTLTYPEFLUSHALL 数据类型 Redis的客户端提供了很多命令用于操控Redis,在Redis中,key的类型都是字符串,而value有多种类型,每种类型都有自己的操作命…...
【Python高级编程】探索Python库:创建引人入胜的交互界面
1.制作交互界面常用到的库 在 Python 中,有多个库可以用于创建交互界面(GUI)。 以下是一些常用的 Python GUI 库: Tkinter: Python 的标准 GUI 库,通常随 Python 一起安装。简单易用,适合快速开发小型应用…...

OpenCV Canny()函数
OpenCV Canny()函数被用来检测图像物体的边缘。其算法原理如下: 高斯滤波:使用高斯滤波器平滑图像以减少噪声。高斯滤波器是一种线性滤波器,可以消除图像中的高频噪声,同时保留边缘信息。计算梯度强度和方向:使用Sobe…...

Java基础(3)
基本数据类型 Java 中的几种基本数据类型了解么? Java 中有 8 种基本数据类型,分别为: 6 种数字类型: 4 种整数型:byte、short、int、long2 种浮点型:float、double1 种字符类型:char1 种布尔…...

【C语言】VS调试技巧
文章目录 什么是bug什么是调试(debug)debug和releaseVS调试快捷键监视和内存观察编程常见错误归类 什么是bug bug本意是“昆虫”或“虫子”,现在一般是指在电脑系统或程序中,隐藏着的一些未被发现的缺陷或问题,简称程…...

【华为HCIP实战课程七】OSPF邻居关系排错MTU问题,网络工程师
一、MTU MUT默认1500,最大传输单元,一致性检测 [R3-GigabitEthernet0/0/1]mtu 1503//更改R3的MTU为1503 查看R3和SW1之间的OSPF邻居关系正常: 默认华为设备没有开启MTU一致性检测! [R3-GigabitEthernet0/0/1]ospf mtu-enable //手动开启MTU检测 [SW1-Vlanif30]ospf mtu…...
速盾:休闲类游戏如何选择高防cdn?
休闲类游戏的流行度日益增长,越来越多的玩家在业余时间里选择放松自己,享受游戏带来的乐趣。然而,在休闲类游戏中,网络延迟和游戏载入速度的问题常常会影响到玩家的游戏体验。为了解决这些问题,选择一个高防CDN&#x…...

电脑插上U盘不显示怎么回事?怎么解决?
平时使用电脑的时候经常会使用U盘来传输数据或是备份文件,有时候会遇到一个令头疼的问题,比如,将U盘插入电脑的USB口后,设备却显示不出来。电脑上插入U盘后却不显示会影响我们的正常工作。接下来,我们一起分析一下故障…...

Python 如何使用 SQLAlchemy 进行复杂查询
Python 如何使用 SQLAlchemy 进行复杂查询 一、引言 SQLAlchemy 是 Python 生态系统中非常流行的数据库处理库,它提供了一种高效、简洁的方式与数据库进行交互。SQLAlchemy 是一个功能强大的数据库工具,支持结构化查询语言(SQL)…...
nginx主配置文件
Nginx的主配置文件nginx.conf,一般定义了Nginx的基本设置和全局配置。下面是对这个配置文件的详细解释: 文件结构 #user nobody; worker_processes 1;#error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log …...

使用数据库:
数据库: 1.为何需要数据库? 存储数据方法 第一种:用大脑记住数据, 第二种:写纸上, 第三种:写在计算机的内存中, 第四种:写出磁盘文件 2.数据库能做什么࿱…...

python list, tuple dict,set的区别 以及**kwargs 的基本用法
在python中, list, tuple, dict, set有什么区别, 主要应用在什么样的场景? 定义: list:链表,有序的项目, 通过索引进行查找,使用方括号”[]”; tuple:元组,元组将多样的对象集合到一起,不能修改,通过索引进行查找, 使用括号”()”; dict:字典,字典是一组键(key)和值(value…...

实用生活英语口语学习成人零基础入门柯桥专业外语培训
“秋裤”的英语表达 首先,秋裤肯定不是autumn pants,chill cool就更离谱了! 最地道的美语说法一定会用到“thermal”这个单词: ▼ “thermal”的意思是“热的、保温的”,由此延伸出“秋裤、保暖内衣”的表达ÿ…...
FLINK SQL数据类型
Flink SQL支持非常完善的数据类型,以满足不同的数据处理需求。以下是对Flink SQL数据类型的详细归纳: 一、原子数据类型 字符串类型 CHAR、CHAR(n):定长字符串,n代表字符的定长,取值范围为[1, 2147483647]。如果不指…...

汇编语言教程:打造你的第一款汇编语言小游戏 汇编语言教程攻略
目录 游戏详细简介 完整代码示例(不少于70行) 如何自学汇编语言游戏开发攻略及功能 游戏详细简介 游戏名称:“太空探险” 游戏简介:这是一款基于x86汇编语言开发的简单2D游戏。在游戏中,玩家扮演一名宇航员&#…...

白色简洁大方公司企业网站源码 WordPress主题2款
WordPress白色简洁大方公司企业网站主题2款 白色整洁风格wordpress主题是一款比较新颖的国际设计范风格 简洁而大方的 WordPress 主题,适合个人博客、企业和工作室用。 完美支持下拉菜单的wordpress企业主题。 wordpress简白企业模板是一款适合企业站以及工作室…...

MinIO分片上传超大文件(纯服务端)
目录 一、MinIO快速搭建1.1、拉取docker镜像1.2、启动docker容器 二、分片上传大文件到MinIO2.1、添加依赖2.2、实现MinioClient2.3、实现分片上传2.3.0、初始化MinioClient2.3.1、准备分片上传2.3.2、分片并上传2.3.2.1、设置分片大小2.3.2.2、分片 2.3.3、分片合并 三、测试3…...

leetcode链表(一)-移除链表元素
题目 t. - 力扣(LeetCode) 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 例1 输入:head [1,2,6,3,4,5,6], val 6 输出:[1,2,3,4,5]…...

python的特殊方法——魔术方法
前言 __init__(self[]) 编辑 __call__(self [, ...]) __getitem__(self, key) __len__(self) __repr__(self) / __str__(self) __add__(self, other) __radd__(self, other) 参考文献 前言 官方定义好的,以两个下划线开头且以两个下划线结尾来命名的方法…...
深入浅出理解TCP三次握手与四次挥手
目录 引言1.为什么需要三次握手?2. 三次握手的过程3. 为什么需要四次挥手?4. 四次挥手的过程5. 为什么挥手需要四次,而握手只需三次?6. 三次握手与四次挥手的时序图7. TIME_WAIT状态的意义8. 总结9.面试时候问到什么是三次握手和四…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...

Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...