laravel 基础教程 —— 缓存

缓存

配置

Laravel 对多样缓存系统提供了合并的 API。缓存的配置文件存放在
config/cache.php。你可以在那么些文件中指定整个应用默许使用何种缓存驱动。Laravel
协助当前主流的缓存系统如 Memcached 和 Redis。

缓存的布局文件也带有了一些外加的布局选项,这几个选取在文件中都有文档注释,你应该保险自身曾经读了那几个拔取注释。暗中认同的,Laravel
配置使用 file
缓存驱动,该驱动会在文件系统中贮存连串化的缓存对象。对于大型应用,提议选拔内存级的缓存,如
Memcached 恐怕 APC。你仍然足以在 laravel
中布局多种缓存配置到同样的驱动。

缓存先决条件

数据库

当使用 database
缓存驱动时,你须求建立一个表来包括那个缓存项。你能够依照下边的 Schema
定义来建立表文件:

Schema::create('cache', function ($table) {
  $table->string('key')->unique();
  $table->text('value');
  $table->integer('expiration'); 
});

你也足以因此选拔 php artisan cache:table Artisan
命令来生成正确的缓存表结构迁移。

Memcached

采纳 Memcached 缓存须求设置 Memcached PECL
package

暗许的布置基于
Memcached::addServer
使用 TCP/IP:

'memcached' => [
  [
    'host' => '127.0.0.1',
    'port' => 11211,
    'weight' => 100
  ]
],

你也得以接纳 UNIX socket 路径来设置 host。若是您那样做,你要求安装
port0:

'memcached' => [
  [
    'host' => '/var/run/memcached/memcached.sock',
    'port' => 0,
    'weight' => 100
  ],
],

Redis

在您使用 Redis 缓存以前,你需求先经过 Composer 安装 predis/predis
关于越多的 Redis 配置消息,你可以参考 Laravel documentation
page

缓存使用

取得缓存实例

Illuminate\Contracts\Cache\Factory
Illuminate\Contracts\Cache\Repository 契约提供对 Laravel
缓存服务的造访。Factory
契约提供了选取中兼有缓存驱动的概念。Repository 契约日常是一个基于你的
cache 配置文件所使用的私行认同缓存驱动的完成。

骨子里,你也可以动用 Cache 假面,在这篇文档中,大家都是利用 Cache
假面进行举例。Cache 假面提供了一种便利简单的艺术来做客 Laravel
底层缓存契约的贯彻。

比如说,让大家引入 Cache 假面到控制器:

<?php

namespace App\Http\Controllers;

use Cache;

class UserController extends Controller 
{
  /**
   * Show a list of all users of the application.
   *
   * @return Response
   */
   public function index()
   {
     $value = Cache::get('key');

     //
   }
}

走访各类缓存存储

您可以经过 Cache 假面的 store 方法来访问各种缓存存储。传递到 store
方法的 key 应该与您的 cache 配置文件中的 stores
配置项的列表之一相匹配:

$value = Cache::store('file')->get('foo');

Cache::store('redis')->put('bar', 'baz', 10);

取得缓存项

您可以因此选用 Cache 假面的 get
方法来从缓存中拿走相关项的值。倘诺该项在缓存中并不设有,则赶回 null
。借使你须要,你也足以传递第三个参数到 get
方法,这一个参数所传递的值会在缓存中项不存在时被重临:

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

$value = Cache::get('key', 'default');

你还可以传递 Closure 作为默许值。如若缓存的项不设有,Closure
所重返的值将被做为暗中认同值。传递闭包的法子得以使您从数据库可能其余外部服务中延迟获取暗中同意值:

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

自笔者批评项是否存在

您可以采纳 has 方法来检查缓存中是不是存在该项:

if (Cache::has('key')) {
  //
}

递增/递减项中的值

您可以行使 incrementdecrement
方法来调动缓存项目中的整型值。这多个章程都足以承受一个数组作为首个参数来开展对应的数值调整:

Cache::increment('key');

Cache::increment('key', $amount);

Cache::decrement('key');

Cache::decrement('key', $amount);

追寻或更新缓存中的项

偶尔,你恐怕希望从缓存中寻找出一个类型,然而当该项不设有的时候,你也想囤积一个专断认同值到该项。比如,你希望从缓存中摸索出一个用户。但是他并不存在,所以你需求从数据库中获拿到他,然后添加到缓存中。你可以使用
Cache::remember 方法来形成这么些:

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

设若缓存中从不检索到该项,传递到 remeber
方法中的闭包将会被实施并且其实施结果将会在缓存中展开沟通。

你也得以统一 rememberforever 方法:

$value = Cache::rememberForever('users', function () {
  return DB::table('users')->get(); 
});

探寻并删除

一旦你必要摸索一个档次,并在寻觅到的同时从缓存中去除该项,你可以使用
pull 方法。就像 get 方法一致,若是未搜索到该项,将会重回 null :

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

积存项目到缓存

您可以选取 Cache 假面的 put
方法来囤积项目到缓存中。当您存储一个项到缓存中时,你要求指定一个该项要求被缓存的分钟值:

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

除却传递一个数值作为缓存过期的分钟值,你也足以经过传递一个 PHP
DateTime 实例来设置缓存的失灵时间:

$expiresAt = Carbon::now()->addMinutes(10);

Cache::put('key', 'value', $expiresAt);

