Caching-System


Cache-System

Konfiguration

Laravel Bietet eine umfangreiche und einheitliche API für verschiedene Backend-Caches, deren Konfigurationsinformationen sich in der Datei config/cache.php befinden. In dieser Datei können Sie festlegen, welchen Cache-Treiber die Anwendung standardmäßig verwendet. Laravel unterstützt beliebte Backend-Caches wie Memcached und Redis .

Die Cache-Konfigurationsdatei enthält auch verschiedene andere Optionen, die in der Datei dokumentiert sind. Lesen Sie diese daher unbedingt durch. Standardmäßig ist Laravel für die Verwendung des Cache-Treibers file konfiguriert, der serialisierte Cache-Objekte im Dateisystem speichert. Für größere Anwendungen empfiehlt sich die Verwendung eines leistungsfähigeren Treibers wie Memcached oder Redis. Sie können sogar mehrere Cache-Konfigurationen für denselben Treiber konfigurieren.

Fahrervoraussetzungen

Datenbank

Bei Verwendung des database-Cache-Treibers müssen Sie eine Tabelle zum Speichern von Cache-Daten konfigurieren. Hier ist eine Beispiel-Schema-Deklaration, die die Struktur der Cache-Datentabelle aufbaut:

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

{tip} Sie können auch den Artisan-Befehl php artisan cache:table verwenden, um die entsprechenden Migrationen zu generieren.

Memcached

Die Verwendung des Memcached-Treibers erfordert die Installation des Memcached PECL-Erweiterungspakets. Sie können alle Memcached-Server in der config/cache.php-Konfigurationsdatei auflisten:

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

Sie können die Option host auf den UNIX-Socket-Pfad setzen. Wenn Sie es auf diese Weise konfigurieren, sollte die Option port auf 0 gesetzt sein:

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

Redis

Bevor Sie den Redis-Cache von Laravel verwenden, müssen Sie ihn installieren über das Composer predis/predis Erweiterungspaket (~1.0) oder verwenden Sie PECL, um die PHP-Erweiterung PhpRedis zu installieren.

Weitere Informationen zur Redis-Konfiguration finden Sie in der Laravel Redis-Dokumentation.

Cache-Nutzung

Cache-Instanz abrufen

IlluminateContractsCacheFactory und IlluminateContractsCacheRepository Verträge bieten Zugangsmechanismen zum Caching-Dienst von Laravel. Factory Der Vertrag definiert den Mechanismus für den Zugriff Ihrer Anwendung auf alle Cache-Treiber. Der Repository-Vertrag wird normalerweise durch den Standard-Cache-Treiber implementiert, der in Ihrer cache-Konfigurationsdatei angegeben ist.

Sie können jedoch auch die CacheFassade verwenden, die wir in der nachfolgenden Dokumentation vorstellen werden. Cache Facade bietet eine praktische und übersichtliche Methode für die zugrunde liegende Implementierung des Laravel-Cache-Vertrags:

<?php
    namespace App\Http\Controllers;
    use Illuminate\Support\Facades\Cache;
    class UserController extends Controller{   
     /**
     * 展示应用的所有用户列表。
     *
     * @return Response
     */ 
      public function index() 
         {     
            $value = Cache::get('key');    
                //  
          }
     }

Zugriff auf mehrere Cache-Speicher

Mit Cache Facade können Sie verschiedene Auf Cachespeicher kann über die Methode store zugegriffen werden. Der an die store-Methode übergebene Schlüssel sollte einem der Speicher entsprechen, die im cache-Konfigurationsarray in der stores-Konfigurationsinformationsdatei aufgeführt sind:

$value = Cache::store('file')->get('foo');
Cache::store('redis')->put('bar', 'baz', 600); 
// 10 分钟

Daten aus dem Cache abrufen

Cache Die get-Methode von Facade wird zum Abrufen von Daten aus dem Cache verwendet. Wenn die Daten nicht im Cache vorhanden sind, gibt die Methode null zurück. Wie Sie sich vorstellen können, können Sie der get-Methode auch einen zweiten Parameter übergeben, der den Standardwert angibt, der zurückgegeben werden soll, wenn die gesuchten Daten nicht vorhanden sind:

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

