Redis 支持多种数据类型,每种类型适用于不同的业务场景。以下是 Redis 常用数据类型及其典型应用场景的总结:
一、五种常用数据类型
1. 字符串(String)
-
特点:
最基础的数据类型, 用于存储简单的键值对。可存储任意格式的数据(文本、二进制、序列化对象),最大支持 512MB。 -
应用场景:
- 缓存:存储热点数据(如页面内容、用户会话)。
SET user:1001:name "Alice"
- 计数器:文章阅读量、库存扣减、点赞数等。
INCR article:views:1001
- 分布式锁:通过
SETNX
实现简单锁机制。SETNX lock:resource "1"
- 短链存储:Key 为短码,Value 为原始 URL。
SET short:abc123 "https://example.com"
- 缓存:存储热点数据(如页面内容、用户会话)。
2. 哈希(Hash)
- 特点:
键值对集合,适合存储对象或结构化数据,支持字段级别的增删改查。 - 应用场景:
- 用户信息存储:将用户属性(如 name、age)存储在一个 Hash 中。
HSET user:1001 name "Alice" age 25
- 购物车管理:记录用户购物车中的商品及数量。
HSET cart:uid product_id_1 2
- 配置管理:动态更新配置字段(如系统参数)。
HSET config:site theme "dark"
- 用户信息存储:将用户属性(如 name、age)存储在一个 Hash 中。
3. 列表(List)
-
特点:
双向链表结构,支持两端插入/弹出操作,实现队列或栈。
用于存储一系列有序的字符串元素。 -
应用场景:
- 消息队列:生产者用
LPUSH
,消费者用RPOP
或BRPOP
。LPUSH queue:task "task1" BRPOP queue:task 0
- 最新消息排行:存储微博的 Timeline 或新闻的最新 N 条数据。
LPUSH news:latest "Article A" LRANGE news:latest 0 9
- 分页查询:通过
LRANGE
获取历史记录的分页数据。
- 消息队列:生产者用
4. 集合(Set)
-
特点:
存储无序的、唯一的字符串集合,支持交集、并集、差集等操作。 -
应用场景:
- 标签系统:通过集合运算实现标签的组合与过滤。
SADD tags:article1 "redis" "database" SINTER tags:article1 tags:article2
- 好友关注系统:存储用户的粉丝列表和共同关注。
SADD followers:user1 userA userB SDIFF followers:user1 followers:user2
- 抽奖池:随机选取不重复的用户。
SRANDMEMBER users:pool 5
- 标签系统:通过集合运算实现标签的组合与过滤。
5. 有序集合(Sorted Set)
- 特点:
每个元素关联一个分数(score),按分数排序,支持范围查询。 - 应用场景:
- 排行榜:游戏积分榜、热门文章排名。
ZADD leaderboard 1000 userA 950 userB ZRANGE leaderboard 0 -1 WITHSCORES
- 定时任务调度:按时间戳排序待执行任务。
ZADD tasks:pending 1719523200 task1 ZRANGEBYSCORE tasks:pending -inf $(date +%s)
- 排行榜:游戏积分榜、热门文章排名。
二、特殊数据类型
1、位图(Bitmaps)
- 特点:
位图操作,每个位(bit)存储 0 或 1,节省空间。
用于存储二进制数据,可以进行位级别的操作,如设置、清除、取反等。
适用于统计活跃用户、签到情况等场景。
- 应用场景:
- 用户活跃统计:记录用户每日登录状态(1 表示登录)。
SETBIT user:1001:2025-06-28 1 BITCOUNT user:1001:2025-06-28
- 用户活跃统计:记录用户每日登录状态(1 表示登录)。
2、超日志(HyperLogLog)
- 特点:
用于提供在统计学上独特的元素数量的近似计算。
非常适合于大规模数据集的去重计数,且在内存占用上非常高效。 - 应用场景:
- UV 统计:估算网站独立访问用户数。
PFADD uv:2025-06-28 user1 user2 PFCOUNT uv:2025-06-28
- UV 统计:估算网站独立访问用户数。
3、地理空间索引(Geospatial Indexes)
- 特点:
存储地理坐标,支持距离计算和范围查询。 - 应用场景:
- 附近的人:查找附近的商家或用户。
GEOADD locations 116.397428 39.90923 "Beijing" GEORADIUS locations 116.397428 39.90923 100 km
- 附近的人:查找附近的商家或用户。
4、流(Streams)
- 特点:
高性能的消息流数据结构,用于存储消息序列,支持消息持久化、消息消费确认等功能。
适用于需要持久化日志和消息队列的场景。
- 应用场景:
- 日志收集:实时采集和处理系统日志。
XADD logs * message "Error: Disk full" XREAD STREAMS logs 0
- 日志收集:实时采集和处理系统日志。
三、总结对比
数据类型 | 结构特点 | 典型场景 | 示例命令 |
---|---|---|---|
String | 简单键值对 | 缓存、计数器、分布式锁 | SET , INCR , SETNX |
Hash | 字段-值集合 | 对象存储、购物车 | HSET , HGET |
List | 双向链表 | 消息队列、分页 | LPUSH , LRANGE |
Set | 无序唯一集合 | 标签、抽奖、交集 | SADD , SINTER |
Sorted Set | 分数排序集合 | 排行榜、定时任务 | ZADD , ZRANGE |
Bitmap | 位图 | 用户活跃、签到 | SETBIT , BITCOUNT |
HyperLogLog | 基数估算 | UV 统计 | PFADD , PFCOUNT |
Geo | 地理坐标 | 附近的人 | GEOADD , GEORADIUS |
Stream | 消息流 | 日志采集 | XADD , XREAD |
四、选择建议
- 简单存储:优先使用 String 或 Hash。
- 有序集合:需要排序的场景(如排行榜)选择 Sorted Set。
- 去重集合:使用 Set 或 HyperLogLog。
- 消息队列:List 或 Stream。
- 空间优化:Bitmap 或 HyperLogLog。
根据业务需求选择合适的数据类型,可充分发挥 Redis 的高性能优势!