| 用法 | 数据结构 | 关键命令 | 核心场景 |
|---|---|---|---|
| 消息队列 | List/Stream | LPUSH/BRPOP, XADD/XREAD | 异步任务、削峰、解耦 |
| 分布式计数 | String | INCRBY, DECRBY | 点赞数、库存、访问量 |
| 限流 | String + TTL/ZSET | INCR, EXPIRE, ZADD | API限流、防刷、流量控制 |
| 分布式锁 | String | SET NX PX, DEL | 秒杀、库存扣减、互斥操作 |
| 排行榜 | Sorted Set | ZADD, ZINCRBY, ZREVRANGE | 游戏排名、销量排行、积分系统 |
| 实时系统 | Pub/Sub | PUBLISH, SUBSCRIBE | 实时聊天、消息推送、通知 |
| 布隆过滤器 | Bloom Filter | BF.ADD, BF.EXISTS | 缓存穿透、垃圾过滤、URL去重 |
| 会话存储 | String/Hash | HSET, HGETALL, EXPIRE | 分布式登录、用户状态、购物车 |
| 分布式ID | String | INCR, INCRBY | 订单ID、用户ID、日志ID |
| 延迟队列 | Sorted Set | ZADD, ZRANGEBYSCORE | 超时取消、定时提醒、延迟重试 |
我们都知道 Redis 提供了丰富的数据类型,常见的有五种:String(字符串),Hash(哈希),List(列表),Set(集合)、Zset(有序集合)。
随着 Redis 版本的更新,后面又支持了四种数据类型:BitMap(2.2 版新增)、HyperLogLog(2.8 版新增)、GEO(3.2 版新增)、Stream(5.0 版新增)。
| 结构类型 | 结构存储的值 | 结构的读写能力 |
|---|---|---|
| String字符串 | 可以是字符串、整数或浮点数 | 对整个字符串或字符串的一部分进行操作;对整数或浮点数进行自增或自减操作; |
| List列表 | 一个链表,链表上的每个节点都包含一个字符串 | 对链表的两端进行push和pop操作,读取单个或多个元素;根据值查找或删除元素; |
| Set集合 | 包含字符串的无序集合 | 字符串的集合,包含基础的方法有看是否存在添加、获取、删除;还包含计算交集、并集、差集等 |
| Hash散列 | 包含键值对的无序散列表 | 包含方法有添加、获取、删除单个元素 |
| Zset有序集合 | 和散列一样,用于存储键值对 | 字符串成员与浮点数分数之间的有序映射;元素的排列顺序由分数的大小决定;包含方法有添加、获取、删除单个元素以及根据分值范围或成员来获取元素 |

| 数据类型 | 说明 |
|---|---|
| String | 一种二进制安全的数据类型,可以用来存储任何类型的数据比如字符串、整数、浮点数、图片(图片的 base64 编码或者解码或者图片的路径)、序列化后的对象。 |
| List | Redis 的 List 的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销。 |
| Hash | 一个 String 类型的 field-value(键值对) 的映射表,特别适合用于存储对象,后续操作的时候,你可以直接修改这个对象中的某些字段的值。 |
| Set | 无序集合,集合中的元素没有先后顺序但都唯一,有点类似于 Java 中的 HashSet 。 |
| Zset | 和 Set 相比,Sorted Set 增加了一个权重参数 score,使得集合中的元素能够按 score 进行有序排列,还可以通过 score 的范围来获取元素的列表。有点像是 Java 中 HashMap 和 TreeSet 的结合体。 |
String 是最基本的 key-value 结构,key 是唯一标识,value 是具体的值,value其实不仅是字符串, 也可以是数字(整数或浮点数),value 最多可以容纳的数据长度是 512M。

String 类型的底层的数据结构实现主要是 int 和 SDS(简单动态字符串)。
SDS 和我们认识的 C 字符串不太一样,之所以没有使用 C 语言的字符串表示,因为 SDS 相比于 C 的原生字符串:
SDS 使用 len 属性的值而不是空字符来判断字符串是否结束,并且 SDS 的所有 API 都会以处理二进制的方式来处理 SDS 存放在 buf[] 数组里的数据。所以 SDS 不光能存放文本数据,而且能保存图片、音频、视频、压缩文件这样的二进制数据。len 属性记录了字符串长度,所以复杂度为 O(1)。*