缓存雪崩:因为缓存失效导致数据未加载到内存中,或者缓存时间大面积地失效,从而导致所有请求都会去查数据库,导致数据库、CPU和内存负载过高,甚至宕机。
1.超热数据设置为永久key
2、优化过期时间设置方案:不同类的数据设置不同的过期时间,每个key的时间都为当前类的过期时间+一个随机值
比如 A类90分钟 B类80分钟
那A001设置为90+随机值 ,B001设置为80+随机值。避免大量的 key 在同一时刻同时失效,造成缓存雪崩。
3、使用分布式锁重建缓存
当缓存不存在时,加锁,高并发下,只允许一个请求去数据库获取,获取完重新放入缓存。
分布式环境下使用Redis 分布式锁实现缓存重建,优点是设计思路简单,对数据一致性有保障;缺点是代码复杂度增加,有可能会造成用户等待。假设在高并发下,缓存重建期间 key 是锁着的,如果当前并发 1000 个请求,其中 999 个都在阻塞,会导致 999 个用户请求阻塞而等待。
4、双层缓存
redis与数据库之间再加一层 本地缓存ehcache,redis瞬间大部分数据过期,还可以从ehcache获取,撑一段时间
6、限流,降级策略
牺牲一部分请求,降低服务器压力