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

  • 相关阅读:
    XML 约束
    XML 高级
    XML 基础
    XML系列【目录】
    Java11 新特性
    Java10 新特性
    Java9 新特性 (二)语法改进
    Java9 新特性 (一)新增特性
    第一章:Class 文件结构
    java面试题全集(上)--java基础
  • 原文地址:https://www.cnblogs.com/newmiracle/p/13787103.html
Copyright © 2020-2023  润新知