Redis 基本数据类型总结及使用场景
1. 字符串(String)
-
结构:最简单的键值对,支持文本、整数、浮点数或二进制数据(最大 512MB)。
-
常用命令:
SET
、GET
、INCR
、DECR
、APPEND
、SETNX
。 -
使用场景:
-
缓存:存储用户会话、页面内容等。
-
计数器:文章阅读量(
INCR
)、库存扣减(DECR
)。 -
分布式锁:通过
SETNX
实现简单锁机制。 -
短有效期数据:验证码(结合
EXPIRE
)。
-
2. 列表(List)
-
结构:双向链表,支持头部(Left)和尾部(Right)操作,元素可重复。
-
常用命令:
LPUSH
/RPUSH
、LPOP
/RPOP
、LRANGE
、BLPOP
(阻塞式弹出)。 -
使用场景:
-
消息队列:生产者通过
LPUSH
推送任务,消费者通过BRPOP
获取。 -
最新动态:存储用户最新发布的文章(如
LPUSH
+LTRIM
限制长度)。 -
分页查询:
LRANGE
分页获取历史记录。
-
3. 哈希(Hash)
-
结构:键值对集合,适合存储对象(如用户信息)。
-
常用命令:
HSET
、HGET
、HMSET
、HGETALL
、HINCRBY
。 -
使用场景:
-
对象存储:用户信息(
HMSET user:1 name "Alice" age 30
)。 -
部分更新:修改用户单个字段(
HSET user:1 age 31
)。 -
聚合统计:商品详情页的多属性缓存。
-
4. 集合(Set)
-
结构:无序且唯一的元素集合,支持交并差运算。
-
常用命令:
SADD
、SMEMBERS
、SINTER
(交集)、SUNION
(并集)、SISMEMBER
。 -
使用场景:
-
标签系统:用户兴趣标签(
SADD user:1:tags tech music
)。 -
去重:记录文章的唯一访问用户(
SADD article:100:views user:1
)。 -
共同好友:
SINTER user:1:friends user:2:friends
。
-
5. 有序集合(Sorted Set / ZSet)
-
结构:元素唯一,每个元素关联一个分数(Score),按分数排序。
-
常用命令:
ZADD
、ZRANGE
、ZREVRANGE
、ZRANK
、ZINCRBY
。 -
使用场景:
-
排行榜:游戏积分排名(
ZADD leaderboard 1000 "PlayerA"
)。 -
带权重队列:任务优先级调度(分数表示优先级)。
-
时间轴:按时间戳排序的动态(
ZADD timeline 1630000000 "event1"
)。
-
6. 其他扩展类型
6.1 位图(Bitmap)
-
底层:基于字符串的位操作,支持按位存取。
-
命令:
SETBIT
、GETBIT
、BITCOUNT
。 -
场景:用户签到记录(每天对应一个位)、活跃用户统计。
6.2 HyperLogLog
-
功能:基数统计(估算集合中不重复元素的数量)。
-
命令:
PFADD
、PFCOUNT
、PFMERGE
。 -
场景:统计 UV(独立访客数),误差率约 0.81%。
6.3 地理空间索引(Geospatial)
-
底层:基于有序集合实现,存储经纬度。
-
命令:
GEOADD
、GEODIST
、GEORADIUS
。 -
场景:附近的人、商家地理位置查询。
6.4 流(Stream)
-
功能:消息队列增强版,支持多消费者组、消息确认。
-
命令:
XADD
、XREAD
、XGROUP
。 -
场景:分布式日志、事件溯源(类似 Kafka)。
数据类型选择建议
需求 | 推荐类型 | 示例 |
---|---|---|
简单键值存储 | String | 缓存、计数器 |
对象属性存储 | Hash | 用户信息、商品详情 |
有序且可重复的数据集合 | List | 消息队列、最新动态列表 |
无序且唯一的数据集合 | Set | 标签、共同好友 |
需要排序的唯一数据集合 | Sorted Set | 排行榜、优先级队列 |
高效基数统计 | HyperLogLog | UV 统计 |
地理位置服务 | Geospatial | 附近的人、商家查询 |
复杂消息队列 | Stream | 订单日志、事件流处理 |
总结
-
优先根据业务逻辑选择数据结构,避免过度依赖字符串类型。
-
组合使用数据结构:例如用
Sorted Set
存储排行榜,再用Hash
缓存用户详情。 -
注意内存优化:例如小对象用
Hash
比多个String
更省内存。