Redis十部曲之一:理解Redis中的数据类型

前言

String

Redis 的字符串类型不仅仅是文本,它其实是一个 二进制安全的字节序列(Binary Safe),可以用来存储:

  • 字符串(如 "hello"
  • 数字(用于计数器)
  • 二进制数据(如图片、序列化对象)

底层实现

Redis 并不直接使用 C 的 char[],而是自定义了 SDS 结构(Simple Dynamic String),解决了 C 字符串的一系列问题:

特性描述
长度缓存O(1) 复杂度获取字符串长度,无需遍历
二进制安全允许存储 \0 字节,不依赖结尾标识
动态扩容使用“预分配空间 + 惰性释放”策略,避免频繁内存分配
兼容 CSDS 内部结构与 char* 可兼容调用 C API

常用命令

#设置key的值
SET key value [NX | XX] [GET] [EX seconds | EXAT unix-time-seconds | KEEPTTL]
	#NX:仅在key不存在时设置
	#XX:仅在key存在时设置
	#GET:返回存储在key处的旧字符串,如果key不存在则返回nil。如果存储在key处的值不是字符串,则返回错误并终止SET
	#EX:设置指定的过期时间,单位为秒(正整数)
	#EXAP:设置密钥到期的指定Unix时间,以秒为单位(正整数)
	#KEEPTTL:更新value,不改变其原有的过期时间
	
# 获取key的值
GET key

# 整数自增自减
INCR/DECR key

List

Redis 的 List 是一个 有序链表结构的字符串集合,可以理解为: “支持从两端插入/弹出元素的双端队列(Deque)”。元素按照插入顺序排序,可用于消息队列、任务缓冲区等场景。

底层实现

Redis 为了兼顾 性能与节省内存,在不同场景下采用不同的数据结构:

编码方式描述
ziplist旧版 Redis(≤3.2)用压缩列表实现小 list
quicklistRedis 3.2+ 默认实现,多个 ziplist 组成的双向链表
linkedlist较老版本才用,内存浪费大,性能差,已淘汰

在这里插入图片描述

常用命令

# 从左侧插入
LPUSH key value [value ...]  

# 从右侧插入
RPUSH key value [value ...]  

# 从左侧弹出
LPOP key    

# 从右侧弹出                 
RPOP key      

# 获取指定区间的元素               
LRANGE key start stop     

# 获取长度   
LLEN key        

# 按下标读取元素             
LINDEX key index   

 # 更新某个索引的值          
LSET key index value   

# 从左侧弹出,阻塞等待
BLPOP key [key ...] timeout  

# 从右侧弹出,阻塞等待
BRPOP key [key ...] timeout       

Set

Redis 的 Set 类型是一种无序且唯一的字符串集合,非常适合用来做去重和集合间的关系运算(如交集、并集、差集)。

底层实现

Redis 使用了基于两种数据结构的实现,依据集合大小和元素特性动态切换:

实现结构说明
哈希表小型集合默认使用哈希表实现,支持快速插入和查找(O(1))
整数集合当所有元素都是整数且集合较小时,使用内存更紧凑的整数集合实现

常用命令

# 向集合添加元素
SADD key member [member ...]

# 从集合中删除元素
SREM key member [member ...]

# 判断元素是否存在
SISMEMBER key member

# 获取集合所有元素
SMEMBERS key

# 获取集合元素个数
SCARD key

# 随机获取一个或多个元素
SRANDMEMBER key [count]

# 计算多个集合的交集
SINTER key [key ...]

# 计算多个集合的并集
SUNION key [key ...]

# 计算多个集合的差集
SDIFF key [key ...]

Hash

Redis 的 Hash 类型是一个键值对集合,特别适合存储对象(如用户信息),相当于一个小型的字典或者 Map。

底层实现

Redis Hash 也是根据存储大小和元素类型,动态选择两种底层实现方式:

实现结构说明
ziplist当字段数量和字段值都较小时,使用内存紧凑的压缩列表,节省空间
哈希表当字段较多或字段值较大时,自动转换为哈希表,支持快速访问

常用命令

# 设置哈希字段值
HSET key field value

# 获取哈希字段值
HGET key field

# 删除哈希字段
HDEL key field [field ...]

# 判断哈希字段是否存在
HEXISTS key field

# 获取哈希所有字段名
HKEYS key

# 获取哈希所有字段值
HVALS key

# 获取哈希中所有字段和对应值
HGETALL key

# 获取哈希字段数量
HLEN key

# 对哈希字段的整数值进行自增
HINCRBY key field increment

Sorted Set

Redis 的 Sorted Set 是一种带有 分数(score) 的有序集合,每个元素都是唯一的字符串,且会根据分数进行自动排序。适合做排行榜、优先队列等场景。

底层实现

Redis Sorted Set 底层结合了两种数据结构:

实现结构说明
跳表(Skip List)支持按分数范围快速检索和范围查询,且有序
哈希表(Hash Table)用于快速定位元素,保证元素唯一,支持 O(1) 的查找操作

跳表保证了有序遍历的效率,哈希表保证了查找和更新的效率,两者结合实现了高性能的有序集合。

常用命令

# 添加元素或更新元素的分数
ZADD key [NX|XX] [CH] [INCR] score member [score member ...]

# 获取元素的排名(分数从小到大)
ZRANK key member

# 获取元素的倒序排名(分数从大到小)
ZREVRANK key member

# 获取指定排名区间的元素(按分数升序)
ZRANGE key start stop [WITHSCORES]

# 获取指定排名区间的元素(按分数降序)
ZREVRANGE key start stop [WITHSCORES]

# 获取指定分数区间的元素
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

# 删除元素
ZREM key member [member ...]

# 统计元素数量
ZCARD key

# 统计指定分数区间内元素数量
ZCOUNT key min max

JSON

Redis 本身不直接支持 JSON 类型,但通过 RedisJSON 模块,Redis 能高效存储和操作 JSON 文档,支持对 JSON 对象的嵌套访问和原子修改。

底层实现

RedisJSON 基于 Redis 的字符串和底层数据结构,存储 JSON 数据为二进制格式(使用 RLE编码 和其他压缩技术),并提供高效的路径访问和修改能力。

常用命令

# 设置整个 JSON 文档或部分路径的值
JSON.SET key [path] value

# 获取整个 JSON 文档或部分路径的值
JSON.GET key [path] [INDENT indent] [NEWLINE newline] [SPACE space]

# 删除指定路径的键
JSON.DEL key [path]

# 判断指定路径是否存在
JSON.EXISTS key [path]

# 对数值型 JSON 路径的值进行增减
JSON.NUMINCRBY key path increment

# 对字符串类型进行拼接
JSON.STRAPPEND key path value

# 获取 JSON 对象的键集合
JSON.OBJKEYS key [path]

# 获取 JSON 对象的键数量
JSON.OBJLEN key [path]

JSON Path语法

RedisJSON 使用类似于 JSONPath 的路径表达式来访问和操作 JSON 数据中的特定部分。

语法含义示例说明
$根节点$代表整个 JSON 对象
.子节点$.name访问根节点下的 name 字段
[]数组索引$.friends[0]访问 friends 数组的第一个元素
[*]数组通配符,表示所有元素$.friends[*]访问 friends 数组的所有元素
..递归搜索,匹配所有后代节点$..name匹配所有名为 name 的字段
['key']支持特殊字符或空格的字段名$['first name']访问字段名中有空格或特殊字符的键
?()过滤表达式$.friends[?(@.age > 18)]过滤年龄大于 18 的朋友(支持简单表达式)

其它数据结构

当然!以下是 Redis 进阶数据结构及概率算法的简明表格总结:

数据结构 / 模块主要功能典型应用关键命令示例备注
Stream有序持久消息流消息队列、事件流处理XADD, XRANGE, XREAD, XGROUP, XACKRedis 内置
Bitmap位级操作的二进制标记用户签到、活跃标记SETBIT, GETBIT, BITCOUNT, BITOPRedis 内置
Bitfield字符串任意位置的整数读写多种整数类型高效读写BITFIELDRedis 内置
HyperLogLog基数估算(唯一元素计数)UV统计、大数据去重估算PFADD, PFCOUNT, PFMERGERedis 内置
Bloom Filter概率性集合判断元素是否存在快速存在性检测,允许误判依赖 RedisBloom 模块需安装模块
Cuckoo Filter支持删除的概率集合支持删除的布隆过滤器依赖 RedisBloom 模块需安装模块
t-digest流式数据分位数估计百分位统计依赖 RedisBloom 模块需安装模块
Top-K估计最频繁出现的 K 个元素热门词汇、热搜统计依赖 RedisBloom 模块需安装模块
Count-Min Sketch频率估算流量统计、频率估计依赖 RedisBloom 模块需安装模块
Time Series时间序列数据存储与分析IoT数据、监控指标TS.CREATE, TS.ADD, TS.RANGE, TS.MRANGE, TS.AGGREGATE需安装 RedisTimeSeries 模块
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

比特流梭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值