Sie können sogar <🎜 übergeben > als Standardwert. Wenn die angegebenen Daten nicht im Cache vorhanden sind, wird ein Ergebnis von Closure zurückgegeben. Mit der Methode zum Übergeben eines Abschlusses können Sie den Standardwert aus der Datenbank oder einem anderen externen Dienst abrufen: Closure

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

Überprüfen Sie, ob das Cache-Element vorhanden ist

Methode kann verwendet werden, um festzustellen, ob das Cache-Element vorhanden ist. Wenn es has oder null ist, gibt diese Methode false zurück: false

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

Werte erhöhen und verringern

und increment Methoden Kann verwendet werden, um den Wert eines ganzzahligen Elements im Cache anzupassen. Beide Methoden können einen zweiten optionalen Parameter übergeben, der verwendet wird, um den Betrag anzugeben, der erhöht oder verringert werden soll: decrement

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

Abrufen und speichern

Manchmal möchten Sie vielleicht Rufen Sie Daten aus dem Cache ab. Wenn das angeforderte Cache-Element nicht vorhanden ist, kann das Programm einen Standardwert für Sie speichern. Beispielsweise möchten Sie möglicherweise alle Benutzer aus dem Cache abrufen. Wenn diese Benutzer nicht im Cache vorhanden sind, ruft das Programm diese Benutzer aus der Datenbank ab und legt sie im Cache ab. Sie können die

-Methode verwenden, um dies zu erreichen: Cache::remember

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

Wenn die gewünschten Daten nicht im Cache vorhanden sind, wird die an die

-Methode übergebene remember ausgeführt und anschließend das Ergebnis wird zurückgegeben und im Cache abgelegt. 闭包

Sie können Daten aus dem Cache abrufen oder sie dauerhaft speichern, indem Sie die

Methoden verwenden: rememberForever

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

Abrufen und löschen

, falls erforderlich Rufen Sie es aus dem Cache ab. Nachdem Sie die Daten abgerufen und anschließend gelöscht haben, können Sie die Methode

verwenden. Wenn der Cache nicht vorhanden ist, geben Sie wie bei der pull-Methode get zurück: null

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

Daten im Cache speichern

Sie können die

FassadenCache verwenden Die Methode speichert die Daten im Cache: put

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

Wenn die Ablaufzeit des Caches nicht an die Methode

übergeben wird, ist der Cache für immer gültig: put

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

, außer dass die Ablaufzeit beträgt Wird als Ganzzahl in Sekunden übergeben, Sie können auch ein

übergeben Beispiel zur Darstellung der Ablaufzeit der Daten: DateTime

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

Nur ​​Daten speichern, die nicht vorhanden sind

Die Methode speichert nur Daten, die nicht vorhanden sind der Cache. Bei erfolgreicher Speicherung wird add zurückgegeben, andernfalls wird true zurückgegeben: false

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

Mit der Methode

Data Persistent Storage

forever können Daten dauerhaft im Cache gespeichert werden. Da diese Daten nicht ablaufen, müssen sie manuell über die forget-Methode aus dem Cache gelöscht werden:

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

{tip} Wenn Sie den Memcached-Treiber verwenden, wenn die zwischengespeicherten Daten das Speicherlimit erreichen , „Permanent gespeicherte Daten können gelöscht werden.“

Daten aus dem Cache löschen

Sie können diese mit der Methode forget aus dem Cache löschen Daten:

Cache::forget('key');

Sie können auch eine Null- oder eine negative TTL angeben Wert zum Löschen dieser Daten:

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

Sie können die Methode flush verwenden, um alle Caches zu löschen:

Cache::flush();

{Hinweis} Die Methode zum Löschen des Caches berücksichtigt nicht den Cache Präfix und wird Der gesamte Inhalt im Cache wird gelöscht. Bitte überlegen Sie daher sorgfältig, ob Sie den mit anderen Anwendungen gemeinsam genutzten Cache löschen.

