分布式缓存

缓存 查询缓存 为什么需要缓存?

为了系统性能的提升,我们一般都会将数据放入缓存中,加速访问,而db承担数据落盘的工作
缓存存在的问题
缓存穿透
  • 缓存穿透是指查询一个一定不存在数据,由于缓存没有命中,将去查询数据库,但是数据库也没有这条记录,并且处于容错的考虑,我们没有讲这次的查询写入到缓存中,这将导致这个不存在数据每次请求都要到存储层去查询,失去了缓存的意义.在流量很大的时候,可能DB就挂掉了,有人利用这个不存在的key频繁攻击我的应用,这就是漏洞.
解决: 空结果进行缓存,但是他的过期时间很短,最长不超过五分钟
缓存雪崩
  • 缓存是指在我们设置缓存的时候采用了相同的过期时间,导致缓存在同一时刻失效了,请求全部转发到DB,DB瞬间压力过重雪崩.
解决: 原有的失效时间基础上增加一个随机值,比如1-5分钟随机值,这样一个缓存的过期时间的重复率会降低,很难引发群体失效的事件
缓存击穿
  • 对于一些设置了过期时间的key,如果这些key可能会在某些时间点被超高并发地访问,是一种非常"热点"的数据.这个时候,如果这个key在大量请求进来的时候,正好失效,那么所有对这个key的数据查询都落到db,和缓存雪崩的区别是:
    • 击穿是一个热点key失效
    • 雪崩是很多key集体失效
解决: 分布式锁
什么是分布式锁?
分布式缓存
文章图片
原理图,使用redisson 缓存的使用模式 缓存使用模式分为两大类
  • Cache-Aside
  • Cache[^是SoRDE 快照数据,Cache的访问速度比SoR要快,放入Cache的目的是提升系统的速度] As SoR[^ 记录系统,或者可以叫做数据源,实际存储数据的系统]
回源: 回到数据源头去检索数据,Cache没有命中需要回到SoR读取数据
Cache-Aside:业务代码围绕Cache编写,由业务代码维护缓存
  • 读场景 先从缓存中获取,没有查询到,再从SoR中获取,再放入到缓存中
  • 写场景 先将数据写到SoR中,执行成功以后立即同步写入到缓存中
【分布式缓存】Cache-As-SoR: 把Chache当做一个SoR,所有的操作都是对Cache进行,然后委托SoR进行数据的真实读写,即业务代码只看到Cache的操作,看不到关于SoR的代码有三种实现的方式
  • read-through
  • write-through
  • write-behind

    推荐阅读