Redis 一些使用场景

数据缓存

将热点数据放到内存中,设置内存的最大使用量以及过期淘汰策略来保证缓存的命中率。

缓存雪崩和缓存击穿

  • 雪崩:如果大量的key过期时间设置的过于集中,到过期的那个时间点,Redis可能会出现短暂的卡顿现象。严重的话会出现缓存雪崩,我们一般需要在时间上加一个随机值,使得过期时间分散一些。
  • 击穿:大量的请求都不存在缓存中,直接查询了数据库

大数据量去重

boolfilter

原理

当一个元素加入集合时,通过K个散列函数将这个元素映射成一个位数组中的K个点,并置为1。查找的时候,只要这几个位点存在一个0,则一定不存在;如果都为1,则该元素可能存在

应用场景

  • 缓存穿透:每次查询都直接打到数据库,没有使用缓存
  • 爬虫过滤:将采集下来的url放在集合中,每次采集前先查询一遍

bitmap

优缺点

优点
  • 省空间,使用bit存储
  • 操作快,读为O(1),写为O(n)
  • 方便扩容,方便计算
缺点
  • 限制在512MB内,最大为2^32位

使用场景

  1. 用户在线状态
  2. 统计活跃用户
  3. 用户签到

轻量级分布式锁

  • 互斥性: 使用 setnx 抢占锁。
  • 避免永远不释放锁: 使用 expire 加一个过期时间,避免一直不释放锁,导致阻塞。
  • 原子性: setnxexpire 必须合并为一个原子指令,避免 setnx 后,机器崩溃,没来得及设置 expire,从而导致锁永不释放。

计数器

支持很频繁的读写操作

应用限流

进行流量降级

消息队列

  • list
  • stream
  • zset 用时间戳做score,内容做key,消费者使用 zrangebyscore 消费N秒之前的数据,延时队列

排行榜、点赞、投票

使用 ZSET 数据类型。

查找表

可以将Session,用户信息等放进来

自动补全

时间线

ID生成、短网址

ID生成

  1. 使用 incrincrby 生成

短网址

  1. 为目标网站生成新的数字ID,可以使用 incrincrby 生成
  2. 十进制数字转换成36进制数字来创建短网址
  3. 短网址作为key,目标网址作为value放入哈希表中