캐싱 시스템
ㅋㅋ
캐싱 시스템
구성
Laravel은 다양한 백엔드 캐시를 위한 풍부하고 통합된 API 및 해당 구성 정보 config/cache.php
파일에 있습니다. 이 파일에서 애플리케이션이 기본적으로 사용하는 캐시 드라이버를 지정할 수 있습니다. Laravel은 Memcachedconfig/cache.php
文件中。在该文件中你可以指定应用默认使用哪个缓存驱动。Laravel 支持当前流行的后端缓存,例如 Memcached 和 Redis 。
缓存配置文件还包含各种其他选项,这些选项都记录在文件中,因此请确保阅读这些选项。默认情况下,Laravel 配置为使用 file
및 Redis
Database
데이터베이스
캐시 드라이버를 사용하는 경우 캐시 데이터를 저장할 테이블을 구성해야 합니다. 다음은 캐시 데이터 테이블 구조를 구축하기 위한 스키마
선언의 예입니다: database
缓存驱动时,你需要配置一个表来存放缓存数据。下面是构建缓存数据表结构的 Schema
声明示例:
Schema::create('cache', function ($table) { $table->string('key')->unique(); $table->text('value'); $table->integer('expiration'); });
{tip} 你也可以使用 Artisan 命令
php artisan cache:table
来生成合适的迁移。
Memcached
使用 Memcached 驱动需要安装 Memcached PECL 扩展包 。你可以把所有的 Memcached 服务器都列在 config/cache.php
配置文件中:
'memcached' => [ [ 'host' => '127.0.0.1', 'port' => 11211, 'weight' => 100 ], ],
你可以将 host
选项设置为 UNIX socket 路径。如果你这样配置了, port
选项应该设置为 0
:
'memcached' => [ [ 'host' => '/var/run/memcached/memcached.sock', 'port' => 0, 'weight' => 100 ], ],
Redis
在使用 Laravel 的 Redis 缓存之前,你需要通过 Composer 安装 predis/predis
扩展包 (~1.0) 或者使用 PECL 安装 PhpRedis PHP 扩展。
如需了解更多关于 Redis 的配置,请参考 Laravel Redis 文档。
缓存的使用
获取缓存实例
IlluminateContractsCacheFactory
和 IlluminateContractsCacheRepository
契约 提供了 Laravel 缓存服务的访问机制。 Factory
契约为你的应用程序定义了访问所有缓存驱动的机制。 Repository
契约通常是由你的 cache
配置文件指定的默认缓存驱动实现的。
不过,你也可以使用 Cache
Facade,我们将在后续的文档中介绍。 Cache
Facade 为 Laravel 缓存契约底层的实现提供了方便又简洁的方法:
<?php namespace App\Http\Controllers; use Illuminate\Support\Facades\Cache; class UserController extends Controller{ /** * 展示应用的所有用户列表。 * * @return Response */ public function index() { $value = Cache::get('key'); // } }
访问多个缓存存储
使用 Cache
Facade,你可以通过 store
方法来访问各种缓存存储。传入 store
方法的键应该对应 cache
配置信息文件中的 stores
$value = Cache::store('file')->get('foo'); Cache::store('redis')->put('bar', 'baz', 600); // 10 分钟
{tip} Artisan 명령 php artisan 캐시:table을 사용할 수도 있습니다. code>를 사용하여 적절한 마이그레이션을 생성합니다.
config/cache.php
구성 파일에서 모든 Memcached 서버를 나열할 수 있습니다. 🎜$value = Cache::get('key'); $value = Cache::get('key', 'default');🎜
host
옵션을 UNIX 소켓 경로로 설정할 수 있습니다. 이런 방식으로 구성하는 경우 port
옵션을 0
으로 설정해야 합니다: 🎜$value = Cache::get('key', function () { return DB::table(...)->get(); });
predis/predis
확장 패키지(~1.0)를 설치하거나 PECL을 사용하여 PhpRedis PHP 확장을 설치해야 합니다. 🎜🎜Redis 구성에 대해 자세히 알아보려면 Laravel Redis 설명서를 참조하세요. 🎜🎜🎜🎜캐시 사용량
🎜🎜🎜캐시 인스턴스 가져오기
🎜IlluminateContractsCacheFactory
및 IlluminateContractsCacheRepository
계약은 Laravel의 캐시 서비스에 대한 액세스 메커니즘을 제공합니다. Factory
계약은 애플리케이션이 모든 캐시 드라이버에 액세스하는 메커니즘을 정의합니다. 저장소
계약은 일반적으로 cache
구성 파일에 지정된 기본 캐시 드라이버에 의해 구현됩니다. 🎜🎜그러나 Cache
Facade를 사용할 수도 있으며, 이에 대해서는 후속 문서에서 소개하겠습니다. 캐시
Facade는 Laravel 캐시 계약의 기본 구현을 위한 편리하고 간결한 방법을 제공합니다. 🎜if (Cache::has('key')) { // }
Cache
Facade에서는 store
메소드를 통해 다양한 캐시 저장소에 접근할 수 있습니다. store
메소드에 전달된 키는 cache
구성 정보 파일의 stores
구성 배열에 나열된 저장소 중 하나와 일치해야 합니다: 🎜Cache::increment('key'); Cache::increment('key', $amount); Cache::decrement('key'); Cache::decrement('key', $amount);🎜🎜 🎜🎜🎜🎜
Get data from 캐시
Cache
Facade의 get
메소드는 캐시에서 데이터를 가져오는 데 사용되는 메소드입니다. 캐시에 데이터가 없으면 메서드는 null
을 반환합니다. 짐작할 수 있듯이 두 번째 매개변수를 get
메서드에 전달할 수도 있습니다. 이 매개변수는 조회 중인 데이터가 존재하지 않는 경우 반환하려는 기본값을 지정합니다. Cache
Facade 的 get
方法是用来从缓存中获取数据的方法。如果该数据在缓存中不存在,那么该方法将返回 null
。正如你想的那样,你也可以向 get
方法传递第二个参数,用来指定如果查找的数据不存在时你希望返回的默认值:
$value = Cache::remember('users', $seconds, function () { return DB::table('users')->get(); });
你甚至可以传递 Closure
作为默认值。如果指定的数据在缓存中不存在,将返回 Closure
的结果。传递闭包的方法允许你从数据库或其他外部服务中获取默认值:
$value = Cache::rememberForever('users', function () { return DB::table('users')->get(); });
检查缓存项是否存在
has
方法可以用于判断缓存项是否存在。如果为 null
或 false
则该方法将会返回 false
:
$value = Cache::pull('key');
递增与递减值
increment
和 decrement
方法可以用来调整缓存中整数项的值。这两个方法都可以传入第二个可选参数,这个参数用来指明要递增或递减的数量:
Cache::put('key', 'value', $seconds);
获取和存储
有时你可能想从缓存中获取一个数据,而当请求的缓存项不存在时,程序能为你存储一个默认值。例如,你可能想从缓存中获取所有用户,当缓存中不存在这些用户时,程序将从数据库将这些用户取出并放入缓存。你可以使用 Cache::remember
方法来实现:
Cache::put('key', 'value');
如果缓存中不存在你想要的数据时,则传递给 remember
方法的 闭包
将被执行,然后将其结果返回并放置到缓存中。
你可以使用 rememberForever
方法从缓存中获取数据或者永久存储它:
Cache::put('key', 'value', now()->addMinutes(10));
获取和删除
如果你需要从缓存中获取到数据之后再删除它,你可以使用 pull
方法。和 get
方法一样,如果缓存不存在,则返回 null
:
Cache::add('key', 'value', $seconds);
在缓存中存储数据
你可以使用 Cache
Facade 的 put
方法将数据存储到缓存中:
Cache::forever('key', 'value');
如果缓存的过期时间没有传递给 put
方法, 则缓存将永久有效:
Cache::forget('key');
除了以整数形式传递过期时间的秒数,你还可以传递一个 DateTime
实例来表示该数据的过期时间:
Cache::put('key', 'value', 0); Cache::put('key', 'value', -5);
只存储没有的数据
add
方法将只存储缓存中不存在的数据。如果存储成功,将返回 true
,否则返回 false
Cache::flush();< code>클로저를 기본값으로 설정합니다. 지정된 데이터가 캐시에 없으면
Closure
결과가 반환됩니다. 클로저 메소드를 전달하면 데이터베이스나 기타 외부 서비스에서 기본값을 가져올 수 있습니다: use Illuminate\Support\Facades\Cache; $lock = Cache::lock('foo', 10); if ($lock->get()) { //获取锁定10秒... $lock->release(); }
캐시된 항목이 있는지 확인
🎜 < The code>has 메소드를 사용하여 캐시 항목이 존재하는지 확인할 수 있습니다.null
또는 false
인 경우 이 메서드는 false
를 반환합니다. 🎜Cache::lock('foo')->get(function () { // 获取无限期锁并自动释放... });
값 증가 및 감소
🎜증가
및 감소
방법을 사용하여 캐시에 있는 정수 항목의 값을 조정할 수 있습니다. 두 메소드 모두 증가하거나 감소할 양을 지정하는 데 사용되는 두 번째 선택적 매개변수를 전달할 수 있습니다. 🎜use Illuminate\Contracts\Cache\LockTimeoutException; $lock = Cache::lock('foo', 10);try { $lock->block(5); // 等待最多5秒后获取的锁... } catch (LockTimeoutException $e) { // 无法获取锁... } finally { optional($lock)->release(); } Cache::lock('foo', 10)->block(5, function () { // 等待最多5秒后获取的锁... });
Get the sum Storage h4>🎜때때로 캐시에서 데이터를 얻고 싶을 때가 있는데, 요청한 캐시 항목이 존재하지 않는 경우 프로그램이 기본값을 저장할 수 있습니다. 예를 들어 캐시에서 모든 사용자를 가져오려고 할 수 있습니다. 이러한 사용자가 캐시에 없으면 프로그램은 데이터베이스에서 해당 사용자를 가져와서 캐시에 넣습니다. 이를 달성하려면 Cache::remember
메서드를 사용할 수 있습니다. 🎜// 控制器里面...
$podcast = Podcast::find($id);
if ($lock = Cache::lock('foo', 120)->get()) {
ProcessPodcast::dispatch($podcast, $lock->owner());
}
// ProcessPodcast Job 里面...
Cache::restoreLock('foo', $this->owner)->release();
🎜원하는 데이터가 캐시에 없으면 해당 데이터를 remember<의 클로저에 전달하세요. /code> 메소드 패키지
가 실행되고 해당 결과가 반환되어 캐시에 저장됩니다. 🎜🎜rememberForever
메소드를 사용하여 캐시에서 데이터를 가져오거나 영구적으로 저장할 수 있습니다. 🎜Cache::lock('foo')->forceRelease();
🎜가져오기 및 delete h4>🎜캐시에서 데이터를 가져온 후 삭제해야 하는 경우 pull
메서드를 사용할 수 있습니다. get
메소드와 마찬가지로 캐시가 없으면 null
이 반환됩니다. 🎜$value = cache('key');
🎜< /a >🎜🎜🎜캐시에 데이터를 저장하세요🎜🎜캐시
put 메소드를 사용할 수 있습니다 > 데이터를 캐시에 저장하는 Facade: 🎜cache(['key' => 'value'], $seconds);
cache(['key' => 'value'], now()->addMinutes(10));
🎜 캐시된 만료 시간이 put
메서드에 전달되지 않으면 캐시는 영원히 유효합니다. 🎜cache()->remember('users', $seconds, function () {
return DB::table('users')->get();
});
🎜 만료 시간을 전달하는 것 외에도 시간(초)을 정수로 전달하면 DateTime
인스턴스를 전달하여 데이터 만료 시간을 나타낼 수도 있습니다. 🎜Cache::tags(['people', 'artists'])->put('John', $john, $seconds);
Cache::tags(['people', 'authors'])->put('Anne', $anne, $seconds);
🎜존재하지 않는 데이터만 저장
🎜< code>add 메소드는 캐시에 존재하지 않는 데이터만 저장합니다. 저장에 성공하면 true
가 반환되고, 그렇지 않으면 false
가 반환됩니다. 🎜$john = Cache::tags(['people', 'artists'])->get('John');
$anne = Cache::tags(['people', 'authors'])->get('Anne');
🎜🎜데이터 영구 저장
영원히
방법을 사용하면 데이터를 캐시에 지속적으로 저장할 수 있습니다. 이러한 데이터는 만료되지 않으므로 forget
메서드를 통해 캐시에서 수동으로 삭제해야 합니다. forever
方法可用于持久化将数据存储到缓存中。因为这些数据不会过期,所以必须通过 forget
方法从缓存中手动删除它们:
Cache::tags(['people', 'authors'])->flush();
{tip} 如果你使用 Memcached 驱动,当缓存数据达到存储上限时,「永久存储」 的数据可能会被删除。
删除缓存中的数据
你可以使用 forget
方法从缓存中删除这些数据:
Cache::tags('authors')->flush();
你也可以通过提供零或者负的 TTL 值删除这些数据:
<?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() {}
}
你可以使用 flush
方法清空所有的缓存:
Cache::extend('mongo', function ($app) {
return Cache::repository(new MongoStore);
});
{note} 清空缓存的方法并不会考虑缓存前缀,会将缓存中的所有内容删除。因此在清除与其它应用程序共享的缓存时,请慎重考虑。
原子锁
{note} 要使用该特性,你的应用必须使用 memcached
, dynamodb
或 redis
缓存驱动作为你应用的默认缓存驱动。此外,所有服务器必须与同一中央缓存服务器进行通信。
原子锁允许对分布式锁进行操作而不必担心竞争条件。例如, Laravel Forge 使用原子锁来确保在一台服务器上每次只有一个远程任务在执行。你可以使用 Cache::lock
方法来创建和管理锁:
<?php
namespace App\Providers;use App\Extensions\MongoStore;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\ServiceProvider;
class CacheServiceProvider extends ServiceProvider{
/**
* 执行服务的注册后引导。
*
* @return void
*/
public function boot()
{
Cache::extend('mongo', function ($app) {
return Cache::repository(new MongoStore);
});
}
/**
* 在容器中注册绑定。
*
* @return void
*/
public function register()
{
//
}
}
get
方法也可以接收一个闭包。在闭包执行之后,Laravel 将会自动释放锁:
/**
* 应用的事件监听器映射
*
* @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',
],
];
如果你在请求时锁无法使用,你可以控制 Laravel 等待指定的秒数。如果在指定的时间限制内无法获取锁,则会抛出 IlluminateContractsCacheLockTimeoutException
:
rrreee管理跨进程的锁
有时,你希望在一个进程中获取锁并在另外一个进程中释放它。例如,你可以在 Web 请求期间获取锁,并希望在该请求触发的队列作业结束时释放锁。在这种情况下,你应该将锁的作用域「owner token」传递给队列作业,以便作业可以使用给定的 token 重新实例化锁:
rrreee如果你想在不尊重当前锁的所有者的情况下释放锁,你可以使用 forceRelease
rrreee
{tip} Memcached 드라이버를 사용하는 경우 캐시된 데이터가 스토리지에 도달하면 제한, " 영구 저장된 데이터는 삭제될 수 있습니다.
캐시에서 데이터 제거 h3>
forget
메소드를 사용하여 캐시에서 이 데이터를 삭제할 수 있습니다: 🎜rrreee🎜0 또는 음수 TTL 값을 제공하여 이 데이터를 삭제할 수도 있습니다: 🎜rrreee🎜를 사용할 수 있습니다 플러시
모든 캐시를 지우는 방법: 🎜rrreee🎜{note} 캐시를 지우는 방법은 캐시 접두어를 고려하지 않으며 캐시의 모든 콘텐츠를 삭제합니다. 따라서 다른 애플리케이션과 공유된 캐시를 삭제할 때는 신중하게 고려하시기 바랍니다. 🎜
🎜🎜🎜🎜원자 잠금
🎜{note} 이 기능을 사용하려면 애플리케이션이 memcached
, dynamodb
또는 redis
캐시 드라이버를 애플리케이션의 기본 캐시 드라이버로 사용해야 합니다. 또한 모든 서버는 동일한 중앙 캐시 서버와 통신해야 합니다. 🎜
🎜원자 잠금을 사용하면 경쟁 조건을 걱정하지 않고 분산 잠금에 대한 작업을 수행할 수 있습니다. 예를 들어 Laravel Forge🎜는 원자 잠금을 사용하여 서버에서 한 번에 하나의 원격 작업만 실행되도록 합니다. Cache::lock
메서드를 사용하여 잠금을 생성하고 관리할 수 있습니다. 🎜rrreee🎜 get
메서드도 클로저를 수신할 수 있습니다. 클로저가 실행된 후 Laravel은 자동으로 잠금을 해제합니다: 🎜rrreee🎜 요청 시 잠금을 사용할 수 없는 경우 Laravel이 지정된 시간(초) 동안 기다리도록 제어할 수 있습니다. 지정된 시간 제한 내에 잠금을 획득할 수 없는 경우 IlluminateContractsCacheLockTimeoutException
이 발생합니다: 🎜rrreee🎜🎜크로스 프로세스 잠금 관리🎜🎜 때로는 한 프로세스에서 잠금을 획득하고 다른 프로세스에서 잠금을 해제하려는 경우가 있습니다. 예를 들어 웹 요청 중에 잠금을 획득하고 해당 요청에 의해 트리거된 대기열 작업이 끝나면 잠금을 해제하려고 할 수 있습니다. 이 경우 작업이 지정된 토큰으로 잠금을 다시 인스턴스화할 수 있도록 잠금 범위 "소유자 토큰"을 대기열 작업에 전달해야 합니다. 🎜rrreee🎜 현재 잠금 소유자를 존중하지 않고 이 작업을 수행하려면 해제하려면 잠금을 해제하려면 forceRelease
메소드를 사용할 수 있습니다: 🎜rrreee🎜🎜🎜🎜🎜🎜캐시 도우미 기능
캐시
Facade 또는 캐시 계약을 사용하는 것 외에도 전역 도우미 기능 cache
를 사용하여 캐시 데이터를 얻고 저장할 수도 있습니다. cache
함수가 문자열 매개변수만 허용하는 경우 지정된 키에 해당하는 값을 반환합니다. Cache
Facade 或 Cache 契约 外,你还可以使用全局辅助函数 cache
来获取和保存缓存数据。当 cache
函数只接收一个字符串参数的时候,它将会返回给定键对应的值:
rrreee如果你向函数提供了一组键值对和过期时间,它将会在指定时间内缓存数据:
rrreee当 cache
函数在没有任何参数的情况下被调用时,它返回一个 IlluminateContractsCacheFactory
实现的实例,允许你调用其它缓存方法:
rrreee{tip} 如果在测试中使用全局辅助函数 cache
,你可以使用 Cache::shouldReceive
方法就像 测试 Facade。
缓存标记
{note} 缓存标记不支持使用 file
和 database
缓存驱动。此外,当使用多个缓存标记的缓存设置为「永久」时,类似 memcached
的缓存驱动性能最佳,它会自动清除旧的记录。
写入被标记的缓存数据
缓存标记允许你给缓存相关进行标记,以便后续清除这些缓存值。你可以通过传入标记名称的有序数组来访问标记的缓存。例如,我们可以使用标记的同时使用 put
方法设置缓存。
rrreee访问被标记的缓存数据
若要获取一个被标记的缓存数据,请将相同的有序标记数组传递给 tags
方法,然后调用 get
方法来获取你要检索的键:
rrreee移除被标记的缓存数据
你可以清空有单个标记或是一组标记的所有缓存数据。例如,下面的语句会被标记为 people
,authors
或两者都有的缓存。所以,Anne
和 John
都会从缓存中被删除:
rrreee相反,下面的语句只会删除被标记 authors
的缓存,所以 Anne
会被删除,但 John
rrreee
함수에 키-값 쌍 집합과 만료 시간을 제공하면 지정된 시간 동안 데이터를 캐시합니다: rrreee cache
함수가 매개변수 없이 호출되면 IlluminateContractsCacheFactory
구현의 인스턴스를 반환하므로 Other를 호출할 수 있습니다. 캐싱 방법: rrreee
{tip} 테스트에서 전역 도우미 함수 cache
를 사용하는 경우 Cache::shouldReceive
메서드를 다음과 같이 사용할 수 있습니다. 테스트 외관. {note} 캐시 태그 사용 파일
및 데이터베이스
캐시 드라이버는 지원되지 않습니다. 또한 memcached
와 같은 캐시 드라이버는 여러 캐시 태그를 사용하는 캐시가 "지속"으로 설정되어 오래된 레코드를 자동으로 지울 때 가장 잘 작동합니다. 🎜🎜🎜🎜태그된 캐시 데이터 쓰기🎜🎜캐시 태그를 사용하면 다음을 수행할 수 있습니다. 나중에 지울 수 있도록 캐시된 값을 표시합니다. 태그 이름의 정렬된 배열을 전달하여 태그 캐시에 액세스할 수 있습니다. 예를 들어, 태그와 함께 put
메소드를 사용하여 캐시를 설정할 수 있습니다. 🎜rrreee🎜🎜🎜🎜🎜태그된 캐시 데이터에 액세스🎜🎜태그된 캐시를 얻으려면 데이터를 캐시하려면 , 동일한 순서의 태그 배열을 tags
메서드에 전달한 다음 get
메서드를 호출하여 검색하려는 키를 가져옵니다. 🎜rrreee🎜🎜🎜🎜🎜태그된 캐시 데이터 제거🎜🎜단일 태그 또는 태그 그룹을 지울 수 있습니다. 모든 캐시된 데이터입니다. 예를 들어 다음 문은 people
, authors
또는 둘 다로 캐시됩니다. 따라서 Anne
과 John
은 모두 캐시에서 삭제됩니다. 🎜rrreee🎜반면, 다음 명령문은 authors
로 표시된 캐시만 삭제합니다. , 따라서 Anne
은 삭제되지만 John
은 삭제되지 않습니다. 🎜rrreee🎜🎜🎜🎜🎜🎜🎜사용자 정의 캐시 드라이버 추가🎜🎜🎜🎜🎜🎜🎜드라이버 작성
사용자 정의 캐시 드라이버를 생성하려면 먼저 IlluminateContractsCacheStore
계약을 구현해야 합니다. 따라서 MongoDB의 캐시 구현은 다음과 같습니다. IlluminateContractsCacheStore
契约。因此, MongoDB 的缓存实现看起来会像这样:
rrreee我们只需要 MongoDB 的连接来实现这些方法。关于如何实现这些方法的实例,可以参阅框架源代码中的 IlluminateCacheMemcachedStore
。一旦完成契约额实现后,就可以像下面这样完成自定义驱动的注册了。
rrreee{tip} 如果你不知道将缓存驱动代码放在哪,你可以在 app
目录下创建一个 Extensions
命名空间。然而,Laravel 并没有硬性规定应用程序的结构,你可以根据自己的喜好自由组织你的应用程序。
注册驱动
要使用 Laravel 来注册自定义缓存驱动,就要在 Cache
Facade 上使用 extend
方法。 对 Cache::extend
的调用可以在新的 Laravel 应用程序中自带的 AppProvidersAppServiceProvider
的 boot
方法中完成,或者你也可以创建自己的服务提供者来存放扩展,只是不要忘记在 config/app.php
的 provider 数组中注册服务提供者:
rrreee传递给 extend
方法的第一个参数是驱动程序的名称。这将与 config/cache.php
配置文件的 driver
选项相对应。第二个参数是一个应该返回 IlluminateCacheRepository
实例的闭包。该闭包将传递一个 服务容器 的 $app
实例。
一旦你的扩展程序注册后,需要将 config/cache.php
配置文件中的 driver
选项更新为你的扩展名称。
事件
要在每次缓存操作时执行代码,你可以监听缓存触发的 事件 。通常,你应该将这些事件监听器放在 EventServiceProvider
rrreee
이러한 메서드를 구현하려면 MongoDB 연결만 필요합니다. 이러한 메서드를 구현하는 방법에 대한 예는 프레임워크 소스 코드의 IlluminateCacheMemcachedStore
를 참조하세요. 계약이 완료되면 다음과 같이 커스텀 드라이버 등록을 완료할 수 있습니다. 🎜🎜🎜드라이버 등록🎜🎜Laravel을 사용하여 사용자 정의 캐시를 등록하려면 드라이버를 사용하려면 Cache
Facade에서 extend
메서드를 사용해야 합니다. Cache::extend
에 대한 호출은 새로운 Laravel 애플리케이션과 함께 제공되는 AppProvidersAppServiceProvider
의 boot
메서드에서 수행할 수 있습니다. 확장 프로그램을 저장하려면 서비스 공급자를 config/app.php
의 공급자 배열에 등록하는 것을 잊지 마세요. 🎜rrreee🎜가 extend
에 전달됩니다. method 첫 번째 매개변수는 드라이버의 이름입니다. 이는 config/cache.php
구성 파일의 driver
옵션에 해당합니다. 두 번째 매개변수는 IlluminateCacheRepository
의 인스턴스를 반환해야 하는 클로저입니다. 클로저는 서비스 컨테이너의 $app
인스턴스로 전달됩니다. 🎜🎜확장 프로그램이 등록되면 config/cache.php
구성 파일의 driver
옵션을 확장 프로그램 이름으로 업데이트해야 합니다. 🎜🎜🎜🎜🎜이벤트
🎜모든 캐시 작업에서 코드를 실행하려면 캐시 트리거를 들을 수 있습니다. 이벤트. 일반적으로 이러한 이벤트 리스너를 EventServiceProvider
에 배치해야 합니다. 🎜rrreee🎜이 기사는 🎜LearnKu.com🎜 웹사이트에 처음 게재되었습니다. 🎜🎜
클로저에 전달하세요. /code> 메소드 패키지
가 실행되고 해당 결과가 반환되어 캐시에 저장됩니다. 🎜🎜rememberForever
메소드를 사용하여 캐시에서 데이터를 가져오거나 영구적으로 저장할 수 있습니다. 🎜Cache::lock('foo')->forceRelease();
가져오기 및 delete h4>🎜캐시에서 데이터를 가져온 후 삭제해야 하는 경우 pull
메서드를 사용할 수 있습니다. get
메소드와 마찬가지로 캐시가 없으면 null
이 반환됩니다. 🎜$value = cache('key');
🎜< /a >🎜🎜🎜캐시에 데이터를 저장하세요🎜🎜캐시
put 메소드를 사용할 수 있습니다 > 데이터를 캐시에 저장하는 Facade: 🎜cache(['key' => 'value'], $seconds);
cache(['key' => 'value'], now()->addMinutes(10));
🎜 캐시된 만료 시간이 put
메서드에 전달되지 않으면 캐시는 영원히 유효합니다. 🎜cache()->remember('users', $seconds, function () {
return DB::table('users')->get();
});
🎜 만료 시간을 전달하는 것 외에도 시간(초)을 정수로 전달하면 DateTime
인스턴스를 전달하여 데이터 만료 시간을 나타낼 수도 있습니다. 🎜Cache::tags(['people', 'artists'])->put('John', $john, $seconds);
Cache::tags(['people', 'authors'])->put('Anne', $anne, $seconds);
🎜존재하지 않는 데이터만 저장
🎜< code>add 메소드는 캐시에 존재하지 않는 데이터만 저장합니다. 저장에 성공하면 true
가 반환되고, 그렇지 않으면 false
가 반환됩니다. 🎜$john = Cache::tags(['people', 'artists'])->get('John');
$anne = Cache::tags(['people', 'authors'])->get('Anne');
🎜🎜데이터 영구 저장
영원히
방법을 사용하면 데이터를 캐시에 지속적으로 저장할 수 있습니다. 이러한 데이터는 만료되지 않으므로 forget
메서드를 통해 캐시에서 수동으로 삭제해야 합니다. forever
方法可用于持久化将数据存储到缓存中。因为这些数据不会过期,所以必须通过 forget
方法从缓存中手动删除它们:
Cache::tags(['people', 'authors'])->flush();
{tip} 如果你使用 Memcached 驱动,当缓存数据达到存储上限时,「永久存储」 的数据可能会被删除。
删除缓存中的数据
你可以使用 forget
方法从缓存中删除这些数据:
Cache::tags('authors')->flush();
你也可以通过提供零或者负的 TTL 值删除这些数据:
<?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() {}
}
你可以使用 flush
方法清空所有的缓存:
Cache::extend('mongo', function ($app) {
return Cache::repository(new MongoStore);
});
{note} 清空缓存的方法并不会考虑缓存前缀,会将缓存中的所有内容删除。因此在清除与其它应用程序共享的缓存时,请慎重考虑。
原子锁
{note} 要使用该特性,你的应用必须使用 memcached
, dynamodb
或 redis
缓存驱动作为你应用的默认缓存驱动。此外,所有服务器必须与同一中央缓存服务器进行通信。
原子锁允许对分布式锁进行操作而不必担心竞争条件。例如, Laravel Forge 使用原子锁来确保在一台服务器上每次只有一个远程任务在执行。你可以使用 Cache::lock
方法来创建和管理锁:
<?php
namespace App\Providers;use App\Extensions\MongoStore;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\ServiceProvider;
class CacheServiceProvider extends ServiceProvider{
/**
* 执行服务的注册后引导。
*
* @return void
*/
public function boot()
{
Cache::extend('mongo', function ($app) {
return Cache::repository(new MongoStore);
});
}
/**
* 在容器中注册绑定。
*
* @return void
*/
public function register()
{
//
}
}
get
方法也可以接收一个闭包。在闭包执行之后,Laravel 将会自动释放锁:
/**
* 应用的事件监听器映射
*
* @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',
],
];
如果你在请求时锁无法使用,你可以控制 Laravel 等待指定的秒数。如果在指定的时间限制内无法获取锁,则会抛出 IlluminateContractsCacheLockTimeoutException
:
rrreee管理跨进程的锁
有时,你希望在一个进程中获取锁并在另外一个进程中释放它。例如,你可以在 Web 请求期间获取锁,并希望在该请求触发的队列作业结束时释放锁。在这种情况下,你应该将锁的作用域「owner token」传递给队列作业,以便作业可以使用给定的 token 重新实例化锁:
rrreee如果你想在不尊重当前锁的所有者的情况下释放锁,你可以使用 forceRelease
rrreee
{tip} Memcached 드라이버를 사용하는 경우 캐시된 데이터가 스토리지에 도달하면 제한, " 영구 저장된 데이터는 삭제될 수 있습니다.
캐시에서 데이터 제거 h3>
forget
메소드를 사용하여 캐시에서 이 데이터를 삭제할 수 있습니다: 🎜rrreee🎜0 또는 음수 TTL 값을 제공하여 이 데이터를 삭제할 수도 있습니다: 🎜rrreee🎜를 사용할 수 있습니다 플러시
모든 캐시를 지우는 방법: 🎜rrreee🎜{note} 캐시를 지우는 방법은 캐시 접두어를 고려하지 않으며 캐시의 모든 콘텐츠를 삭제합니다. 따라서 다른 애플리케이션과 공유된 캐시를 삭제할 때는 신중하게 고려하시기 바랍니다. 🎜
🎜🎜🎜🎜원자 잠금
🎜{note} 이 기능을 사용하려면 애플리케이션이 memcached
, dynamodb
또는 redis
캐시 드라이버를 애플리케이션의 기본 캐시 드라이버로 사용해야 합니다. 또한 모든 서버는 동일한 중앙 캐시 서버와 통신해야 합니다. 🎜
🎜원자 잠금을 사용하면 경쟁 조건을 걱정하지 않고 분산 잠금에 대한 작업을 수행할 수 있습니다. 예를 들어 Laravel Forge🎜는 원자 잠금을 사용하여 서버에서 한 번에 하나의 원격 작업만 실행되도록 합니다. Cache::lock
메서드를 사용하여 잠금을 생성하고 관리할 수 있습니다. 🎜rrreee🎜 get
메서드도 클로저를 수신할 수 있습니다. 클로저가 실행된 후 Laravel은 자동으로 잠금을 해제합니다: 🎜rrreee🎜 요청 시 잠금을 사용할 수 없는 경우 Laravel이 지정된 시간(초) 동안 기다리도록 제어할 수 있습니다. 지정된 시간 제한 내에 잠금을 획득할 수 없는 경우 IlluminateContractsCacheLockTimeoutException
이 발생합니다: 🎜rrreee🎜🎜크로스 프로세스 잠금 관리🎜🎜 때로는 한 프로세스에서 잠금을 획득하고 다른 프로세스에서 잠금을 해제하려는 경우가 있습니다. 예를 들어 웹 요청 중에 잠금을 획득하고 해당 요청에 의해 트리거된 대기열 작업이 끝나면 잠금을 해제하려고 할 수 있습니다. 이 경우 작업이 지정된 토큰으로 잠금을 다시 인스턴스화할 수 있도록 잠금 범위 "소유자 토큰"을 대기열 작업에 전달해야 합니다. 🎜rrreee🎜 현재 잠금 소유자를 존중하지 않고 이 작업을 수행하려면 해제하려면 잠금을 해제하려면 forceRelease
메소드를 사용할 수 있습니다: 🎜rrreee🎜🎜🎜🎜🎜🎜캐시 도우미 기능
캐시
Facade 또는 캐시 계약을 사용하는 것 외에도 전역 도우미 기능 cache
를 사용하여 캐시 데이터를 얻고 저장할 수도 있습니다. cache
함수가 문자열 매개변수만 허용하는 경우 지정된 키에 해당하는 값을 반환합니다. Cache
Facade 或 Cache 契约 外,你还可以使用全局辅助函数 cache
来获取和保存缓存数据。当 cache
函数只接收一个字符串参数的时候,它将会返回给定键对应的值:
rrreee如果你向函数提供了一组键值对和过期时间,它将会在指定时间内缓存数据:
rrreee当 cache
函数在没有任何参数的情况下被调用时,它返回一个 IlluminateContractsCacheFactory
实现的实例,允许你调用其它缓存方法:
rrreee{tip} 如果在测试中使用全局辅助函数 cache
,你可以使用 Cache::shouldReceive
方法就像 测试 Facade。
缓存标记
{note} 缓存标记不支持使用 file
和 database
缓存驱动。此外,当使用多个缓存标记的缓存设置为「永久」时,类似 memcached
的缓存驱动性能最佳,它会自动清除旧的记录。
写入被标记的缓存数据
缓存标记允许你给缓存相关进行标记,以便后续清除这些缓存值。你可以通过传入标记名称的有序数组来访问标记的缓存。例如,我们可以使用标记的同时使用 put
方法设置缓存。
rrreee访问被标记的缓存数据
若要获取一个被标记的缓存数据,请将相同的有序标记数组传递给 tags
方法,然后调用 get
方法来获取你要检索的键:
rrreee移除被标记的缓存数据
你可以清空有单个标记或是一组标记的所有缓存数据。例如,下面的语句会被标记为 people
,authors
或两者都有的缓存。所以,Anne
和 John
都会从缓存中被删除:
rrreee相反,下面的语句只会删除被标记 authors
的缓存,所以 Anne
会被删除,但 John
rrreee
함수에 키-값 쌍 집합과 만료 시간을 제공하면 지정된 시간 동안 데이터를 캐시합니다: rrreee cache
함수가 매개변수 없이 호출되면 IlluminateContractsCacheFactory
구현의 인스턴스를 반환하므로 Other를 호출할 수 있습니다. 캐싱 방법: rrreee
{tip} 테스트에서 전역 도우미 함수 cache
를 사용하는 경우 Cache::shouldReceive
메서드를 다음과 같이 사용할 수 있습니다. 테스트 외관. {note} 캐시 태그 사용 파일
및 데이터베이스
캐시 드라이버는 지원되지 않습니다. 또한 memcached
와 같은 캐시 드라이버는 여러 캐시 태그를 사용하는 캐시가 "지속"으로 설정되어 오래된 레코드를 자동으로 지울 때 가장 잘 작동합니다. 🎜🎜🎜🎜태그된 캐시 데이터 쓰기🎜🎜캐시 태그를 사용하면 다음을 수행할 수 있습니다. 나중에 지울 수 있도록 캐시된 값을 표시합니다. 태그 이름의 정렬된 배열을 전달하여 태그 캐시에 액세스할 수 있습니다. 예를 들어, 태그와 함께 put
메소드를 사용하여 캐시를 설정할 수 있습니다. 🎜rrreee🎜🎜🎜🎜🎜태그된 캐시 데이터에 액세스🎜🎜태그된 캐시를 얻으려면 데이터를 캐시하려면 , 동일한 순서의 태그 배열을 tags
메서드에 전달한 다음 get
메서드를 호출하여 검색하려는 키를 가져옵니다. 🎜rrreee🎜🎜🎜🎜🎜태그된 캐시 데이터 제거🎜🎜단일 태그 또는 태그 그룹을 지울 수 있습니다. 모든 캐시된 데이터입니다. 예를 들어 다음 문은 people
, authors
또는 둘 다로 캐시됩니다. 따라서 Anne
과 John
은 모두 캐시에서 삭제됩니다. 🎜rrreee🎜반면, 다음 명령문은 authors
로 표시된 캐시만 삭제합니다. , 따라서 Anne
은 삭제되지만 John
은 삭제되지 않습니다. 🎜rrreee🎜🎜🎜🎜🎜🎜🎜사용자 정의 캐시 드라이버 추가🎜🎜🎜🎜🎜🎜🎜드라이버 작성
사용자 정의 캐시 드라이버를 생성하려면 먼저 IlluminateContractsCacheStore
계약을 구현해야 합니다. 따라서 MongoDB의 캐시 구현은 다음과 같습니다. IlluminateContractsCacheStore
契约。因此, MongoDB 的缓存实现看起来会像这样:
rrreee我们只需要 MongoDB 的连接来实现这些方法。关于如何实现这些方法的实例,可以参阅框架源代码中的 IlluminateCacheMemcachedStore
。一旦完成契约额实现后,就可以像下面这样完成自定义驱动的注册了。
rrreee{tip} 如果你不知道将缓存驱动代码放在哪,你可以在 app
目录下创建一个 Extensions
命名空间。然而,Laravel 并没有硬性规定应用程序的结构,你可以根据自己的喜好自由组织你的应用程序。
注册驱动
要使用 Laravel 来注册自定义缓存驱动,就要在 Cache
Facade 上使用 extend
方法。 对 Cache::extend
的调用可以在新的 Laravel 应用程序中自带的 AppProvidersAppServiceProvider
的 boot
方法中完成,或者你也可以创建自己的服务提供者来存放扩展,只是不要忘记在 config/app.php
的 provider 数组中注册服务提供者:
rrreee传递给 extend
方法的第一个参数是驱动程序的名称。这将与 config/cache.php
配置文件的 driver
选项相对应。第二个参数是一个应该返回 IlluminateCacheRepository
实例的闭包。该闭包将传递一个 服务容器 的 $app
实例。
一旦你的扩展程序注册后,需要将 config/cache.php
配置文件中的 driver
选项更新为你的扩展名称。
事件
要在每次缓存操作时执行代码,你可以监听缓存触发的 事件 。通常,你应该将这些事件监听器放在 EventServiceProvider
rrreee
이러한 메서드를 구현하려면 MongoDB 연결만 필요합니다. 이러한 메서드를 구현하는 방법에 대한 예는 프레임워크 소스 코드의 IlluminateCacheMemcachedStore
를 참조하세요. 계약이 완료되면 다음과 같이 커스텀 드라이버 등록을 완료할 수 있습니다. 🎜🎜🎜드라이버 등록🎜🎜Laravel을 사용하여 사용자 정의 캐시를 등록하려면 드라이버를 사용하려면 Cache
Facade에서 extend
메서드를 사용해야 합니다. Cache::extend
에 대한 호출은 새로운 Laravel 애플리케이션과 함께 제공되는 AppProvidersAppServiceProvider
의 boot
메서드에서 수행할 수 있습니다. 확장 프로그램을 저장하려면 서비스 공급자를 config/app.php
의 공급자 배열에 등록하는 것을 잊지 마세요. 🎜rrreee🎜가 extend
에 전달됩니다. method 첫 번째 매개변수는 드라이버의 이름입니다. 이는 config/cache.php
구성 파일의 driver
옵션에 해당합니다. 두 번째 매개변수는 IlluminateCacheRepository
의 인스턴스를 반환해야 하는 클로저입니다. 클로저는 서비스 컨테이너의 $app
인스턴스로 전달됩니다. 🎜🎜확장 프로그램이 등록되면 config/cache.php
구성 파일의 driver
옵션을 확장 프로그램 이름으로 업데이트해야 합니다. 🎜🎜🎜🎜🎜이벤트
🎜모든 캐시 작업에서 코드를 실행하려면 캐시 트리거를 들을 수 있습니다. 이벤트. 일반적으로 이러한 이벤트 리스너를 EventServiceProvider
에 배치해야 합니다. 🎜rrreee🎜이 기사는 🎜LearnKu.com🎜 웹사이트에 처음 게재되었습니다. 🎜🎜
캐시
put 메소드를 사용할 수 있습니다 > 데이터를 캐시에 저장하는 Facade: 🎜cache(['key' => 'value'], $seconds); cache(['key' => 'value'], now()->addMinutes(10));🎜 캐시된 만료 시간이
put
메서드에 전달되지 않으면 캐시는 영원히 유효합니다. 🎜cache()->remember('users', $seconds, function () { return DB::table('users')->get(); });🎜 만료 시간을 전달하는 것 외에도 시간(초)을 정수로 전달하면
DateTime
인스턴스를 전달하여 데이터 만료 시간을 나타낼 수도 있습니다. 🎜Cache::tags(['people', 'artists'])->put('John', $john, $seconds); Cache::tags(['people', 'authors'])->put('Anne', $anne, $seconds);
존재하지 않는 데이터만 저장
🎜< code>add 메소드는 캐시에 존재하지 않는 데이터만 저장합니다. 저장에 성공하면true
가 반환되고, 그렇지 않으면 false
가 반환됩니다. 🎜$john = Cache::tags(['people', 'artists'])->get('John'); $anne = Cache::tags(['people', 'authors'])->get('Anne');🎜🎜
데이터 영구 저장
영원히
방법을 사용하면 데이터를 캐시에 지속적으로 저장할 수 있습니다. 이러한 데이터는 만료되지 않으므로 forget
메서드를 통해 캐시에서 수동으로 삭제해야 합니다. forever
方法可用于持久化将数据存储到缓存中。因为这些数据不会过期,所以必须通过 forget
方法从缓存中手动删除它们:
Cache::tags(['people', 'authors'])->flush();
{tip} 如果你使用 Memcached 驱动,当缓存数据达到存储上限时,「永久存储」 的数据可能会被删除。
删除缓存中的数据
你可以使用 forget
方法从缓存中删除这些数据:
Cache::tags('authors')->flush();
你也可以通过提供零或者负的 TTL 值删除这些数据:
<?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() {} }
你可以使用 flush
方法清空所有的缓存:
Cache::extend('mongo', function ($app) { return Cache::repository(new MongoStore); });
{note} 清空缓存的方法并不会考虑缓存前缀,会将缓存中的所有内容删除。因此在清除与其它应用程序共享的缓存时,请慎重考虑。
原子锁
{note} 要使用该特性,你的应用必须使用
memcached
,dynamodb
或redis
缓存驱动作为你应用的默认缓存驱动。此外,所有服务器必须与同一中央缓存服务器进行通信。
原子锁允许对分布式锁进行操作而不必担心竞争条件。例如, Laravel Forge 使用原子锁来确保在一台服务器上每次只有一个远程任务在执行。你可以使用 Cache::lock
方法来创建和管理锁:
<?php namespace App\Providers;use App\Extensions\MongoStore; use Illuminate\Support\Facades\Cache; use Illuminate\Support\ServiceProvider; class CacheServiceProvider extends ServiceProvider{ /** * 执行服务的注册后引导。 * * @return void */ public function boot() { Cache::extend('mongo', function ($app) { return Cache::repository(new MongoStore); }); } /** * 在容器中注册绑定。 * * @return void */ public function register() { // } }
get
方法也可以接收一个闭包。在闭包执行之后,Laravel 将会自动释放锁:
/** * 应用的事件监听器映射 * * @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', ], ];
如果你在请求时锁无法使用,你可以控制 Laravel 等待指定的秒数。如果在指定的时间限制内无法获取锁,则会抛出 IlluminateContractsCacheLockTimeoutException
:
管理跨进程的锁
有时,你希望在一个进程中获取锁并在另外一个进程中释放它。例如,你可以在 Web 请求期间获取锁,并希望在该请求触发的队列作业结束时释放锁。在这种情况下,你应该将锁的作用域「owner token」传递给队列作业,以便作业可以使用给定的 token 重新实例化锁:
rrreee如果你想在不尊重当前锁的所有者的情况下释放锁,你可以使用 forceRelease
rrreee
{tip} Memcached 드라이버를 사용하는 경우 캐시된 데이터가 스토리지에 도달하면 제한, " 영구 저장된 데이터는 삭제될 수 있습니다.
캐시에서 데이터 제거 h3>
forget
메소드를 사용하여 캐시에서 이 데이터를 삭제할 수 있습니다: 🎜rrreee🎜0 또는 음수 TTL 값을 제공하여 이 데이터를 삭제할 수도 있습니다: 🎜rrreee🎜를 사용할 수 있습니다 플러시
모든 캐시를 지우는 방법: 🎜rrreee🎜{note} 캐시를 지우는 방법은 캐시 접두어를 고려하지 않으며 캐시의 모든 콘텐츠를 삭제합니다. 따라서 다른 애플리케이션과 공유된 캐시를 삭제할 때는 신중하게 고려하시기 바랍니다. 🎜🎜🎜🎜
원자 잠금
🎜{note} 이 기능을 사용하려면 애플리케이션이🎜원자 잠금을 사용하면 경쟁 조건을 걱정하지 않고 분산 잠금에 대한 작업을 수행할 수 있습니다. 예를 들어 Laravel Forge🎜는 원자 잠금을 사용하여 서버에서 한 번에 하나의 원격 작업만 실행되도록 합니다.memcached
,dynamodb
또는redis
캐시 드라이버를 애플리케이션의 기본 캐시 드라이버로 사용해야 합니다. 또한 모든 서버는 동일한 중앙 캐시 서버와 통신해야 합니다. 🎜
Cache::lock
메서드를 사용하여 잠금을 생성하고 관리할 수 있습니다. 🎜rrreee🎜 get
메서드도 클로저를 수신할 수 있습니다. 클로저가 실행된 후 Laravel은 자동으로 잠금을 해제합니다: 🎜rrreee🎜 요청 시 잠금을 사용할 수 없는 경우 Laravel이 지정된 시간(초) 동안 기다리도록 제어할 수 있습니다. 지정된 시간 제한 내에 잠금을 획득할 수 없는 경우 IlluminateContractsCacheLockTimeoutException
이 발생합니다: 🎜rrreeeforceRelease
메소드를 사용할 수 있습니다: 🎜rrreee🎜🎜🎜🎜🎜🎜캐시 도우미 기능
캐시
Facade 또는 캐시 계약을 사용하는 것 외에도 전역 도우미 기능 cache
를 사용하여 캐시 데이터를 얻고 저장할 수도 있습니다. cache
함수가 문자열 매개변수만 허용하는 경우 지정된 키에 해당하는 값을 반환합니다. Cache
Facade 或 Cache 契约 外,你还可以使用全局辅助函数 cache
来获取和保存缓存数据。当 cache
函数只接收一个字符串参数的时候,它将会返回给定键对应的值:
如果你向函数提供了一组键值对和过期时间,它将会在指定时间内缓存数据:
rrreee当 cache
函数在没有任何参数的情况下被调用时,它返回一个 IlluminateContractsCacheFactory
实现的实例,允许你调用其它缓存方法:
{tip} 如果在测试中使用全局辅助函数
cache
,你可以使用Cache::shouldReceive
方法就像 测试 Facade。
缓存标记
{note} 缓存标记不支持使用
file
和database
缓存驱动。此外,当使用多个缓存标记的缓存设置为「永久」时,类似memcached
的缓存驱动性能最佳,它会自动清除旧的记录。
写入被标记的缓存数据
缓存标记允许你给缓存相关进行标记,以便后续清除这些缓存值。你可以通过传入标记名称的有序数组来访问标记的缓存。例如,我们可以使用标记的同时使用 put
方法设置缓存。
访问被标记的缓存数据
若要获取一个被标记的缓存数据,请将相同的有序标记数组传递给 tags
方法,然后调用 get
方法来获取你要检索的键:
移除被标记的缓存数据
你可以清空有单个标记或是一组标记的所有缓存数据。例如,下面的语句会被标记为 people
,authors
或两者都有的缓存。所以,Anne
和 John
都会从缓存中被删除:
相反,下面的语句只会删除被标记 authors
的缓存,所以 Anne
会被删除,但 John
rrreee
rrreee cache
함수가 매개변수 없이 호출되면 IlluminateContractsCacheFactory
구현의 인스턴스를 반환하므로 Other를 호출할 수 있습니다. 캐싱 방법: rrreee
{tip} 테스트에서 전역 도우미 함수cache
를 사용하는 경우Cache::shouldReceive
메서드를 다음과 같이 사용할 수 있습니다. 테스트 외관.{note} 캐시 태그 사용파일
및데이터베이스
캐시 드라이버는 지원되지 않습니다. 또한memcached
와 같은 캐시 드라이버는 여러 캐시 태그를 사용하는 캐시가 "지속"으로 설정되어 오래된 레코드를 자동으로 지울 때 가장 잘 작동합니다. 🎜🎜🎜🎜태그된 캐시 데이터 쓰기🎜🎜캐시 태그를 사용하면 다음을 수행할 수 있습니다. 나중에 지울 수 있도록 캐시된 값을 표시합니다. 태그 이름의 정렬된 배열을 전달하여 태그 캐시에 액세스할 수 있습니다. 예를 들어, 태그와 함께put
메소드를 사용하여 캐시를 설정할 수 있습니다. 🎜rrreee🎜🎜🎜🎜🎜태그된 캐시 데이터에 액세스🎜🎜태그된 캐시를 얻으려면 데이터를 캐시하려면 , 동일한 순서의 태그 배열을tags
메서드에 전달한 다음get
메서드를 호출하여 검색하려는 키를 가져옵니다. 🎜rrreee🎜🎜🎜🎜🎜태그된 캐시 데이터 제거🎜🎜단일 태그 또는 태그 그룹을 지울 수 있습니다. 모든 캐시된 데이터입니다. 예를 들어 다음 문은🎜people
,authors
또는 둘 다로 캐시됩니다. 따라서Anne
과John
은 모두 캐시에서 삭제됩니다. 🎜rrreee🎜반면, 다음 명령문은authors
로 표시된 캐시만 삭제합니다. , 따라서Anne
은 삭제되지만John
은 삭제되지 않습니다. 🎜rrreee🎜🎜🎜🎜🎜🎜🎜사용자 정의 캐시 드라이버 추가🎜🎜🎜🎜🎜🎜🎜드라이버 작성
사용자 정의 캐시 드라이버를 생성하려면 먼저
rrreeeIlluminateContractsCacheStore
계약을 구현해야 합니다. 따라서 MongoDB의 캐시 구현은 다음과 같습니다.IlluminateContractsCacheStore
契约。因此, MongoDB 的缓存实现看起来会像这样:我们只需要 MongoDB 的连接来实现这些方法。关于如何实现这些方法的实例,可以参阅框架源代码中的
rrreeeIlluminateCacheMemcachedStore
。一旦完成契约额实现后,就可以像下面这样完成自定义驱动的注册了。{tip} 如果你不知道将缓存驱动代码放在哪,你可以在
app
目录下创建一个Extensions
命名空间。然而,Laravel 并没有硬性规定应用程序的结构,你可以根据自己的喜好自由组织你的应用程序。注册驱动
要使用 Laravel 来注册自定义缓存驱动,就要在
rrreeeCache
Facade 上使用extend
方法。 对Cache::extend
的调用可以在新的 Laravel 应用程序中自带的AppProvidersAppServiceProvider
的boot
方法中完成,或者你也可以创建自己的服务提供者来存放扩展,只是不要忘记在config/app.php
的 provider 数组中注册服务提供者:传递给
extend
方法的第一个参数是驱动程序的名称。这将与config/cache.php
配置文件的driver
选项相对应。第二个参数是一个应该返回IlluminateCacheRepository
实例的闭包。该闭包将传递一个 服务容器 的$app
实例。一旦你的扩展程序注册后,需要将
config/cache.php
配置文件中的driver
选项更新为你的扩展名称。事件
要在每次缓存操作时执行代码,你可以监听缓存触发的 事件 。通常,你应该将这些事件监听器放在
이러한 메서드를 구현하려면 MongoDB 연결만 필요합니다. 이러한 메서드를 구현하는 방법에 대한 예는 프레임워크 소스 코드의EventServiceProvider
rrreeeIlluminateCacheMemcachedStore
를 참조하세요. 계약이 완료되면 다음과 같이 커스텀 드라이버 등록을 완료할 수 있습니다.🎜🎜드라이버 등록🎜🎜Laravel을 사용하여 사용자 정의 캐시를 등록하려면 드라이버를 사용하려면Cache
Facade에서extend
메서드를 사용해야 합니다.Cache::extend
에 대한 호출은 새로운 Laravel 애플리케이션과 함께 제공되는AppProvidersAppServiceProvider
의boot
메서드에서 수행할 수 있습니다. 확장 프로그램을 저장하려면 서비스 공급자를config/app.php
의 공급자 배열에 등록하는 것을 잊지 마세요. 🎜rrreee🎜가extend
에 전달됩니다. method 첫 번째 매개변수는 드라이버의 이름입니다. 이는config/cache.php
구성 파일의driver
옵션에 해당합니다. 두 번째 매개변수는IlluminateCacheRepository
의 인스턴스를 반환해야 하는 클로저입니다. 클로저는 서비스 컨테이너의$app
인스턴스로 전달됩니다. 🎜🎜확장 프로그램이 등록되면config/cache.php
구성 파일의driver
옵션을 확장 프로그램 이름으로 업데이트해야 합니다. 🎜🎜🎜🎜🎜이벤트
🎜모든 캐시 작업에서 코드를 실행하려면 캐시 트리거를 들을 수 있습니다. 이벤트. 일반적으로 이러한 이벤트 리스너를EventServiceProvider
에 배치해야 합니다. 🎜rrreee🎜이 기사는 🎜LearnKu.com🎜 웹사이트에 처음 게재되었습니다. 🎜🎜