2021-10-13 12:33:57
Redis缓存雪崩、缓存穿透、缓存击穿的解决方法如下:
一、缓存雪崩的解决方法缓存雪崩指在某一时间段内,大量缓存集中失效,导致请求全部访问数据库,可能压垮数据库并使服务瘫痪。原因包括Redis服务器宕机或缓存数据设置了相同的过期时间。
缓存穿透指查询一定不存在的数据(如非法ID),由于未命中缓存且数据库中也不存在,导致每次请求都访问数据库,可能压垮数据库。
缓存击穿指高并发场景下,某个热门Key的缓存失效时,大量请求直接访问数据库,可能压垮数据库。与缓存雪崩的区别在于,缓存击穿针对单个热门Key。
加锁:生成随机值作为锁的值,设置锁的过期时间(如3分钟),避免死锁。
更新缓存:获取锁后从数据库查询数据并更新缓存。
释放锁:通过随机值判断锁的归属,避免误删其他请求的锁。
重试机制:未获取锁的请求等待后重试(如200毫秒),减少数据库压力。示例代码:
function lock($key, $random) { $redis = getRedis(); $ret = $redis->set($key, $random, ['nx', 'ex' => 3 * 60]); return $ret;}function unLock($key, $random) { $redis = getRedis(); if ($redis->get($key) == $random) { $redis->del($key); }}总结:缓存雪崩、穿透、击穿均可能导致数据库压力过大,需根据场景选择合适方案。缓存雪崩需避免集中失效,缓存穿透需过滤非法请求,缓存击穿需控制热点Key的并发访问。合理使用高可用、随机过期时间、布隆过滤器、互斥锁等策略可有效解决问题。