tonglin0325的个人主页

Redis学习笔记——应用场景

redis共有5种基本数据类型:

String(可以是字符串,整数或者浮点数)

Hash(哈希,Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)

Redis Hash 类型底层有两种编码格式:ziplist、hashtable,当哈希对象同时满足以下两种条件时,对象使用 ziplist 编码;不能满足则使用 hashtable 编码。

  • 哈希对象保存的所有键值对的键和值的字符串长度都小于 64 字节;
  • 哈希对象保存的键值对数量小于 512 个。

这里是可以由使用者自定义进行控制的,redis提供了这么几个参数:

hash-max-ziplist-value 64 // ziplist中最大能存放的值长度

hash-max-ziplist-entries 512 // ziplist中最多能存放的

List(列表)

Set(集合)、

Zset(有序集合)

随着 Redis 版本的更新,后面又支持了四种数据类型: BitMap(2.2 版新增)、HyperLogLog(2.8 版新增)、GEO(3.2 版新增)、Stream(5.0 版新增)

参考:16个 Redis 常见使用场景

1.string(字符串)#

1.session#

在多个应用之间共享数据

2.cache#

热点数据缓存

3.分布式锁#

只有redis的key不存在的时候,才能获得这个锁

2.string(数值类型)#

1.counter#

int类型,incr方法,例如:文章的阅读量、微博点赞数、允许一定的延迟,先写入Redis再定时同步到数据库

2.限流器#

int类型,incr方法,以访问者的ip和其他信息作为key,访问一次增加一次计数,超过次数则返回false

3.全局ID生成器#

场景:用于保证分库分表之后主键的全局唯一性,参考:10丨发号器:如何保证分库分表后 ID 的全局唯一性?

3.hash#

1.购物车#

选择 hash 的话,每个用户的购物车对应一个 hash 对象,field 存的是skuID,value 存的是购物车单种sku总量。hash 的底层编码是 ziplisthashtable

除了hash,其它的数据类型,都需要 get 出来计算后 set 回去,有的还需保存加入购物车时间 来排序。用来做购物车还是可以的,就是有点小麻烦,也没有充分利用 Redis 的数据类型(充分利用的话性能有很大的优势);而 hash 就不一样了,我们满足它以 ziplist编码的条件,它就是**有序的了 ,不需要额外计算,可以直接使用 Redis 命令来完成对购物车的维护,性能上无疑达到了最优**。

参考:SpringBoot2 | 第二十九篇:Redis 实现购物车

4.bitmap#

1.在线用户统计,留存用户统计#

因为bit非常节省空间(1 MB=8388608 bit),可以用来做大数据量的统计。

Redis的位图就是一个由二进制位组成的数组, 通过将数组中的每个二进制位与用户 ID 进行一一对应, 我们可以使用位图去记录每个用户是否在线。

参考:使用redis中的位图(bitmap)统计在线人数

5.list#

1.消息队列#

使用LPUSH指令来进行入列操作,使用RPOP指令来进行出列操作

参考:Redis系列14:使用List实现消息队列

6.zset#

1.排行榜#

参考:redis zset实现排行榜

2.最近浏览功能#

使用redis的list和zset都可以实现

list实现参考:使用 Redis 缓存来实现用户最近浏览的商品列表

zset实现参考:如何实现类似知乎的功能查看最近1000条记录呢?

参考:Redis经典案例场景