redis相关问题
redis理解
A.执行流程
缓存雪崩
A. 触发缓存雪崩的两种情况
- redis挂了,请求全走数据库
- 对缓存数据设置了相同的过期时间,导致某段时间,缓存全部同时失效,请求全走数据库
B. 解决方案
- 缓存的过期时间加上一个随机值,就可以减少缓存在同一时间过期。
- 假如redis真的挂啦,可以设置本地缓存+限流,避免redis挂了。假如挂了,redis持久化,重启后自动从磁盘上加载数据,快速恢复缓存数据。
缓存穿透
A. 触发缓存穿透情况
- 请求的数据在缓存大量不命中【负数】,导致请求走数据库。
B. 解决方案
- 因为请求参数是不合法,我们可以用过滤器进行拦截,不合法就不让这个请求到数据库层!
- 当数据库找不到,我们可以将空对象设置到缓存里面,下次请求从缓存中获取。【这个缓存时间可以设短一点】
缓存击穿
A. 触发缓存击穿情况
- 缓存在某个时间点过期的时候,恰好在这个时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。
B. 解决方案
- 使用互斥锁。在根据key获得的value值为空时,先锁上,再从数据库加载,加载完毕,释放锁。若其他线程发现获取锁失败,则睡眠50ms后重试。【容易造成死锁问题】
- 布隆过滤器,迅速判断一个元素是否在一个集合中。【将已存在的缓存放到布隆过滤器中,当黑客访问不存在的缓存时迅速返回避免缓存及DB挂掉。】
什么是缓存与数据库双写一致问题?
A.触发读写不一致的原因
- 数据更新时,各种情况就会造成数据库和缓存的数据不一致了
B.解决方案
- 先删除缓存,在更新数据库
- 先更新数据库,再删除缓存(Cache Aside Pattern设计模式)
未完待续