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

原文地址:https://www.cnblogs.com/newmiracle/p/13787103.html