![f3c46ecaa628fb5c2e0ffa3c408ed3bc.png](https://i-blog.csdnimg.cn/blog_migrate/61b46a991c6a6ae75a9507b1d3ad5745.jpeg)
一 缓存穿透
缓存穿透指的是,当我们访问某个缓存KEY想取得对应的数据时,若此KEY不存在于缓存中,则会去查库。如何解决呢?将每次查询的结果都放入缓存不管是不是空。
public function getArticles($key)
{
$expire = 60 * 3;
$data = Cache::get($key);
//注意:此处使用is_null来判断而不是直接使用 (!$data)来判断。
//使用 (!$data)来判断的弊端是:如果$data的值为空字符串或者空数组,此处也是不成立的,会继续执行查询DB的语句,造成缓存穿透
if (!is_null($data)) {
return $data;
}
$data = $this->searchDB();
Cache::put($key, $data, $expire);
return $data;
}
这样处理的原因是,即使当前查询的key为空字符串,或者空数组,结果也会被缓存起来。当下一次访问时会直接返回,不会造成缓存穿透
二 缓存加锁(Redis)
若系统的并发很高,当缓存过期时,则大量的请求会穿透缓存&#