文章目录
前言
String
Redis 的字符串类型不仅仅是文本,它其实是一个 二进制安全的字节序列(Binary Safe),可以用来存储:
- 字符串(如
"hello"
) - 数字(用于计数器)
- 二进制数据(如图片、序列化对象)
底层实现
Redis 并不直接使用 C 的 char[]
,而是自定义了 SDS 结构(Simple Dynamic String),解决了 C 字符串的一系列问题:
特性 | 描述 |
---|---|
长度缓存 | O(1) 复杂度获取字符串长度,无需遍历 |
二进制安全 | 允许存储 \0 字节,不依赖结尾标识 |
动态扩容 | 使用“预分配空间 + 惰性释放”策略,避免频繁内存分配 |
兼容 C | SDS 内部结构与 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 |
quicklist | Redis 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 , XACK | Redis 内置 |
Bitmap | 位级操作的二进制标记 | 用户签到、活跃标记 | SETBIT , GETBIT , BITCOUNT , BITOP | Redis 内置 |
Bitfield | 字符串任意位置的整数读写 | 多种整数类型高效读写 | BITFIELD | Redis 内置 |
HyperLogLog | 基数估算(唯一元素计数) | UV统计、大数据去重估算 | PFADD , PFCOUNT , PFMERGE | Redis 内置 |
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 模块 |