Laravel 缓存驱动解析

访问量较大的站点中,关键数据的展示有时候不是实时更新的,用户在访问这些数据的时候如果每次都从数据库中调取,则会浪费很多不必要的资源!
加上缓存的话,则会让数据的读取更快,同时大大减少了资源的浪费!缓存就这么因运而生了。

首先我们先来看下如何正确的使用缓存!

缓存更新的套路

大多人的思路是在有新数据加入的时候,删除原有缓存,更新数据库,在将新数据放入缓存中去!
然而!这个逻辑是有漏洞的。试想如果两个并发操作同时进来,一个更新操作,一个查询操作,更新操作删除缓存之后,查询操作没有命中缓存,将原有数据查询放入缓存中去,然后更新操作更新了数据库!
这就导致缓存数据是原来的老数据,并且一直会这样下去!

更新缓存

四种Design Pattern:

  1. Cache aside
  2. Read through
  3. Write through
  4. Write behind caching

最常用是是第一种 Cache aside .具体逻辑如下:

  • 失效 先从cache中去数据,没取到则去DB中取出来,在放入cache中去
  • 命中 从cache中取到数据返回
  • 更新 更新DB,更新成功之后再让cache失效

这种pattern其实也是有极小的概率会出现脏数据的。不过外部设置缓存过期时间则会减少这种情况的出现!

其余几种pattern这里不介绍了,详细请看参考链接

laravel 中使用缓存

框架自带了缓存配置,可以在config/cache.php中配置具体的缓存功能

常用的方法

创建缓存

1
Cache::put('key', 'value', 10);//键名、值、过期时间(分钟)

此外,我们也可以用 remember() 方法自动获取和更新一个缓存值。该方法首先检查 键名 是否存在,如果已经创建则返回结果。否则它会创建新的 键名 ,并用闭包返回结果进行赋值,就象下面:

1
2
3
Cache::remember('articles', 15, function() {
return Article::all();
});

参数 15 是要缓存的分钟数。这样的话,我们甚至根本不必检查缓存是否过期。Laravel 不仅会替我们打理,而且会获取或重新生成该缓存,不需要我们显式地告诉它如何操作。

检索缓存

在更新或者取回缓存值之前判断这个缓存的key是否存在是很有必要的,使用 has() 方法就可以实现:

1
2
3
4
5
if (Cache::has('key')){
Cache::get('key');
} else {
Cache::put('key', $values, 10);
}

删除缓存

1
2
3
4
5
6
7
Cache::forget('key');

#我们也可以检索缓存值并删除它。我喜欢把这个称为一次性缓存:
$articles = Cache::pull('key');

#使用以下命令在缓存过期前就把所有缓存清楚掉:
$ php artisan cache:clear

Controller 中使用缓存

1
2
3
4
5
6
public function index() {
$articles = Cache::remember('articles', 22*60, function() {
return Article::all();
});
return response()->json($articles);
}

参考链接

  1. 知乎
  2. 酷壳