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

本文探讨了Redis缓存中的常见问题,包括雪崩、穿透、预热、倾斜、击穿及更新、降级等,并提供了相应的解决方案。针对雪崩,建议设置不同过期时间和使用加锁或队列。对于缓存穿透,可以通过主键查询优化、布隆过滤器或空值缓存来缓解。击穿解决方案包括分布式锁和设置热点数据永不过期。缓存倾斜问题可通过读写分离、数据分布和客户端缓存热点数据来解决。缓存预热则是预先加载数据到缓存系统,确保用户请求能直接获取。最后,缓存降级策略是为了保证核心服务可用,适时关闭非核心服务。

879

被折叠的 条评论
为什么被折叠?



