redis缓存击穿

解释:我们把一些资源放在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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值