分布式缓存
缓存
查询缓存
为什么需要缓存?
为了系统性能的提升,我们一般都会将数据放入缓存中,加速访问,而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-Aside:业务代码围绕Cache编写,由业务代码维护缓存
- 读场景 先从缓存中获取,没有查询到,再从SoR中获取,再放入到缓存中
- 写场景 先将数据写到SoR中,执行成功以后立即同步写入到缓存中
【分布式缓存】Cache-As-SoR: 把Chache当做一个SoR,所有的操作都是对Cache进行,然后委托SoR进行数据的真实读写,即业务代码只看到Cache的操作,看不到关于SoR的代码有三种实现的方式
- read-through
- write-through
- write-behind
推荐阅读
- 不废话,代码实践带你掌握|不废话,代码实践带你掌握 强缓存、协商缓存!
- 深入浅出谈一下有关分布式消息技术(Kafka)
- 15、IDEA学习系列之其他设置(生成javadoc、缓存和索引的清理等)
- springboot使用redis缓存
- 缓存有关的配置和属性
- KubeDL HostNetwork(加速分布式训练通信效率)
- 实操Redission|实操Redission 分布式服务
- 分布式|《Python3网络爬虫开发实战(第二版)》内容介绍
- 2021年行业社群孵化的分布式商业趋势
- 啥是负载均衡、高并发、分布式、集群()