Redis缓存雪崩、缓存穿透、缓存预热、缓存倾斜、缓存穿刺击穿、缓存更新、缓存降级 等解决方案
-雪崩
缓存中大量数据短时间到期,然后短时间内不同人在访问这些数据,导致高并发(穿刺是某一条数据的高并发,雪崩是很多不同数据最终高并发,当然雪崩也有可能包含穿刺的数据)访问数据库
解决:
1.设置不同的到期时间,将缓存的失效时间分散开,这样每一个缓存的过期时间的重复率就会降低,就很难引发大量的缓存集体性失效的事件。
2.大多数系统设计者考虑:用加锁或者队列的方式,来保证同一时间内不会有大量的线程,同时对数据库进行读写,从而避免 数据库崩溃掉。
-穿透
查询数据库中不存在的数据,因为数据库中不存在,所以缓存中肯定没有,所有的请求都会落在数据库上面,若高并发的话,数据库就奔溃了
解决
1.我们一般都是主键查询,其他查询走搜索,主键如果是自增的,可将当前数据库的主键最大值放缓存,然后修改流程为先查询缓存,有的话返回,没有的话先比较查询的主键和缓存中放的最大值,小于等于最大值就代表在数据库中然后继续流程
2.若主键不是自增的,就将所有的主键提出来放入redis的set中,然后上面的流程改为先查询缓存,有的话则返回,没有的话先判断查询的主键在不在set中,在就查询数据库,不在返回
3.采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从