Redis 数据类型全解析(2025 最新版)
Redis 不是“键值对”,而是“键 + 丰富数据结构”!
掌握 10 大数据类型,你就能用最少代码实现复杂业务。
一、Redis 5 大基础类型 + 5 大高级类型
| 类型 | 英文 | 用途 | 典型场景 |
|---|---|---|---|
| String | STRING | 最常用 | 缓存、计数器、分布式锁 |
| Hash | HASH | 存储对象 | 用户信息、商品属性 |
| List | LIST | 双向链表 | 消息队列、最新列表 |
| Set | SET | 无序集合 | 标签、抽奖、共同好友 |
| Sorted Set | ZSET | 有序集合 | 排行榜、延迟队列 |
| Bitmap | BITMAP | 位图 | 签到、活跃用户统计 |
| HyperLogLog | HLL | 基数统计 | UV 统计(百万级误差 <1%) |
| Geo | GEO | 地理位置 | 附近的人、门店查询 |
| Stream | STREAM | 日志流 | 消息队列、日志收集 |
| JSON | ReJSON | JSON 文档 | 配置、复杂对象(模块) |
二、详细解析 + 命令 + 实战示例
1. String(字符串)—— 万能基础类型
| 命令 | 说明 |
|---|---|
SET key value | 设置 |
GET key | 获取 |
INCR/DECR key | 原子自增/自减 |
APPEND key "xx" | 追加 |
STRLEN key | 长度 |
MSET/MGET | 批量操作 |
实战:文章阅读量计数器
INCR article:1001:views
GET article:1001:views # 10086
内部编码:int / embstr / raw(>44字节转 raw)
2. Hash(哈希)—— 轻量级对象
适合存储 结构化对象,比 String 节省内存。
| 命令 | 说明 |
|---|---|
HSET user:1 name "张三" age 25 | 设置字段 |
HGET user:1 name | 获取 |
HGETALL user:1 | 获取全部 |
HINCRBY user:1 age 1 | 字段自增 |
HDEL user:1 age | 删除字段 |
实战:用户信息
HSET user:1001 name "李四" age 30 score 95.5
HINCRBY user:1001 score 5
HGETALL user:1001
# 1) "name" 2) "李四" 3) "age" 4) "30" 5) "score" 6) "100.5"
内存优化:小 Hash 用 ziplist,大 Hash 转 hashtable
3. List(列表)—— 双向链表
支持 队列 和 栈
| 命令 | 说明 |
|---|---|
LPUSH list a b c | 左插入 |
RPUSH list x y | 右插入 |
LPOP / RPOP | 出队 |
LRANGE list 0 -1 | 查看全部 |
BLPOP list 10 | 阻塞弹出(队列) |
实战:简单消息队列
# 生产者
LPUSH tasks "backup" "clean" "report"
# 消费者(阻塞)
BLPOP tasks 0
# 返回: 1) "tasks" 2) "report"
注意:避免大 List(>10万),会变慢!
4. Set(集合)—— 无序不重复
自动去重,适合 标签、抽奖
| 命令 | 说明 |
|---|---|
SADD myset a b c a | 添加(a 只存一次) |
SMEMBERS myset | 查看全部 |
SINTER set1 set2 | 交集(共同好友) |
SUNION set1 set2 | 并集 |
SRANDMEMBER myset 2 | 随机抽取 |
实战:抽奖系统
SADD lottery:2025 "u1" "u2" "u3" "u4"
SRANDMEMBER lottery:2025 1 # 随机中奖
SREM lottery:2025 u3 # 移除
5. Sorted Set(有序集合)—— 排行榜神器
每个成员有 分数(score),自动排序
| 命令 | 说明 |
|---|---|
ZADD rank 100 "张三" 95 "李四" | 添加 |
ZRANGE rank 0 2 WITHSCORES | 前3名 |
ZREVRANGE rank 0 2 | 倒序 |
ZINCRBY rank 5 "李四" | 加分 |
ZRANK rank "李四" | 排名 |
实战:实时游戏排行榜
ZADD game:score 1500 "player1" 2300 "player2" 1800 "player3"
ZREVRANGE game:score 0 2 WITHSCORES
# 1) "player2" 2) "2300" 3) "player1" 4) "1500"
6. Bitmap(位图)—— 极致省内存统计
用 位 存储布尔值,1KB = 838万用户!
| 命令 | 说明 |
|---|---|
SETBIT sign:2025:1001 0 1 | 用户1001第0天签到 |
GETBIT sign:2025:1001 0 | 是否签到 |
BITCOUNT sign:2025:1001 | 签到天数 |
BITOP AND res u1 u2 | 交集 |
实战:用户7天签到
SETBIT user:1001:sign 0 1 # 周一签到
SETBIT user:1001:sign 2 1 # 周三签到
BITCOUNT user:1001:sign # 返回 2
1亿用户每天签到 → 仅需 12MB 内存!
7. HyperLogLog —— UV 统计神器
误差 <1%,内存固定 12KB
| 命令 | 说明 |
|---|---|
PFADD page1:uv u1 u2 u3 u1 | 添加用户 |
PFCOUNT page1:uv | 获取 UV |
PFMERGE all:uv page1 page2 | 合并 |
实战:网站日 UV
PFADD page:home:20251112 "u1" "u2" "u3"
PFADD page:home:20251112 "u2" "u4"
PFCOUNT page:home:20251112 # ≈4
8. Geo —— 地理位置
基于 Sorted Set + Geohash
| 命令 | 说明 |
|---|---|
GEOADD cities 116.40 39.90 "北京" | 添加 |
GEODIST cities 北京 上海 | 距离(米) |
GEORADIUS cities 116.40 39.90 100 km | 附近城市 |
实战:附近的人
GEOADD users 116.40 39.90 "user1" 116.41 39.91 "user2"
GEORADIUS users 116.40 39.90 5 km
9. Stream —— 专业消息队列
类 Kafka,支持 消费者组、ACK、持久化
| 命令 | 说明 |
|---|---|
XADD mystream * sensor-id 123 temp 19.8 | 添加 |
XREAD COUNT 1 STREAMS mystream $ | 读取最新 |
XGROUP CREATE mystream group1 $ MKSTREAM | 创建消费者组 |
XREADGROUP GROUP group1 c1 COUNT 1 STREAMS mystream > | 消费 |
实战:日志收集
XADD logs * level error msg "DB down"
XREAD COUNT 1 STREAMS logs 0
10. JSON(ReJSON 模块)—— 复杂对象
需要安装模块:
RedisJSON
JSON.SET user:1 . '{"name":"王五","tags":["vip","beta"]}'
JSON.GET user:1 .name
JSON.ARRAPPEND user:1 .tags "new"
三、数据类型选择对照表
| 需求 | 推荐类型 | 原因 |
|---|---|---|
| 缓存 JSON | String | 简单 |
| 缓存对象 | Hash | 节省内存 |
| 消息队列 | List / Stream | Stream 更强 |
| 排行榜 | Sorted Set | 自动排序 |
| 去重 | Set | 自动去重 |
| UV 统计 | HyperLogLog | 省内存 |
| 签到 | Bitmap | 极省内存 |
| 附近的人 | Geo | 内置算法 |
四、内部编码一览(优化必知)
| 类型 | 可能编码 | 切换阈值 |
|---|---|---|
| String | int embstr raw | >44字节 → raw |
| Hash | ziplist hashtable | >512条或值>64字节 |
| List | ziplist linkedlist | >512条 |
| Set | intset hashtable | >512或非整数 |
| ZSet | ziplist skiplist | >128条或值>64字节 |
查看编码:
OBJECT ENCODING key
五、快速体验(一行一个类型)
SET s "hello"
HSET h f1 v1
LPUSH l a b c
SADD set x y x
ZADD z 1 a 2 b
SETBIT bit 0 1
PFADD hll u1 u2
GEOADD g 116 39 beijing
XADD stream * x 1
六、学习资源
- 官方文档:https://redis.io/docs/data-types/
- 交互式教程:https://try.redis.io
- Redis 大学:https://university.redis.com
完成!你已精通 Redis 10大数据类型!
# 一行命令查看所有类型示例
redis-cli --csv KEYS * | xargs -I {} redis-cli TYPE {}
下一步推荐:
需要我给你 “秒杀系统完整代码(ZSET + Lua)”?回复 秒杀 就行!