redis互斥锁解决缓存雪崩问题
刚1000个人并发 突然redis缓存失效 那全部打入数据库
解决方法 就是redis写个互斥锁 缓存失效的时候 先锁住 等有缓存了 再解锁 比方说第一个人 加锁 加缓存 999个人就可以直接读取缓存了 这样就不会1000个人读取数据库了
public function getcacheinfo($sql, $zhanwei = '', $key = '', $expire = 20, $debug = 0) { if (empty($key)) { if (!empty($zhanwei)) { $strs = join($zhanwei, '&'); } else { $strs = ''; } $key = md5($sql . $strs); } //连接本地的 Redis 服务 $redis = /RedisClient::getInstance(); $result = $redis->get($key); // 获取存储的数据 if (empty($result)) { //redis锁表 防止缓存穿透 // $redis = /RedisClient::getInstance(); $fangwen = $redis->get($key . '_fangwen'); //只允许50个人 if ($fangwen >= 50) { $this->commonajax1(322); } else { $redis->incr($key . '_fangwen'); } while (1) { $is_lock = /RedisClient::lock($key.'suo', 2); //如果已经抢占锁了 可以继续往下执行 if ($is_lock) { break; } } $redis->decr($key . '_fangwen'); $redis = /RedisClient::getInstance(); $result = $redis->get($key); if (empty($result)) { $result = $this->commongetinfo($sql, $zhanwei, $debug); $redis->set($key, serialize($result), $expire); } else { $result = unserialize($result); } /RedisClient::unlock($key.'suo'); return $result; } else { $result = unserialize($result); return $result; } }
ps:我这里限制了抢占锁的人数 50个人
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/tech/database/4019.html