Redis之数据结构介绍
Redis数据结构
1、核心数据结构
- String、Hash、List、Set、ZSet:Redis 的基础数据类型,从早期版本沿用至今。
- Stream:Redis 5.0 引入的消息队列数据结构,Redis 8.x 依然支持。
- Geo:Redis 3.2 引入的地理空间索引,8.x 保持兼容。
- Bitmap:基于 String 的位操作扩展,非独立数据类型。
- HyperLogLog:基数统计工具,Redis 8.x 保留其功能。
2、新增/增强的数据结构
- Vector Set:Redis 8.x 新增的向量搜索功能,专为 AI 应用设计。
- 原生 JSON:Redis 7.0 引入的 JSON 数据结构,8.x 进一步优化(如
JSON.SET
和JSON.GET
命令)。- 概率数据结构:如 Bloom Filter、Cuckoo Filter 等,通过模块(如 RedisBloom)提供。
类别 | 数据结构 | 说明 |
---|---|---|
核心数据结构 | String、Hash、List、Set、ZSet | Redis 基础数据类型,支持原子操作和内存优化 |
核心扩展 | Bitmap、HyperLogLog、Geo、Stream | 基于 String 或 ZSet 的扩展功能,用于特定场景(如基数统计、地理空间) |
新增功能 | Vector Set(Beta) | Redis 8.x 新增,支持向量相似性搜索,专为 AI 应用设计 |
模块化数据结构 | RedisJSON(JSON)、RedisBloom | 通过模块提供,需额外安装,但与核心功能无缝集成 |
其他模块 | RedisTimeSeries、RedisGraph | 用于时间序列和图数据库,需通过模块启用,扩展 Redis 的应用场景 |
一、Redis数据结构介绍
1、字符串(String)
-
用途:存储简单的键值对,支持文本、数字、二进制数据(最大 512MB)。
-
特点:
- 原子操作支持(如自增/自减)。
- 支持设置过期时间(TTL)。
-
示例命令:
# 存储字符串 SET key value # 获取字符串 GET key # 自增数值 INCR key # 设置过期时间 EXPIRE key 60
2、哈希(Hash)
-
用途:存储对象,字段与值的映射(适合存储结构化数据)。
-
特点:
- 支持原子操作(如字段更新、删除)。
- 内存优化(适合存储小对象)。
-
示例命令:
# 存储哈希 HSET user:1001 name "张三" age 30 # 获取哈希字段 HGET user:1001 name # 获取所有字段和值 HGETALL user:1001
3、列表(List)
-
用途:实现队列或栈结构,按插入顺序存储元素。
-
特点:
- 支持左/右插入、弹出操作。
- 支持范围查询和修剪。
-
示例命令:
# 左推入元素 LPUSH list_key item1 item2 # 右弹出元素 RPOP list_key # 查询列表范围 LRANGE list_key 0 5
4、集合(Set)
-
用途:存储无序且唯一的元素集合。
-
特点:
- 支持交集、并集、差集等集合运算。
- 适用于去重场景。
-
示例命令:
# 添加元素 SADD set_key item1 item2 # 查询所有元素 SMEMBERS set_key # 计算交集 SINTER set1 set2
5、有序集合(Sorted Set, ZSet)
-
用途:存储带分数的元素集合,按分数排序。
-
特点:
- 支持范围查询(按分数或排名)。
- 适用于排行榜、优先级队列。
-
示例命令:
# 添加带分数的元素 ZADD zset_key 10 "item1" 20 "item2" # 查询分数区间 ZRANGE zset_key 0 5 WITHSCORES # 计算排名 ZRANK zset_key "item1"
6、位图(Bitmap)
-
用途:通过位操作实现布隆过滤器或状态统计。
-
特点:
- 极低内存占用(1 位表示一个状态)。
- 支持位操作(AND、OR、XOR)。
-
示例命令:
# 设置位为 1 SETBIT bitmap_key 10 1 # 查询位值 GETBIT bitmap_key 10 # 统计 1 的数量 BITCOUNT bitmap_key
7、超日志(HyperLogLog)
-
用途:基数估算,用于统计独立访问用户数等场景。
-
特点:
- 内存占用极小(约 12KB)。
- 允许一定误差(误差率 < 1%)。
-
示例命令:
# 添加元素 PFADD hll_key user1 user2 # 统计基数 PFCOUNT hll_key
8、地理空间索引(Geo)
-
用途:存储地理位置坐标,支持距离查询。
-
特点:
- 支持半径搜索、距离计算。
- 适用于附近地点推荐。
-
示例命令:
# 添加地理位置 GEOADD city 116.407526 39.904030 "Beijing" # 查询附近地点 GEORADIUS city 116.407526 39.904030 100 km
二、新增数据结构
1、向量集合(Vector Set, Beta 版)
-
用途:存储高维向量嵌入,支持语义搜索和推荐系统。
-
特点:
- 高效相似性搜索(如余弦相似度)。
- 支持多维过滤(结合 JSON 或哈希字段)。
-
示例命令:
# 存储向量 VECTOR.SET myvec 0 [0.12 0.35 0.89] # 查询相似向量 VECTOR.SEARCH myvec [0.1 0.3 0.9] LIMIT 3
2、原生 JSON 数据结构
-
用途:直接存储和操作 JSON 文档。
-
特点:
- 支持 JSONPath 语法(如
$.name
)。 - 原子更新嵌套字段。
- 支持 JSONPath 语法(如
-
示例命令:
# 存储 JSON 文档 JSON.SET user:1001 $ '{"name":"张三","age":30}' # 获取 JSON 字段 JSON.GET user:1001 $.name # 更新 JSON 字段 JSON.SET user:1001 $.age 31
3、概率数据结构
Redis 8.x 新增以下概率数据结构:
-
布隆过滤器(Bloom Filter)
-
用途:快速判断元素是否存在(允许误判)。
-
特点:
- 内存高效,适合大规模数据去重。
- 不支持删除操作。
-
示例命令:
# 初始化布隆过滤器 BF.RESERVE mybloom 0.01 1000000 # 添加元素 BF.ADD mybloom "user1" # 查询元素是否存在 BF.EXISTS mybloom "user1"
-
-
布谷鸟过滤器(Cuckoo Filter)
-
用途:比布隆过滤器更高效的变体。
-
特点:
- 支持动态调整容量。
- 删除操作更灵活。
-
示例命令:
# 初始化布谷鸟过滤器 CF.RESERVE mycuckoo 1000000 # 添加元素 CF.ADD mycuckoo "user1" # 查询元素是否存在 CF.EXISTS mycuckoo "user1"
-
-
计数最小值草图(Count-Min Sketch)
-
用途:估计元素频率。
-
特点:
- 内存占用低,适合高频统计。
- 仅提供频率的上界估计。
-
示例命令:
# 初始化计数草图 CMS.INITBYPROBABILITY mycms 0.01 0.001 # 记录元素出现次数 CMS.INCRBY mycms "user1" 1 # 查询元素频率 CMS.QUERY mycms "user1"
-
-
Top-k(Top-K)
-
用途:找出最频繁的 K 个元素。
-
特点:
- 动态维护高频元素列表。
- 适用于实时排行榜。
-
示例命令:
# 初始化 Top-k 结构 TOPK.RESERVE mytopk 10 0.9 0.99 1000 # 记录元素出现 TOPK.ADD mytopk "user1" "user2" # 查询 Top-k 元素 TOPK.LIST mytopk
-
-
t-digest(分位数估计)
-
用途:估计数据流的分位数(如中位数、99% 分位数)。
-
特点:
- 高精度分位数计算。
- 适用于监控和性能分析。
-
示例命令:
# 初始化 t-digest 结构 TDIGEST.CREATE mydigest 1000 # 添加数据点 TDIGEST.ADD mydigest 10 20 30 # 查询分位数 TDIGEST.QUANTILE mydigest 0.5
-
三、模块化数据结构的补充
Redis 8.x 的部分功能通过模块实现,这些数据结构虽然不直接属于内核,但在实际应用中非常重要。用户列表中未明确提及的部分模块化数据结构包括:
1、RedisJSON
-
用途:存储和操作 JSON 文档。
-
特点:
- 支持 JSONPath 查询和更新。
- 与 Redis 的 Hash、String 等类型集成。
-
示例命令:
JSON.SET user:1001 $ '{"name":"张三","age":30}' JSON.GET user:1001 $.name
2、RedisBloom
-
用途:提供概率数据结构(Bloom Filter、Cuckoo Filter、Count-Min Sketch 等)。
-
特点:
- 内存高效,适用于大规模数据去重和频率统计。
-
示例命令:
BF.ADD mybloom "user1" BF.EXISTS mybloom "user1"
3、RedisTimeSeries
-
用途:存储和查询时间序列数据(如物联网传感器数据、监控指标)。
-
特点:
- 支持时间窗口聚合、压缩存储。
-
示例命令:
TS.ADD temp_sensor 1726812000 25.5 TS.RANGE temp_sensor - + LIMIT 10
4、RedisGraph
-
用途:图数据库,支持属性图模型和 Cypher 查询语言。
-
特点:
- 适用于社交网络分析、路径查找等场景。
-
示例命令:
GRAPH.QUERY social_graph "MATCH (a:User)-[:FRIEND]->(b:User) RETURN a, b"
5、RedisSearch
-
用途:全文搜索引擎,支持二级索引和复杂查询。
-
特点:
- 支持模糊搜索、分词、排序等。
-
示例命令:
FT.CREATE idx ON HASH PREFIXES 1 doc: SCHEMA title TEXT FT.SEARCH idx "Redis"
Redis 8.x 提供了全面的数据结构支持:核心类型包括 String、Hash、List、Set、ZSet;扩展功能涵盖 Bitmap、HyperLogLog、Geo、Stream;新增 Vector Set(Beta) 和 原生 JSON(7.0+ 内建);并通过模块(如 RedisBloom)实现 概率数据结构(Bloom Filter、Cuckoo Filter) 与 高级场景(时间序列、图数据库)。这些结构覆盖缓存、实时分析、AI 推荐等全场景需求,兼顾高性能与灵活性。
- 感谢你赐予我前进的力量