Redis 五大基础数据类型学习笔记
Redis 常见的五种基础数据类型是 String、Hash、List、Set、ZSet。选型时重点考虑:是否需要按字段存储、是否有顺序、是否允许重复、是否需要按分数排序。
一、String(字符串)
特点: 一个 Redis Key 对应一个字符串值。这里的“字符串”本质上是二进制安全的数据,可以保存文本、数字或序列化后的数据。
常用命令:
SET app:order:count 10 # 设置值
GET app:order:count # 读取值
INCR app:order:count # 加 1
INCRBY app:order:count 5 # 加 5
DECR app:order:count # 减 1当值是合法整数时,可以使用 INCR、INCRBY 等命令进行原子计数。适合缓存简单数据、计数器等场景。
Key 命名规范: 推荐用冒号划分业务层级,例如 项目:服务:对象:ID,实际例子是 mall:order:detail:1001。这是约定俗成的命名方式,并非 Redis 强制要求。注意:Redis 的 Key 本身都是字符串,五种类型说的是 Value 的类型。
二、Hash(哈希)
特点: 一个 Redis Key 下可以包含多个 field → value,类似 Java 中的 Map<String, String>,适合存储对象的多个属性。
HSET user:1001 name "zhangsan" age 28
HGET user:1001 name
HGETALL user:1001
HINCRBY user:1001 age 1典型场景: 用户信息、商品属性等。更新一个字段时不需要重新写入整个对象。
三、List(列表)
特点: 有序、允许重复、可以从左右两端插入和弹出元素。
底层实现: 现代 Redis 主要使用 Quicklist(快速列表),可理解为由多个紧凑存储节点组成的双向链表,不宜简单说成“底层就是双向链表”。
LPUSH task:list a # 左侧入队
RPUSH task:list b # 右侧入队
LPOP task:list # 左侧弹出
RPOP task:list # 右侧弹出
BLPOP task:list 10 # 没有元素时最多阻塞等待 10 秒
BRPOP task:list 0 # 没有元素时一直等待应用方式:
栈(后进先出):
LPUSH + LPOP。队列(先进先出):
RPUSH + LPOP,或LPUSH + RPOP。简单阻塞队列: 生产者
RPUSH,消费者BLPOP。
重点纠错: BLPOP / BRPOP 是阻塞弹出,即队列为空时等待其他客户端放入元素;超时后如果仍无元素,会返回空结果,不会在超时时自动 PUSH,也不会自动 POP 一个不存在的元素。超时时间单位为秒,0 表示无限等待。
List 可以实现简单队列;需要消息确认、消费组和更强可靠性时,通常考虑 Redis Streams 或 RabbitMQ 等消息组件。
四、Set(集合)
特点: 无序、元素唯一、不允许重复,和 Java 的 Set 概念类似。
SADD user:tags:1001 java redis docker
SISMEMBER user:tags:1001 redis # 判断元素是否存在
SMEMBERS user:tags:1001 # 获取全部元素
SINTER group:a group:b # 交集
SUNION group:a group:b # 并集
SDIFF group:a group:b # 差集典型场景: 标签去重、共同好友、共同兴趣等。
底层纠错: Redis Set 不是树结构。根据 Redis 版本和数据特征,可以采用整数集合(intset)、哈希表(hashtable),部分较新版本还支持紧凑的 listpack 编码。
五、ZSet(有序集合 / Sorted Set)
特点: 每个唯一成员(member)对应一个分数(score),Redis 按分数排序。成员不能重复,但分数可以相同,适合排行榜、按权重排序等场景。
假设要做用户积分排行榜:
ZADD rank:score 100 user:1 200 user:2 150 user:3
ZINCRBY rank:score 20 user:1
ZRANGE rank:score 0 99 REV WITHSCORES
ZREVRANK rank:score user:1
ZSCORE rank:score user:1
ZRANGE rank:score 100 200 BYSCORE对应含义:
注意: ZREVRANK 返回的排名从 0 开始,业务展示“第几名”通常需要加 1。ZRANGE 默认按分数从低到高排序,加上 REV 才是高分在前。老写法 ZREVRANGE key 0 99 WITHSCORES 仍可使用;Redis 6.2 起推荐掌握统一的 ZRANGE ... REV 语法。
