Redis 数据类型

Redis 数据类型全解析(2025 最新版)

Redis 不是“键值对”,而是“键 + 丰富数据结构”!
掌握 10 大数据类型,你就能用最少代码实现复杂业务。


一、Redis 5 大基础类型 + 5 大高级类型

类型英文用途典型场景
StringSTRING最常用缓存、计数器、分布式锁
HashHASH存储对象用户信息、商品属性
ListLIST双向链表消息队列、最新列表
SetSET无序集合标签、抽奖、共同好友
Sorted SetZSET有序集合排行榜、延迟队列
BitmapBITMAP位图签到、活跃用户统计
HyperLogLogHLL基数统计UV 统计(百万级误差 <1%)
GeoGEO地理位置附近的人、门店查询
StreamSTREAM日志流消息队列、日志收集
JSONReJSONJSON 文档配置、复杂对象(模块)

二、详细解析 + 命令 + 实战示例


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"

三、数据类型选择对照表

需求推荐类型原因
缓存 JSONString简单
缓存对象Hash节省内存
消息队列List / StreamStream 更强
排行榜Sorted Set自动排序
去重Set自动去重
UV 统计HyperLogLog省内存
签到Bitmap极省内存
附近的人Geo内置算法

四、内部编码一览(优化必知)

类型可能编码切换阈值
Stringint embstr raw>44字节 → raw
Hashziplist hashtable>512条或值>64字节
Listziplist linkedlist>512条
Setintset hashtable>512或非整数
ZSetziplist 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 {}

下一步推荐

  1. Redis 高级命令
  2. 数据持久化
  3. 分布式锁实战

需要我给你 “秒杀系统完整代码(ZSET + Lua)”?回复 秒杀 就行!

文章已创建 2481

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部