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 转换为更复杂的数据结构,以平衡内存使用和性能。