Atomic Lock

{note} Um diese Funktion nutzen zu können, muss Ihre Anwendung verwenden memcached, dynamodb oder redis Der Cache-Treiber dient als Standard-Cache-Treiber für Ihre Anwendung. Darüber hinaus müssen alle Server mit demselben zentralen Cache-Server kommunizieren.

Atomsperren ermöglichen Operationen auf verteilten Sperren, ohne sich Gedanken über die Rennbedingungen machen zu müssen. Beispielsweise verwendet Laravel Forge atomare Sperren, um sicherzustellen, dass jeweils nur eine Remote-Aufgabe auf einem Server ausgeführt wird. Mit der Methode Cache::lock können Sie Sperren erstellen und verwalten: Die Methode

use Illuminate\Support\Facades\Cache;
$lock = Cache::lock('foo', 10);
if ($lock->get()) {
    //获取锁定10秒...    
    $lock->release();
}

get kann auch eine Schließung erhalten. Nachdem der Abschluss ausgeführt wurde, gibt Laravel die Sperre automatisch frei:

Cache::lock('foo')->get(function () {
    // 获取无限期锁并自动释放...
});

Wenn die Sperre zum Zeitpunkt Ihrer Anfrage nicht verfügbar ist, können Sie Laravel so steuern, dass es eine bestimmte Anzahl von Sekunden wartet. Wenn die Sperre nicht innerhalb des angegebenen Zeitlimits erworben werden kann, wird IlluminateContractsCacheLockTimeoutException ausgegeben:

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秒后获取的锁...
   });

Sperren prozessübergreifend verwalten

Manchmal möchten Sie die Sperre in einem anderen erwerben verarbeiten und in einem anderen Prozess freigeben. Sie könnten beispielsweise während einer Webanforderung eine Sperre erwerben und die Sperre aufheben, wenn der durch diese Anforderung ausgelöste Warteschlangenjob endet. In diesem Fall sollten Sie den „Besitzer-Token“ des Sperrbereichs an den Warteschlangenjob übergeben, damit der Job die Sperre mit dem angegebenen Token erneut instanziieren kann:

// 控制器里面...
$podcast = Podcast::find($id);
if ($lock = Cache::lock('foo', 120)->get()) {
    ProcessPodcast::dispatch($podcast, $lock->owner());
    }
// ProcessPodcast Job 里面...
Cache::restoreLock('foo', $this->owner)->release();

Wenn Sie dies tun möchten, ohne den aktuellen Wert zu berücksichtigen lock Um die Sperre ohne den Eigentümer aufzuheben, können Sie forceRelease verwenden Methode:

Cache::lock('foo')->forceRelease();

Cache-Hilfsfunktion

Zusätzlich zur Verwendung des Cache Fassaden- oder Cache-Vertrags können Sie auch die globale Hilfsfunktion cache verwenden, um Cache-Daten abzurufen und zu speichern. Wenn die Funktion cache nur einen Zeichenfolgenparameter empfängt, gibt sie den Wert zurück, der dem angegebenen Schlüssel entspricht:

$value = cache('key');

Wenn Sie der Funktion einen Satz Schlüssel-Wert-Paare und eine Ablaufzeit bereitstellen, wird dies der Fall sein Daten für eine bestimmte Zeit zwischenspeichern:

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

Wenn die Funktion cache ohne Argumente aufgerufen wird, gibt sie ein IlluminateContractsCacheFactory zurück Implementierte Instanzen, mit denen Sie andere Caching-Methoden aufrufen können:

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

{tip} Wenn Sie in Ihren Tests die globale Hilfsfunktion cache verwenden, können Sie die Methode Cache::shouldReceive genau wie den Test verwenden Fassade.

Cache-Tag

{note} Cache-Tags mit file und database Cache-Treiber. Darüber hinaus erzielt ein Cache-Treiber wie memcached die beste Leistung, wenn der Cache, der mehrere Cache-Tags verwendet, auf „persistent“ eingestellt ist, wodurch alte Datensätze automatisch gelöscht werden.

