redis互斥锁解决缓存雪崩问题

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个人

posted @ 2020-10-09 17:42  newmiracle宇宙  阅读(1670)  评论(0编辑  收藏  举报