一、简介
在应用中,一些查询数据或处理任务的操作会在某段时间里短时间内大量进行,或是一个操作花费好几秒钟。当出现这种情况时,我们通常会将检索到的数据缓存起来,从而为后面请求同一数据的请求迅速返回结果。这些缓存数据通常会储存在极快的存储系统中,Laravel 提供了一个统一且简单易用的缓存系统。它支持多种缓存驱动,包括文件系统、数据库、Redis、Memcached 等。
Laravel 为各种缓存后端提供了富有表现力且统一的 API,以便你利用它们极快的查询数据来加快你的应用。
二、配置缓存(使用缓存时的必备条件)
如何查看项目使用的是哪一种缓存?
缓存配置文件位于 config/cache.php。在这个文件中,你可以指定应用默认使用哪个缓存驱动。Laravel 支持的缓存后端包括 Memcached、Redis、DynamoDB,以及现成的关系型数据库。此外,还支持基于文件的缓存驱动,以及方便自动化测试的缓存驱动 array 和 null 。
(1)数据库缓存
当使用 database 缓存驱动程序时,您需要设置一个表来包含缓存项。您将在下表中找到一个示例 Schema 声明:
Schema::create('cache', function ($table) {
$table->string('key')->unique();
$table->text('value');
$table->integer('expiration');
});
(2)Memcached
使用 Memcached 驱动需要安装【Memcached PECL 包】(https://pecl.php.net/package/memcached)。您可以在 config/cache.php 配置文件中列出所有 Memcached 服务器。 该文件已经包含一个 memcached.servers 条目以帮助您入门:
'memcached' => [
'servers' => [
[
'host' => env('MEMCACHED_HOST', '127.0.0.1'),
'port' => env('MEMCACHED_PORT', 11211),
'weight' => 100,
],
],
],
(3)Redis缓存
在将 Redis 缓存与 Laravel 一起使用之前,您需要通过 PECL 安装 PhpRedis PHP 扩展或通过 Composer 安装 predis/predis 包(~1.0)。Laravel Sail 已经包含了这个扩展。另外,Laravel 官方部署平台如 Laravel Forge 和 Laravel Vapor 默认安装了 PhpRedis 扩展。
(4)DynamoDB
在使用 DynamoDB 缓存驱动程序之前,您必须创建一个 DynamoDB 表来存储所有缓存的数据。通常,此表应命名为「缓存」。但是,您应该根据应用程序的 cache 配置文件中的 stores.dynamodb.table 配置值来命名表。
该表还应该有一个字符串分区键,其名称对应于应用程序的 cache 配置文件中的 stores.dynamodb.attributes.key 配置项的值。 默认情况下,分区键应命名为 key。
三、缓存的使用*
(1)从缓存中获取值
根据键值查找
$value = Cache::get('key');//根据键值查找
如果不存在使用默认的值
$value = Cache::get('key');//根据键值查找
如果不存在,也可以使用闭包,返回结果
$value = Cache::get('key', function () {
return DB::table(...)->get();
});
(2)从缓存检索是否存在(用于判断)
has 方法可用于确定缓存中是否存在项目。如果项目存在但其值为 null,此方法也将返回 false
if (Cache::has('key')) {
//逻辑代码
}
(3)递增/递减
increment 和 decrement 方法可用于调整缓存中整数项的值。这两种方法都接受一个可选的第二个参数,指示增加或减少项目值的数量:
Cache::increment('key');
Cache::increment('key', $amount);
Cache::decrement('key');
Cache::decrement('key', $amount);
(4)检索和存储
Cache:remember检索,如果不存在,执行闭包存储,并指定缓存的时间
$value = Cache::remember('users', $seconds, function () {
return DB::table('users')->get();
});
Cache::rememberForever如果不存在,执行闭包存储,并永久缓存
$value = Cache::rememberForever('users', function () {
return DB::table('users')->get();
});
(5)检索和删除
如果您需要从缓存中检索一个项目然后删除该项目,您可以使用 pull 方法。 与 get 方法一样,如果缓存中不存在该项,则将返回 null:
$value = Cache::pull('key');
(6)仅单纯的存储缓存
存储缓存,指定key、value和缓存时间(秒)
Cache::put('key', 'value', $seconds = 10);
不指定时间则永久缓存
Cache::put('key', 'value');
除了将秒数作为整数传递之外,您还可以传递一个表示缓存项所需过期时间的 DateTime 实例:
Cache::put('key', 'value', now()->addMinutes(10));
(7)不存在则存储
Cache::add('key', 'value', $seconds);
(8)永久存储
Cache::forever('key', 'value');
(9)从缓存中删除项目
使用 forget 方法从缓存中删除项目
Cache::forget('key');
通过提供零或负数的过期秒数来删除项目
Cache::put('key', 'value', 0);
Cache::put('key', 'value', -5);
您可以使用 flush 方法清除整个缓存
Cache::flush();
(10)cache()助手函数*
可以使用全局 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();
});
三、结语
在 Laravel 的世界里,缓存系统犹如一把性能优化的利器。通过灵活多样的配置选项,无论是选择数据库、Memcached、Redis 还是其他缓存后端,都能依据项目的独特需求与运行环境精准适配。而其丰富全面的使用方法,从数据的获取、存储、递增递减,到复杂的检索与删除操作,为开发者编织了一张严密且高效的缓存处理网络。这不仅极大地提升了应用程序的数据访问速度,减少了资源的重复消耗,更在高并发与大数据量的挑战面前,赋予了应用稳健运行与快速响应的能力。