Getaggte Cache-Daten schreiben

Cache-Tags ermöglichen es Ihnen, Cache-bezogene Tags zu markieren, damit diese zwischengespeichert werden Werte können später gelöscht werden. Sie können auf den Tag-Cache zugreifen, indem Sie ein geordnetes Array von Tag-Namen übergeben. Beispielsweise können wir den Cache mit der Methode put festlegen, während wir das Tag verwenden.

Cache::tags(['people', 'artists'])->put('John', $john, $seconds);
Cache::tags(['people', 'authors'])->put('Anne', $anne, $seconds);

Zugriff auf markierte Cache-Daten

Um markierte Cache-Daten zu erhalten, ändern Sie bitte das gleiche. Ein geordnetes Array von Tags werden an die Methode tags übergeben und dann wird get aufgerufen Methode zum Abrufen des Schlüssels, den Sie abrufen möchten:

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

Markierte Cache-Daten entfernen

Sie können alles löschen zwischengespeicherte Daten für ein einzelnes Tag oder eine Gruppe von Tags. Die folgende Anweisung würde beispielsweise als people, authors oder beides zwischengespeichert. Daher werden sowohl Anne als auch John aus dem Cache gelöscht:

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

Im Gegensatz dazu löscht die folgende Anweisung nur den mit authors gekennzeichneten Cache, sodass Anne gelöscht wird, aber John Nein:

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

Benutzerdefinierten Cache-Treiber hinzufügen

Schreiben eines Treibers

Um einen benutzerdefinierten Cache-Treiber zu erstellen, müssen Sie zunächst den IlluminateContractsCacheStore-Vertrag implementieren. Daher sieht die Cache-Implementierung von MongoDB so aus:

<?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() {}
    }

Wir benötigen nur die MongoDB-Verbindung, um diese Methoden zu implementieren. Beispiele für die Implementierung dieser Methoden finden Sie unter IlluminateCacheMemcachedStore im Framework-Quellcode. Sobald der Vertrag abgeschlossen ist, können Sie die Registrierung des benutzerdefinierten Fahrers wie folgt abschließen.

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

{tip} Wenn Sie nicht wissen, wo Sie den Cache-Treibercode ablegen sollen, können Sie einen app-Namespace im Verzeichnis Extensions erstellen. Laravel schreibt jedoch nicht die Struktur Ihrer Bewerbung vor und es steht Ihnen frei, Ihre Bewerbung so zu organisieren, wie Sie möchten.

Treiber registrieren

Um Laravel zum Registrieren eines benutzerdefinierten Cache-Treibers zu verwenden, müssen Sie ihn registrieren in Cache Verwenden Sie die extend-Methode für die Fassade. Der Aufruf von Cache::extend kann in der AppProvidersAppServiceProvider-Methode des integrierten boot in der neuen Laravel-Anwendung erfolgen, oder Sie können Ihren eigenen Dienstanbieter erstellen, um die Erweiterung zu speichern, vergessen Sie aber nicht, sie hinzuzufügen in config/app.php Registrieren Sie den Dienstanbieter im Provider-Array:

<?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()   
      {      
        //   
       }
    }

Der erste Parameter, der an die extend-Methode übergeben wird, ist der Name des Treibers. Dies entspricht der Option config/cache.php der Konfigurationsdatei driver. Der zweite Parameter ist ein Abschluss, der eine IlluminateCacheRepository-Instanz zurückgeben soll. Dem Abschluss wird eine $app-Instanz des Servicecontainers übergeben.

Sobald Ihre Erweiterung registriert ist, müssen Sie die Option config/cache.php in der Konfigurationsdatei driver auf Ihren Erweiterungsnamen aktualisieren.

Ereignisse

Um Code bei jedem Cache-Vorgang auszuführen, können Sie vom Cache ausgelöste Ereignisse abhören. Normalerweise sollten Sie diese Ereignis-Listener in EventServiceProvider platzieren:

/**
 * 应用的事件监听器映射
 *
 * @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', 
           ],
        ];
Dieser Artikel erschien zuerst auf der Website LearnKu.com.