Redis中的生产问题 | 青训营笔记

85 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 12 天


Redis生产问题

缓存穿透

大量请求的 key 不存在于缓存中,也不存在于数据库中

  • 解决方法:首先做好参数校验,一些不合法的参数请求直接抛出异常信息返回给客户端。比如查询的数据库 id 不能小于 0、传入的邮箱格式不对的时候直接返回错误消息给客户端等等。
  • 布隆过滤器(Bloom Fliter)

缓存雪崩

缓存在同一时间大面积的失效,后面的请求都直接落到了数据库上,造成数据库短时间内承受大量请求。

  • 对于热点缓存:
    • 随机设置缓存的失效时间,避免同时失效
    • 缓存永不失效
  • Redis服务不可用:
    • 采用Redis集群,避免单个服务器出现问题导致整个缓存服务无法使用
    • 限流,避免同时处理大量请求

缓存击穿

缓存中没有但数据库中有的数据(一般是缓存时间过期)

  • 设置热点数据永不过期

Redis 数据淘汰机制

对于Redis来说,我们同样需要删除脏数据来释放内存,提高Redis性能。

Redis 通过一个叫做过期字典(可以看作是 hash 表)来保存数据过期的时间。

过期字典的键指向 Redis 数据库中的某个 key,过期字典的值是一个 long long 类型的整数,保存过期时间(毫秒精度的 UNIX 时间戳)。

对象回收策略

Redis回收过期对象的策略:定期删除+惰性删除

  • 惰性删除:当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key
  • 定期删除:由于惰性删除策略无法保证冷数据被及时删掉,所以Redis会定期主动淘汰一批已过期的key

内存淘汰机制

内存达到上限后的处理策略:

  1. noeviction:直接返回错误,不淘汰任何已经存在的redis键
  2. allkeys-random:随机删除redis键
  3. volatile-random:随机删除有过期时间的redis键
  4. volatile-ttl:删除快过期的redis键
  5. allkeys-lru:所有的键使用lru算法进行淘汰
  6. volatile-lru:有过期时间的使用lru算法进行淘汰
  7. volatile-lfu:根据lfu算法从有过期时间的键删除
  8. allkeys-lfu:根据lfu算法从所有键删除

如果你发现了文章出现了错误或有不足,欢迎在评论区和我交流,我看到了一定会回复。

写文章不易,如果你觉得文章对你有帮助,麻烦点一下点赞、收藏,你的支持是我写文章的最大动力!