Redis 数据结构及特点

发布于:2025-08-12 ⋅ 阅读:(16) ⋅ 点赞:(0)

Redis 是一个基于内存的高性能键值存储系统,支持多种数据结构,每种数据结构在底层实现、性能特点、使用场景上都有差异。本文将详细介绍 Redis 支持的数据结构 及其 特点


1. String(字符串)

简介

  • 最基本的数据类型,二进制安全。
  • 既可以是字符串,也可以是数字(整型/浮点型)。
  • 最大长度:512 MB

常用命令

命令 说明
SET key value 设置值
GET key 获取值
INCR key 值加 1(数字)
DECR key 值减 1(数字)
APPEND key value 追加内容
MGET key1 key2 ... 批量获取

底层实现

  • SDS(Simple Dynamic String):可动态扩容,避免缓冲区溢出。
  • 支持整数值直接存储为 int 类型(节省空间)。

特点

  • 操作简单,性能高(O(1))。
  • 适合存储:缓存对象、计数器、分布式锁、短字符串。

2. List(列表)

简介

  • 有序、可重复的字符串序列。
  • 双端操作(从左、右两端 push/pop)。
  • 最大元素数:2^32 - 1

常用命令

命令 说明
LPUSH key value1 [value2...] 从左插入
RPUSH key value1 [value2...] 从右插入
LPOP key 从左弹出
RPOP key 从右弹出
LRANGE key start stop 获取范围内元素
BLPOP key timeout 阻塞弹出

底层实现

  • 早期:ziplist(压缩列表)或 linkedlist(双向链表)。
  • Redis 3.2+:统一用 quicklist(压缩列表 + 链表结合)。

特点

  • 按插入顺序排序,适合消息队列、任务队列。
  • 插入和弹出为 O(1),随机访问为 O(n)。

3. Hash(哈希表)

简介

  • 键值对集合,适合存储对象(类似 Map)。
  • 最大 field 数量:2^32 - 1

常用命令

命令 说明
HSET key field value 设置字段值
HGET key field 获取字段值
HMGET key field1 field2 批量获取
HDEL key field 删除字段
HGETALL key 获取所有字段和值

底层实现

  • ziplist(压缩列表):当 field 数少且 value 短。
  • hashtable(哈希表):元素较多时。

特点

  • 适合存储结构化数据(如用户信息)。
  • 内存利用率高,操作复杂度 O(1)。

4. Set(集合)

简介

  • 无序、不重复的字符串集合。
  • 最大元素数:2^32 - 1

常用命令

命令 说明
SADD key member1 [member2...] 添加成员
SREM key member 移除成员
SMEMBERS key 获取所有成员
SISMEMBER key member 判断成员是否存在
SUNION key1 key2 并集
SINTER key1 key2 交集
SDIFF key1 key2 差集

底层实现

  • intset(整数集合):全是整数且数量少。
  • hashtable(哈希表):存储大量字符串成员。

特点

  • 自动去重,适合标签、好友关系。
  • 集合运算(交、并、差)性能高。

5. Sorted Set(有序集合,ZSet)

简介

  • 集合 + 分数(score),按分数排序。
  • 成员唯一,score 可重复。
  • 最大元素数:2^32 - 1

常用命令

命令 说明
ZADD key score member 添加成员
ZREM key member 删除成员
ZRANGE key start stop [WITHSCORES] 按顺序获取成员
ZREVRANGE key start stop 倒序获取
ZRANK key member 获取排名(升序)
ZREVRANK key member 获取排名(降序)
ZINCRBY key increment member 增加分数

底层实现

  • ziplist:元素少且数据短。
  • skiplist(跳表)+ hashtable:支持高效排序和查找。

特点

  • 适合排行榜、延时队列。
  • 按分数范围查找 O(log n)。

6. Bitmap(位图)

简介

  • 基于字符串的二进制位操作。
  • 最大长度:512MB(约 2^32 位)。

常用命令

命令 说明
SETBIT key offset value 设置某个位
GETBIT key offset 获取某个位
BITCOUNT key 统计位为 1 的数量
BITOP op destkey key1 key2... 位运算

特点

  • 内存占用极小,适合布尔统计(签到、活跃用户)。
  • 位操作 O(1)。

7. HyperLogLog

简介

  • 基于概率的数据结构,用于基数统计(去重计数)。
  • 占用固定内存:12KB
  • 误差:约 0.81%。

常用命令

命令 说明
PFADD key element1 [element2...] 添加元素
PFCOUNT key 获取基数估算值
PFMERGE destkey key1 key2... 合并计数

特点

  • 适合统计 UV(独立访问用户)。
  • 不能获取具体元素,只能估算数量。

8. Geospatial(地理位置)

简介

  • 基于 ZSet 实现的地理位置信息存储。
  • 支持位置添加、范围查询、距离计算。

常用命令

命令 说明
GEOADD key longitude latitude member 添加位置
GEODIST key member1 member2 [unit] 距离计算
`GEORADIUS key lon lat radius m km` 范围查询
GEOPOS key member 获取经纬度

特点

  • 底层用 GeoHash 编码 + ZSet 存储。
  • 适合附近的人/店铺功能。

9. Stream(流)

简介

  • 类似消息队列,按时间顺序存储消息。
  • 支持消费组,持久化。

常用命令

命令 说明
XADD key * field value 添加消息
XREAD COUNT n STREAMS key ID 读取消息
XGROUP CREATE key groupname id 创建消费组
XREADGROUP GROUP group consumer 消费组读取

特点

  • 适合日志流、事件流、实时数据处理。
  • 消息持久化存储,支持多消费者。

10. 数据结构对比表

类型 有序性 可重复性 底层结构 典型应用
String 可重复 SDS 缓存、计数器
List 可重复 quicklist 消息队列
Hash field 唯一 ziplist/hashtable 对象存储
Set 不可重复 intset/hashtable 标签、去重
ZSet 按 score 排序 成员唯一 skiplist+hashtable 排行榜
Bitmap 位索引 N/A bit array 签到、活跃统计
HyperLogLog N/A N/A HLL UV 统计
Geo 按位置排序 成员唯一 GeoHash+ZSet 附近的人
Stream 按时间排序 可重复 radix tree 日志流