乐闻世界logo
搜索文章和话题

Redis 支持哪些数据结构?它们的使用场景和底层实现是什么?

2月19日 19:37

Redis 支持多种数据结构,每种数据结构都有其特定的使用场景和底层实现:

1. String(字符串)

底层实现:使用 SDS(Simple Dynamic String)实现,类似于 C 语言的字符串,但增加了长度信息和空间预分配。

使用场景

  • 缓存用户信息、配置信息
  • 计数器(INCR、DECR 命令)
  • 分布式锁
  • Session 存储

常用命令:SET、GET、INCR、DECR、MGET、MSET、SETEX 等

2. Hash(哈希)

底层实现:当元素较少时使用 ziplist(压缩列表),当元素较多时使用 hashtable(哈希表)。

使用场景

  • 存储对象(如用户信息)
  • 购物车
  • 文章点赞数统计

常用命令:HSET、HGET、HMGET、HGETALL、HINCRBY、HDEL 等

3. List(列表)

底层实现:当元素较少时使用 ziplist,当元素较多时使用 linkedlist(双向链表)或 quicklist。

使用场景

  • 消息队列
  • 最新列表(如最新文章)
  • 时间轴
  • 栈和队列操作

常用命令:LPUSH、RPUSH、LPOP、RPOP、LRANGE、LLEN、LTRIM 等

4. Set(集合)

底层实现:使用 intset(整数集合)或 hashtable 实现。

使用场景

  • 标签系统
  • 共同关注/共同好友
  • 抽奖系统
  • 去重

常用命令:SADD、SREM、SMEMBERS、SISMEMBER、SINTER、SUNION 等

5. ZSet(有序集合)

底层实现:使用 skiplist(跳跃表)和 hashtable 的组合,hashtable 用于快速查找,skiplist 用于排序。

使用场景

  • 排行榜
  • 延时队列
  • 优先级队列
  • 范围查询

常用命令:ZADD、ZREM、ZRANGE、ZREVRANGE、ZRANK、ZSCORE 等

6. Bitmap(位图)

底层实现:基于 String 类型实现,每个 bit 位表示一个状态。

使用场景

  • 用户签到统计
  • 在线用户统计
  • 布隆过滤器

常用命令:SETBIT、GETBIT、BITCOUNT、BITOP 等

7. HyperLogLog(基数统计)

底层实现:使用概率算法,占用 12KB 内存。

使用场景

  • 网站独立访客统计(UV)
  • 大数据去重统计

常用命令:PFADD、PFCOUNT、PFMERGE 等

8. Geo(地理位置)

底层实现:基于 ZSet 实现,使用 Geohash 算法。

使用场景

  • 附近的人
  • 距离计算
  • 位置服务

常用命令:GEOADD、GEODIST、GEOPOS、GEORADIUS 等

每种数据结构都有其特定的转换阈值,例如 Hash 和 List 在元素数量和大小超过一定阈值时会从 ziplist 转换为更复杂的数据结构,以平衡内存使用和性能。

标签:Redis