缓存

    Laravel 给多种缓存系统提供丰富而统一的 API,缓存配置信息位于 ,在这个文件中你可以为你的应用程序指定默认的缓存驱动,Laravel 支持当前流行的缓存系统,如非常棒的 和 Redis

    缓存配置信息文件中也包括很多其他选项,你可以在文件中找到这些选项,请确保你看过这些选项说明。Laravel 默认使用将序列化缓存对象保存在文件系统中的 file 缓存驱动,对于大型应用程序而言,推荐你使用如 Memcached 或者 Redis 这样更强大的缓存驱动。你甚至可以为一个驱动配置多个缓存配置信息。

    数据库

    当使用 database 缓存驱动时,你需要配置一个用来存放缓存项的数据库表,下面是一个 Schema 数据表结构声明的示例:

    Memcached

    使用 Memcached 驱动需要安装 Memcached PECL 扩展包 。你可以把所有 Memcached 服务器都列在 config/cache.php 这个配置信息文件中:

    1. 'memcached' => [
    2. [
    3. 'host' => '127.0.0.1',
    4. 'port' => 11211,
    5. 'weight' => 100
    6. ],
    7. ],

    你也可以把 host 选项配置到 UNIX 的 socket 路径中。如果你这样配置了,port 选项应该设置为 0

    1. 'memcached' => [
    2. [
    3. 'host' => '/var/run/memcached/memcached.sock',
    4. 'port' => 0,
    5. ],
    6. ],

    Redis

    在使用 Redis 作为 Laravel 的缓存驱动前,你需要通过 Composer 安装 predis/predis 扩展包 (~1.0) 。
    关于配置 Redis 的更多信息,请参考 Laravel 文档页面

    缓存的使用

    获取一个缓存实例

    Illuminate\Contracts\Cache\FactoryIlluminate\Contracts\Cache\Repository 提供了访问 Laravel 缓存服务的机制。Factory contract 则为你的应用程序定义了访问所有缓存驱动的机制。Repository contract 是典型的用 cache 配置信息文件指定你的应用程序默认缓存驱动的实现。

    然而,你也可以使用 Cache facade,我们将在文档的后续中介绍。Cache facade 提供了方便又简洁的方法访问缓存实例:

    1. <?php
    2. namespace App\Http\Controllers;
    3. use Illuminate\Support\Facades\Cache;
    4. class UserController extends Controller
    5. {
    6. /**
    7. * Show a list of all users of the application.
    8. *
    9. * @return Response
    10. */
    11. public function index()
    12. {
    13. $value = Cache::get('key');
    14. //
    15. }
    16. }

    访问多个缓存仓库

    使用Cache facade,可通过 store 方法来访问缓存仓库,传入 store 方法的键应该对应一个缓存配置信息文件中的 stores 配置信息数组中列出的配置值:

    1. $value = Cache::store('file')->get('foo');
    2. Cache::store('redis')->put('bar', 'baz', 10);

    从缓存中获取项目

    Cache facade 中的 get 方法用来从缓存中获取缓存项,如果缓存中不存在该缓存项,返回 null 。你也可以向 get 方法传递第二个参数,用来指定缓存项不存在时返回的默认值:

    1. $value = Cache::get('key');

    你甚至可以将 闭包 作为默认值传递。如果指定的缓存项在缓存中不存在,闭包 的结果将被返回。传递一个闭包允许你延迟从数据库或外部服务中取出默认值:

    1. $value = Cache::get('key', function() {
    2. return DB::table(...)->get();
    3. });

    确认项目是否存在

    1. if (Cache::has('key')) {
    2. //
    3. }

    递增与递减值

    递增递减 方法可以用来调整缓存中整数项目值。这两个方法都可以传入一个可选的第二个参数,用来指示要递增或递减多少值:

    获取和更新

    有时你可能会想从缓存中取出一个项目,但也想在取出的项目不存在时存入一个默认值,例如,你可能会想从缓存中取出所有用户,或者当用户不存在时,从数据库中将这些用户取出并放入缓存中,你可以使用 Cache::remember 方法实现:

    1. $value = Cache::remember('users', $minutes, function() {
    2. return DB::table('users')->get();
    3. });

    如果缓存项在缓存中不存在,则返回给 remember 方法的闭包将会被运行,而且闭包的运行结果将会被存放在缓存中。

    获取和删除

    如果你需要从缓存中获取一个缓存项然后删除它,你可以使用 pull 方法。像 get 方法一样,如果缓存项在缓存中不存在,null 将被返回:

    1. $value = Cache::pull('key');

    你可以使用 Cache facade 的 put 方法来存放缓存项到缓存中,当你在缓存中存放缓存项时,你需要使用第三个参数来设定缓存的存放时间:

    1. Cache::put('key', 'value', $minutes);

    如果要指定一个缓存项过期的分钟数,你也可以传递一个 DateTime 实例来表示该缓存项过期的时间点:

    1. $expiresAt = Carbon::now()->addMinutes(10);
    2. Cache::put('key', 'value', $expiresAt);

    写入目前不存在的项目

    add 方法只会把暂时不存在于缓存中的缓存项放入缓存,如果存放成功将返回 true ,否则返回 false

    1. Cache::add('key', 'value', $minutes);

    永久写入项目

    forever 方法可以用来将缓存项永久存入缓存中,因为这些缓存项不会过期,所以必须通过 forget 方法手动删除:

    1. Cache::forever('key', 'value');

    {tip} 如果你在使用 Memcached 驱动,那么当缓存达到大小限制时,那些「永久」保存的缓存项可能被移除。

    从缓存中移除项目

    你可以使用 forget 方法从缓存中移除一个项目:

    1. Cache::forget('key');

    也可以使用 flush 方法清空所有缓存:

    {note} 缓存标签并不支持使用 filedababase 的缓存驱动。此外,当在缓存使用多个标签并「永久」写入时,类似 memcached 的驱动性能会是最佳的,且会自动清除旧的纪录。

    写入被标记的缓存项

    缓存标签允许你在缓存中标记关联的项目,并清空所有已分配指定标签的缓存值。你可以通过传入一组标签名称的有序数组,以访问被标记的缓存。举例来说,让我们访问一个被标记的缓存并 put 值给它:

    1. Cache::tags(['people', 'artists'])->put('John', $john, $minutes);
    2. Cache::tags(['people', 'authors'])->put('Anne', $anne, $minutes);

    若要获取一个被标记的缓存项,只要传递一样的有序标签列表至 tags 方法,然后通过你希望获取的值对应的键来调用 get 方法:

    1. $john = Cache::tags(['people', 'artists'])->get('John');
    2. $anne = Cache::tags(['people', 'authors'])->get('Anne');

    移除被标记的缓存项

    你可以清空已分配的单个标签或是一组标签列表中的所有缓存项。例如,下方的语句会把被标记为 peopleauthors,或两者都标记了的缓存都移除。所以,AnneJohn 都会被从缓存中移除:

    1. Cache::tags(['people', 'authors'])->flush();

    相反的,下方的语句只会删除被标示为 authors 的缓存,所以 Anne 会被移除,但 John 不会:

      增加自定义的缓存驱动

      写驱动

      为了创建自定义的缓存驱动,首先我们需要部署 Illuminate\Contracts\Cache\Store contract 。所以 MongoDB 缓存实现看起来会像这样:

      1. <?php
      2. namespace App\Extensions;
      3. use Illuminate\Contracts\Cache\Store;
      4. class MongoStore implements Store
      5. {
      6. public function get($key) {}
      7. public function many(array $keys);
      8. public function put($key, $value, $minutes) {}
      9. public function putMany(array $values, $minutes);
      10. public function increment($key, $value = 1) {}
      11. public function decrement($key, $value = 1) {}
      12. public function forever($key, $value) {}
      13. public function forget($key) {}
      14. public function flush() {}
      15. public function getPrefix() {}
      16. }

      我们只需要通过一个 MongoDB 的连接来实现这些方法。关于如何实现这些方法,可以查看框架源代码中的 Illuminate\Cache\MemcachedStore 。一旦我们的部署完成,我们就可以完成自定义驱动的注册了。

      1. Cache::extend('mongo', function($app) {
      2. return Cache::repository(new MongoStore);
      3. });

      通过 Laravel 注册自定义缓存驱动,我们将用到 Cache facade 的 extend 方法。Cache::extend 的调用会在最新的 Laravel 应用程序默认的 App\Providers\AppServiceProviderboot 方法中完成。或者你可以创建你自己的服务提供者来放置这些扩展 - 不要忘记在 config/app.php 提供者数组中注册提供者:

      1. <?php
      2. namespace App\Providers;
      3. use App\Extensions\MongoStore;
      4. use Illuminate\Support\Facades\Cache;
      5. use Illuminate\Support\ServiceProvider;
      6. class CacheServiceProvider extends ServiceProvider
      7. {
      8. /**
      9. * Perform post-registration booting of services.
      10. *
      11. * @return void
      12. */
      13. public function boot()
      14. {
      15. Cache::extend('mongo', function($app) {
      16. return Cache::repository(new MongoStore);
      17. });
      18. }
      19. /**
      20. * Register bindings in the container.
      21. *
      22. * @return void
      23. */
      24. public function register()
      25. {
      26. //
      27. }

      传递给 extend 方法的第一个参数是驱动名称。这取决于你的 config/cache.php 配置信息文件的 driver 选项。第二个参数为一个应该返回 Illuminate\Cache\Repository 实例的闭包。这个闭包将传递一个 service container$app 实例。

      一旦你的扩展被注册,就可以轻松的更新 config/cache.php 配置信息文件的 选项为你的扩展名称。

      为了在每一次缓存操作时执行代码,你可以监听缓存触发的事件 事件 。一般来说,你必须将这些事件监听器放置在 EventServiceProvider

      译者署名


      {note} 欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。

      转载请注明:本文档由 Laravel China 社区 [laravel-china.org] 组织翻译,详见 翻译召集帖