记录一下测试缓存穿透 击穿代码思路

缓存击穿

/**
     * 缓存击穿
     */
    public function cacheBreak(): ResponseInterface
    {
        $userid = 1;
        $where  = ['id' => $userid];
        $user   = redis('cache')->get('USER:' . $userid);
        if (empty($user)) {
            //数据不存在进行抢互斥锁
            if (redis('cache')->set('USER:LOCK:' . $userid, 1, ['nx', 'ex' => 180])) {
                //抢到锁的进行数据库查询
                $user = Db::table('user')->where($where)->first() ?? [];
                $user = serialize((array)$user);
                redis('cache')->set('USER:' . $userid, $user);
                //缓存之后删除锁
                redis('cache')->del('USER:LOCK:' . $userid);
            } else {
                //没有抢到锁的并发请求进行等待递归处理
                usleep(10000);
                self::cacheBreak();
            }
        }
        return $this->success(unserialize($user));
    }

缓存穿透

    /**
     * 缓存穿透
     */
    public function cacheWare(): ResponseInterface
    {
        $userid = 1;
        $where  = ['id' => $userid];
        $user   = redis('cache')->get('USER:' . $userid);
        if (empty($user)) {
            $user = Db::table('user')->where($where)->first() ?? [];
            $user = serialize((array)$user);
            redis('cache')->setex('USER:' . $userid, 300, $user);
        }

        return $this->success(unserialize($user));
    }
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!