Cache

Configuration

Winter为各种缓存系统提供统一的API,缓存配置位于config/cache.php.在此文件中,您可以指定您希望在整个应用程序中默认使用的缓存驱动程序。流行的缓存系统,如MemcachedRedis 开箱即用。

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

Pre-requisites

Database

database 缓存驱动程序使用数据库代替文件系统。使用此类型不需要其他配置,因为数据库结构已经可用。

数据库缓存的性能可能不如使用专用缓存系统(如 Memcached 或 Redis)。对于高流量或 较大的应用程序,建议改用这些选项之一。

Memcached

使用 Memcached 缓存需要内存缓存 PECL 包 待安装。

默认配置使用基于 TCP/IPMemcached::addServer:

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

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

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

您甚至可以为故障转移指定多个 Memcached 服务器:

'memcached' => [
    'driver' => 'memcached',
    'servers' => [
        [
            'host' => '127.0.0.1',
            'port' => 11211,
            'weight' => 100
        ],
        [
            'host' => '127.0.0.2',
            'port' => 11211,
            'weight' => 90
        ],
    ],
],

Redis

如果你想使用默认predis 驱动程序,您将需要安装驱动插件.

您的应用程序的 Redis 配置位于config/database.php 配置文件。在此文件中,您将看到一个redis 包含您的应用程序使用的 Redis 服务器的数组:

'redis' => [

    'client' => 'predis',

    'default' => [
        'host'     => '127.0.0.1',
        'password' => null,
        'port'     => 6379,
        'database' => 0,
    ],

],

默认情况下,Redis 缓存功能将使用predis 客户端包通过 Redis 提供缓存能力。您也可以使用phpredis 作为客户端,它使用 PHPredis 扩大。这可以是通过 PECL 安装.

使用时predis,你可以定义一个options Redis 连接定义中的数组值,允许您指定一组 Predis客户端选项.

'redis' => [

    'client' => 'predis',
    'options' => [
        'cluster' => 'redis',
        'prefix'  => '',
    ],
    'default' => [
        'host'     => '127.0.0.1',
        'password' => null,
        'port'     => 6379,
        'database' => 0,
    ],

],

如果您的 Redis 服务器需要身份验证,您可以通过添加password 配置项添加到您的 Redis 服务器配置数组。

APCu

APCu 缓存驱动程序可以与APCu PECL 扩展.此缓存系统不需要配置,因为这是通过您配置的php.ini 配置。

亚马逊 DynamoDB

如果您希望使用 Amazon DynamoDB 作为缓存解决方案,则需要安装驱动插件.

Amazon DynamoDB 通过 Amazon Web Services 提供 API 驱动的缓存系统。 DynamoDB 的配置可以在dynamodb 的部分config/cache.php 文件。

'dynamodb' => [
    'driver'   => 'dynamodb',
    'key'      => '',
    'secret'   => '',
    'region'   => 'us-east-1',
    'table'    => 'cache',
    'endpoint' => '',
],

缓存使用

虽然大多数缓存由 Winter 在内部处理,Cache facade 提供了一些简单的方法来缓存你自己的数据。

从缓存中检索项目

get 上的方法Cache facade 用于从缓存中检索项目。如果该项目不存在于缓存中,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', $seconds, function() {
    return Db::table('users')->get();
});

如果该项目不存在于缓存中,则Closure 传给了remember 方法将被执行,其结果将被放入缓存中。

您也可以结合rememberforever 方法:

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

检索和删除

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

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

在缓存中存储项目

您可以使用put 上的方法Cache 在缓存中存储项目的门面。当您将一个项目放入缓存中时,您需要指定该值应该被缓存的秒数:

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

除了传递项目过期之前的秒数,您还可以传递一个 PHPDateTime 表示缓存项过期时间的实例:

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

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

NOTE: 我们推荐使用DateTime 用于定义所有到期长度的实例,以确保与 Winter CMS 的未来版本兼容。

add 方法只会将项目添加到缓存中,如果它不存在于缓存存储中。该方法将返回true 如果项目实际添加到缓存中。否则,该方法将返回false:

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

forever 方法可用于将项目永久存储在缓存中。这些值必须使用forget 方法:

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

从缓存中删除项目

您可以使用forget 上的方法Cache 正面:

Cache::forget('key');

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

Cache::flush();

刷新缓存才不是 遵守缓存前缀并将从缓存中删除所有条目。清除由其他应用程序共享的缓存时,请仔细考虑这一点。

豫ICP备18041297号-2