redis之4缓存雪崩与缓存击穿与缓存穿透

前置

Mysql 做数据库 redis做缓存

缓存击穿

什么是缓存击穿

单个key过期,高并发访问这个key, 高并发直接访问数据库。

解决方案

分布式锁

只让一个请求去访问数据库

缓存穿透

什么是缓存穿透

简单描述:从业务接收查询的是你系统根本不存在的数据

复杂描述:缓存穿透是指用户查询数据,在数据库没有,自然在缓存中也不会有。这样就导致用户查询的时候, 在缓存中找不到对应key的value,每次都要去数据库再查询一遍,然后返回空(相当于进行了两次 无用的查询)。这样请求就绕过缓存直接查数据库

解决方案

采用布隆过滤器BloomFilter

将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定不存在的数据会被这个 bitmap 拦截掉,从而避免了对底层存储系统的查询压力。

要提前把数据放到布隆过滤器中。

缓存空值

如果一个查询返回的数据为空(不管是数据不存在,还是系统故障)我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。 通过这个直接设置的默认值存放到缓存,这样第二次到缓冲中获取就有值了,而不会继续访问数据库。

缓存雪崩

什么是缓存雪崩

如果缓存集中在一段时间内失效,发生大量的缓存穿透,所有的查询都落在数据库上,造成了缓存雪崩。 由于原有缓存失效,新缓存未到期间所有原本应该访问缓存的请求都去查询数据库了,而对数据库CPU 和内存造成巨大压力,严重的会造成数据库宕机

解决方案

分布式锁

击穿的解决方案。让一个请求去数据库里查,其他的等待。

数据预热

缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统。这样就可以避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题。用户直接查询事先被预热的缓存数据。可以通过缓存刷新机制,预先去更新缓存,再即将发生大并发访问前手动触发加载缓存不同的key。

双层缓存策略

C1为原始缓存,C2为拷贝缓存,C1失效时,可以访问C2,C1缓存失效时间设置为短期,C2设置为长期。

定时更新缓存策略

失效性要求不高的缓存,容器启动初始化加载,采用定时任务更新或移除缓存。

设置不同的过期时间

设置不同的过期时间,让缓存失效的时间点尽量均匀


redis之4缓存雪崩与缓存击穿与缓存穿透
http://hanqichuan.com/2022/05/17/redis/redis之4缓存雪崩与缓存击穿与缓存穿透/
作者
韩启川
发布于
2022年5月17日
许可协议