记录一下测试缓存穿透 击穿代码思路
缓存击穿
/**
* 缓存击穿
*/
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));
}
推荐文章: