解释:我们把一些资源放在redis缓存中,用户访问资源直接从redis拿,缓存过期了同时有大量的用户同时访问资源那么就会直接访问数据库,造成数据库直接卡死。
解决办法:互斥锁;当我们用户访问缓存的时候,发现没有数据,然后获取互斥锁,请求数据库资源,放入redis缓存里。其他用户访问时发现有这个互斥锁就不再去请求数据库。
基于laravel框架
public function index(){
//当我们走缓存的时候请求数据发现数据过期了 然后 很多请求同时走mysql
// 第一步先判断redis的数据有没有
// 第二步判断一下互斥锁有没有
// 第三步 没有的话去创建互斥锁 拿数据 设置数据过期时间
// 第四步 有的话等待
//实例化redis
$key = 'REDIS_TEST';
$value = Redis::get($key);
if($value == "") {
$redis = Redis::connection();
$redisLock = new RedisLock($redis, $key."_lock", 10,'LOCK_REDIS_VALUE');
// 获取互斥锁
if( $redisLock->acquire()){
$value = "123456"; //数据库获取资源
// sleep(5);
//更新缓存
Redis::setex($key,60,$value);
//释放锁
$redisLock->release();
echo $value;
}else{
// 或者等待5秒在去请求缓存
echo '缓存正在进行';
}
}else{
echo $value;
}
exit;
}
1964

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