add
方法只会在对应的项在缓存中不设有时才会被添加进缓存。该方法会在类型被添加到缓存后归来
true。否则再次来到 false

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

forever 方法可以用来将品种永久的增加进缓存。该值唯有手动的行使
forget 方法才能被移除:

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

从缓存中移除项目

您可以拔取 Cache 假面的 forget 方法来从缓存中移除某项:

Cache::forget('key');

您可以采用 flush 方法来擦除具备的缓存:

Cache::flush();

擦除缓存并不会依据前缀来开展智能擦除,它会移除所有的缓存。所以一旦您的选择和任何的选拔共享缓存,你应该谨慎的使用该办法。

缓存标签

留神: 缓存标签并不支持 file 或者 database
缓存驱动。其它,对于将多种标签标记为永久存储的驱动,品质最好的是力所能及提供自动清除过期记录的驱动,比如
memcached

储存标记了的花色到缓存

缓存标签允许你将有关的品类进展关联标记。并且同意一次性清除所有给定标签的缓存项。你可以由此有序的竹签数组来访问被标记的缓存项目。比如,让我们走访被标记的品种并动用
put 方法来设置缓存值:

Cache::tags(['people', 'artists'])->put('John', $john, $minutes);

Cache::tags(['people', 'authors'])->put('Anne', $anne, $minutes);

实际,你并没有被限制只利用 put
方法。你可以在标签中动用任意的缓存存储方法。

访问被标记的缓存项

为了访问被标记了的缓存项,你需求传递相应的不变列表到 tags 方法:

$john = Cache::tags(['people', 'artists'])->get('John');

$anne = Cache::tags(['people', 'authors'])->get('Anne');

您可以三回性的擦除分配的标志只怕标记列表中的所有项。比如,你可以应用
flush 方法来删除所有的 peopleauthors
标签和双面结合的逐步列标签里的装有缓存项。所以,AnneJohn
都会被从缓存中移除:

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

上面的口舌将会作为地方语句的相比较,将只会从缓存中去除 authors
标签的类型,所以 Anne 会被删除,而 John 被保留:

Cache::tags('authors')->flush();

添加自定义的缓存驱动

为了在自定义的缓存驱动中继续 laravel 的缓存。大家需求利用 Cache 假面的
extend
方法,该方式被用来绑定自定义缓存到底层管理中。日常这个都以在劳务提供者中做到。

比如,注册一个新的缓存驱动并取名为 ‘mongo’:

<?php

namespace App\Providers;

use Cache;
use App\Extensions\MongoStore;
use Illuminate\Support\ServiceProvider;

class CacheServiceProvider extends ServiceProvider
{
  /**
   * Perform post-registration booting of services.
   *
   * @return void
   */
   public function boot()
   {
     Cache::extend('mongo', function ($app) {
       return Cache::repository(new MongoStore);
     });
   }

   /**
    * Register bindings in the container.
    *
    * @return void
    */
    public function register()
    {
      //
    }
}

首个被传送到 extend 方法中的参数应该是驱动的名目。这几个称呼应当和您的
config/cache.php 配置文件中的 driver
选项一致。而第四个参数是一个闭包,该闭包应该回到一个
Illuminate\Cache\Repository 的已毕。在闭包上将会被传送一个 $app
实例,这些实例是 laravel 中的服务容器的实例。

Cache::extend 方法的调用应该在 App\Providers\AppServiceProvider
boot
方法中形成。可能你可以创立本身的劳务提供者来存储那些扩充。不过不用忘记在
config/app.php 文件中展开挂号。

为了创立大家友好的缓存驱动,大家先是需求完结
Illuminate\Constracts\Cache\Store 契约的接口。所以,大家的 MongoDB
缓存达成应有看起来像那样:

<?php

namespace App\Extensions;

class MongoStore implements \Illuminate\Contracts\Cache\Store
{
  public function get($key) {}
  public function put($key, $value, $minutes) {}
  public function increment($key, $value = 1) {}
  public function decrement($key, $value = 1) {}
  public function forever($key, $value) {}
  public function forget($key) {}
  public function flush() {}
  public function getPrefix() {}
}

作者们只有须要利用 MongoDB
连接来落实这几个点子。一旦我们的完成形成,大家就足以成功自个儿的缓存驱动的登记:

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

然后在 config/cache.php 配置文件中创新驱动为的名称 driver
为您的增加的称呼。

假定你在为自定义的缓存文件应当存放在何地而猜疑,你可以设想将其揭橥到
Packagist!或许,你可以在 app 目录中创建一个 Extensions
命名空间。事实上,你应该谨记,laravel
并不呆板的范围你的目录结构,你应当可以依照自身的习惯自由的管住你的运用目录结构。

事件

假如您想在任何缓存被操作时进行额外的代码,你恐怕要求监听缓存的触发事件。日常的您应该存放那么些事件监听器到你的
EventServiceProvider:

/**
 * The event listener mappings for the application.
 *
 * @var array
 */
 protected $listen = [
  'Illuminate\Cache\Events\CacheHit' => [
    'App\Listeners\LogCacheHit',
  ],
  'Illuminate\Cache\Events\CacheMissed' => [
    'App\Listeners\LogCacheMissed',
  ],
  'Illuminate\Cache\Events\KeyForgotten' => [
    'App\Listeners\LogKeyForgotten',
  ],
  'Illuminate\Cache\Events\KeyWritten' => [
    'App\Listeners\LogKeyWritten',
  ],
 ];

相关文章