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

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/4019.html

(0)
上一篇 2021年7月16日
下一篇 2021年7月16日

相关推荐

发表回复

登录后才能评论