Laravel 缓存

配置

Laravel为各种缓存后端提供了一个富有表现力的统一API。缓存配置位于config/cache.php。在此文件中,我们可以指定希望在整个应用程序中默认使用哪个缓存驱动程序。Laravel默认支持流行的缓存后端,例如MemcachedRedis

缓存配置文件还包含其他各种选项,这些选项记录在文件中,因此请务必仔细阅读这些选项。默认情况下,Laravel配置为使用file缓存驱动程序,该驱动程序将序列化的缓存对象存储在文件系统中。对于较大的应用程序,建议您使用功能更强大的驱动程序,例如Memcached或Redis。您甚至可以为同一驱动程序配置多个缓存配置。

驱动程序先决条件

数据库

使用database缓存驱动程序时,您将需要设置一个表以包含缓存项。在下面示例中创建了一个Schema:

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

Memcache

使用Memcached驱动程序需要安装Memcached PECL软件包。您可以在config/cache.php配置文件中列出所有的Memcached服务器:

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

您也可以将host选项设置为UNIX套接字路径。如果这样做,则应将port选项设置为0:

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

Redis

在Laravel中使用Redis缓存之前,您将需要通过PECL安装PhpRedis PHP扩展或通过Composer安装predis/predis软件包(〜1.0 )。

有关配置Redis的更多信息,请参阅其Laravel使用Redis


使用缓存

获取缓存实例

Illuminate\Contracts\Cache\FactoryIlluminate\Contracts\Cache\Repository 接口提供了访问Laravel缓存的服务。Factory接口提供对为您的应用程序定义的所有缓存驱动程序的访问。Repository接口是由我们在cache配置文件中指定的应用程序的默认高速缓存驱动器的实现。

但是,也可以使用Cache Facade,这是我们在本文档中将使用的Facade 。该Cache Facade提供了对Laravel缓存访问的快速便捷的方法:

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Cache;

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

        //
    }
}

访问多个缓存存储

可以通过使用Cache Facade的store方法访问各种缓存存储。传递给store方法的key应对应在cache配置文件的配置数组中列出的存储之一:

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

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

从缓存中检索数据

Cache Facade的get方法用于从缓存中检索项目。如果该项目在缓存中不存在,将返回null。可以将第二个参数传递给get方法,以指定您希望在项目不存在时返回的默认值:

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

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

您甚至可以传递一个Closure作为默认值。如果指定的项目在缓存中不存在,则返回Closure中返回的结果。传递闭包可让我们延迟从数据库或其他外部服务中检索默认值:

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

检查项目是否存在

has方法可以用于确定在高速缓存中是否存在项目。如果值为null将返回false:

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', $seconds, function () {
    return DB::table('users')->get();
});

如果该项目在缓存中不存在,则将执行传递给remember方法的Closure,并将其返回的结果放入缓存中。

您可以使用rememberForever方法从缓存中检索项目或将其永久存储:

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

检索并删除

如果需要从缓存中检索项目然后删除该项目,则可以使用pull方法。与get方法类似,如果该项目在缓存中不存在,则将返回null:

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

将项目存储在缓存中

可以使用Cache Facade 中的put方法将项目存储在缓存中:

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

如果没有将存储时间传递给该put方法,则将无限期存储该项目:

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

除了传递秒数(而不是整数)之外,还可以传递一个DateTime实例,该实例代表缓存项的到期时间:

Cache::put('key', 'value', now()->addMinutes(10));

如果不存在则存储

如果缓存存储中尚不存在指定的数据,则add方法会将其添加到缓存中。如果该项目实际上已添加到缓存中,则该方法将返回true。否则,该方法将返回false:

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

永久存储

forever方法可以用于将项目永久地存储在高速缓存中。由于这些项目不会过期,因此必须使用forget方法将其从缓存中手动删除:

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

如果使用的是Memcached驱动程序,则当缓存达到其大小限制时,“永久”存储的项目可能会被删除。

从缓存中删除项目

可以使用forget方法从缓存中删除项目:

Cache::forget('key');

还可以通过提供零或负的TTL来删除项目:

Cache::put('key', 'value', 0);

Cache::put('key', 'value', -5);

可以使用以下flush方法清除整个缓存:

Cache::flush();

缓存帮助函数

除了使用Cache Facade 或缓存接口外,还可以使用全局cache帮助函数通过缓存检索和存储数据。当cache只有单个字符串参数时,它将返回给定键的值:

$value = cache('key');

如果我们提供键/值对的数组以及该函数的过期时间,它会将值存储在缓存中,该值在缓存中的过期时间就是我们指定的:

cache(['key' => 'value'], $seconds);

cache(['key' => 'value'], now()->addMinutes(10));

如果cache不带任何参数,它将返回实现Illuminate\Contracts\Cache\Factory接口的类的实例,从而允许您调用其他缓存方法:

cache()->remember('users', $seconds, function () {
    return DB::table('users')->get();
});

添加自定义缓存驱动程序

编写驱动程序

要创建我们的自定义缓存驱动程序,我们首先需要实现Illuminate\Contracts\Cache\Store接口。因此,MongoDB缓存实现如下所示:

<?php

namespace App\Extensions;

use Illuminate\Contracts\Cache\Store;

class MongoStore implements Store
{
    public function get($key) {}
    public function many(array $keys) {}
    public function put($key, $value, $seconds) {}
    public function putMany(array $values, $seconds) {}
    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连接来实现所有这些方法。有关如何实现上述每种方法的示例,请查看Illuminate\Cache\MemcachedStore框架源代码中的。一旦我们的实现完成,我们就可以完成我们的自定义驱动程序注册。

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

注册驱动程序

要向Laravel注册自定义缓存驱动程序,我们将使用Cache Facade上的extend方法。可以在App\Providers\AppServiceProvider的boot方法中调用Cache::extend,或者您可以创建自己的service provider程序来注册扩展-只需不要忘记在config/app.php程序数组中注册provider:

<?php

namespace App\Providers;

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

class CacheServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Cache::extend('mongo', function ($app) {
            return Cache::repository(new MongoStore);
        });
    }
}

传递给该extend方法的第一个参数是驱动程序的名称。这将与config/cache.php配置文件中的dirver选项相对应。第二个参数是一个Closure,应该返回一个Illuminate\Cache\Repository实例。向Closure传递一个$app实例,该实例是service container的实例。

注册扩展名后,将config/cache.php配置文件的driver选项更新为新的扩展名。

查看笔记

扫码一下
查看教程更方便