Redis典型应用场景

用法 数据结构 关键命令 核心场景
消息队列 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有序集合 和散列一样,用于存储键值对 字符串成员与浮点数分数之间的有序映射;元素的排列顺序由分数的大小决定;包含方法有添加、获取、删除单个元素以及根据分值范围或成员来获取元素

image.png

Redis数据结构

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

String

介绍

String 是最基本的 key-value 结构,key 是唯一标识,value 是具体的值,value其实不仅是字符串, 也可以是数字(整数或浮点数),value 最多可以容纳的数据长度是 512M

image.png

内部实现

String 类型的底层的数据结构实现主要是 int 和 SDS(简单动态字符串)。

SDS 和我们认识的 C 字符串不太一样,之所以没有使用 C 语言的字符串表示,因为 SDS 相比于 C 的原生字符串: