redis相关问题

1,158 阅读2分钟

redis理解

A.执行流程

缓存雪崩

A. 触发缓存雪崩的两种情况

  1. redis挂了,请求全走数据库
  2. 对缓存数据设置了相同的过期时间,导致某段时间,缓存全部同时失效,请求全走数据库

B. 解决方案

  1. 缓存的过期时间加上一个随机值,就可以减少缓存在同一时间过期。
  2. 假如redis真的挂啦,可以设置本地缓存+限流,避免redis挂了。假如挂了,redis持久化,重启后自动从磁盘上加载数据,快速恢复缓存数据。

缓存穿透

A. 触发缓存穿透情况

  1. 请求的数据在缓存大量不命中【负数】,导致请求走数据库。

B. 解决方案

  1. 因为请求参数是不合法,我们可以用过滤器进行拦截,不合法就不让这个请求到数据库层!
  2. 当数据库找不到,我们可以将空对象设置到缓存里面,下次请求从缓存中获取。【这个缓存时间可以设短一点】

缓存击穿

A. 触发缓存击穿情况

  1. 缓存在某个时间点过期的时候,恰好在这个时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。

B. 解决方案

  1. 使用互斥锁。在根据key获得的value值为空时,先锁上,再从数据库加载,加载完毕,释放锁。若其他线程发现获取锁失败,则睡眠50ms后重试。【容易造成死锁问题】
  2. 布隆过滤器,迅速判断一个元素是否在一个集合中。【将已存在的缓存放到布隆过滤器中,当黑客访问不存在的缓存时迅速返回避免缓存及DB挂掉。】

什么是缓存与数据库双写一致问题?

A.触发读写不一致的原因

  • 数据更新时,各种情况就会造成数据库和缓存的数据不一致了

B.解决方案

  • 先删除缓存,在更新数据库
    • 在高并发下表现不如意,在原子性被破坏时表现优异
  • 先更新数据库,再删除缓存(Cache Aside Pattern设计模式)
    • 在高并发下表现优异,在原子性被破坏时表现不如意

未完待续

参考掘金大佬博客