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.SETJSON.GET 命令)。
  • 概率数据结构:如 Bloom Filter、Cuckoo Filter 等,通过模块(如 RedisBloom)提供。
类别数据结构说明
核心数据结构String、Hash、List、Set、ZSetRedis 基础数据类型,支持原子操作和内存优化
核心扩展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)。
    • 原子更新嵌套字段。
  • 示例命令

    # 存储 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 新增以下概率数据结构:

  1. 布隆过滤器(Bloom Filter)

    • 用途:快速判断元素是否存在(允许误判)。

    • 特点

      • 内存高效,适合大规模数据去重。
      • 不支持删除操作。
    • 示例命令

      # 初始化布隆过滤器
      BF.RESERVE mybloom 0.01 1000000
      # 添加元素
      BF.ADD mybloom "user1"
      # 查询元素是否存在
      BF.EXISTS mybloom "user1"
      
  2. 布谷鸟过滤器(Cuckoo Filter)

    • 用途:比布隆过滤器更高效的变体。

    • 特点

      • 支持动态调整容量。
      • 删除操作更灵活。
    • 示例命令

      # 初始化布谷鸟过滤器
      CF.RESERVE mycuckoo 1000000
      # 添加元素
      CF.ADD mycuckoo "user1"
      # 查询元素是否存在
      CF.EXISTS mycuckoo "user1"
      
  3. 计数最小值草图(Count-Min Sketch)

    • 用途:估计元素频率。

    • 特点

      • 内存占用低,适合高频统计。
      • 仅提供频率的上界估计。
    • 示例命令

      # 初始化计数草图
      CMS.INITBYPROBABILITY mycms 0.01 0.001
      # 记录元素出现次数
      CMS.INCRBY mycms "user1" 1
      # 查询元素频率
      CMS.QUERY mycms "user1"
      
  4. 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
      
  5. 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 推荐等全场景需求,兼顾高性能与灵活性。