Redis
Einführung
Redis ist eine Open-Source-Speicherdatenbank für erweiterte Schlüssel-Wert-Paare. Da es diese Datentypen String, Hash, Liste, Set und Ordered Set enthält, ist es so wird oft als Datenstrukturserver bezeichnet.
Bevor Sie Laravel's Redis verwenden, müssen Sie das predis/predis
Erweiterungspaket über Composer installieren:
composer require predis/predis
Alternativ können Sie auch die PhpRedis PHP-Erweiterung über PECL installieren. Die Installation dieser Erweiterung ist komplexer, bietet jedoch möglicherweise eine bessere Leistung für Anwendungen, die Redis stark nutzen.
Konfiguration
Die Redis-Konfiguration der Laravel-Anwendung befindet sich in der Konfigurationsdatei config/database.php
. In dieser Datei können Sie sehen, dass das Array redis
die von der Anwendung verwendeten Redis-Serverinformationen enthält:
'redis' => [ 'client' => 'predis', 'default' => [ 'host' => env('REDIS_HOST', '127.0.0.1'), 'password' => env('REDIS_PASSWORD', null), 'port' => env('REDIS_PORT', 6379), 'database' => env('REDIS_DB', 0), ], 'cache' => [ 'host' => env('REDIS_HOST', '127.0.0.1'), 'password' => env('REDIS_PASSWORD', null), 'port' => env('REDIS_PORT', 6379), 'database' => env('REDIS_CACHE_DB', 1), ], ],
Die Standardserverkonfiguration sollte für die Entwicklung ausreichend sein. Natürlich können Sie dieses Array je nach verwendeter Umgebung auch beliebig ändern. Geben Sie einfach den Namen, den Host und den Port für jeden Redis-Server in der Konfigurationsdatei an.
Cluster-Konfiguration
Wenn Ihre Anwendung Redis-Servercluster verwendet, sollten Sie den Schlüssel clusters
in der Redis-Konfigurationsdatei verwenden, um diese Cluster zu definieren:
'redis' => [ 'client' => 'predis', 'clusters' => [ 'default' => [ [ 'host' => env('REDIS_HOST', 'localhost'), 'password' => env('REDIS_PASSWORD', null), 'port' => env('REDIS_PORT', 6379), 'database' => 0, ], ], ], ],
Standardmäßig kann der Cluster clientseitiges Sharding auf den Knoten implementieren, sodass Sie Knotenpools implementieren und große Mengen an verfügbarem Speicher erstellen können. Beachten Sie hier, dass die clientseitige Freigabe keine Fehlerfälle behandelt. Daher eignet sich diese Funktion hauptsächlich für zwischengespeicherte Daten, die aus einer anderen Masterdatenbank stammen. Wenn Sie den nativen Redis-Cluster verwenden möchten, müssen Sie im Schlüssel options
unter der Konfigurationsdatei Folgendes angeben:
'redis' => [ 'client' => 'predis', 'options' => [ 'cluster' => 'redis', ], 'clusters' => [ // ... ], ],
Predis
Zusätzlich zur Standardeinstellung host
, port
, database
, Zusätzlich zu diesen Dienstkonfigurationsoptionen und password
unterstützt Predis auch die Definition anderer Verbindungsparameter Verbindungsparameter für jeden Redis-Server. Wenn Sie diese zusätzlichen Konfigurationsmöglichkeiten nutzen möchten, können Sie die folgende Konfiguration zur Konfigurationsdatei des Redis-Servers hinzufügen config/database.php
:
'default' => [ 'host' => env('REDIS_HOST', 'localhost'), 'password' => env('REDIS_PASSWORD', null), 'port' => env('REDIS_PORT', 6379), 'database' => 0, 'read_write_timeout' => 60, ],
PhpRedis
Um die PhpRedis-Erweiterung zu verwenden, müssen Sie die Option config/database.php
der Redis-Konfiguration in der Konfigurationsdatei client
in phpredis
ändern:
'redis' => [ 'client' => 'phpredis', // 其余的Redis配置... ],
Zusätzlich auf die Standardeinstellungen host
, port
, database
und password
zurückgesetzt Zusätzlich zu diesen Dienstkonfigurationsoptionen unterstützt PhpRedis auch die folgenden zusätzlichen Verbindungsparameter: persistent
, prefix
, read_timeout
und timeout
. Sie können diese Konfigurationsoptionen zur Konfigurationsdatei config/database.php
unter dem Redis-Dienstkonfigurationselement hinzufügen:
'default' => [ 'host' => env('REDIS_HOST', 'localhost'), 'password' => env('REDIS_PASSWORD', null), 'port' => env('REDIS_PORT', 6379), 'database' => 0, 'read_timeout' => 60, ],
Redis-Interaktion
Sie können mit Redis interagieren, indem Sie verschiedene Methoden an der Redis
Fassade aufrufen. Redis
Die Fassade unterstützt dynamische Methoden, was bedeutet, dass Sie verschiedene Redis-Befehle auf der Fassade aufrufen können und die Befehle direkt an Redis übergeben werden. Im Beispiel wird der Redis
-Befehl auf Redis über die get
-Methode auf der GET
-Fassade aufgerufen:
<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\Redis; class UserController extends Controller{ /** * 显示给定用户的配置文件。 * * @param int $id * @return Response */ public function showProfile($id) { $user = Redis::get('user:profile:'.$id); return view('user.profile', ['user' => $user]); } }
Wie oben erwähnt, können Sie jeden Redis-Befehl auf der Redis
-Fassade aufrufen . Laravel verwendet magische Methoden, um Befehle an den Redis-Server zu übergeben. Übergeben Sie also einfach die für den Redis-Befehl erforderlichen Parameter:
Redis::set('name', 'Taylor'); $values = Redis::lrange('names', 5, 10);
Alternativ können Sie auch die command
-Methode verwenden, um den Befehl an den Server zu übergeben akzeptiert den Befehlsnamen als erstes Argument und ein Wertearray als zweites Argument:
$values = Redis::command('lrange', ['name', 5, 10]);
Verwendung mehrerer Redis Verbinden
Sie können eine Redis-Instanz über die Redis::connection
-Methode erhalten:
$redis = Redis::connection();
Dies gibt eine Standard-Redis-Instanz zurück. Sie können den Verbindungs- oder Clusternamen an die Methode connection
übergeben, um einen bestimmten Dienst oder Cluster in der Redis-Konfiguration abzurufen:
$redis = Redis::connection('my-connection');
Pipe-Befehl
Wenn Sie viele Befehle in einem Vorgang an den Server senden müssen, wird die Verwendung von Pipe-Befehlen empfohlen. Die pipeline
-Methode akzeptiert einen 闭包
einer Redis-Instanz. Sie können alle Befehle an die Redis-Instanz senden und sie werden in einem Vorgang ausgeführt:
Redis::pipeline(function ($pipe) { for ($i = 0; $i < 1000; $i++) { $pipe->set("key:$i", $i); } });
Veröffentlichen und Abonnieren
Laravel bietet praktische Schnittstellen für publish
und subscribe
von Redis. Mit diesen Redis-Befehlen können Sie auf einem bestimmten „Kanal“ auf Nachrichten warten. Sie können Nachrichten aus einer anderen Anwendung in einer anderen Anwendung veröffentlichen, sogar mit anderen Programmiersprachen, sodass Anwendungen und Prozesse problemlos kommunizieren können.
Zuerst richten wir den Kanal-Listener mit der subscribe
-Methode ein. Wir platzieren diesen Methodenaufruf in einem Artisan-Befehl, da der Aufruf der subscribe
-Methode einen lang andauernden Prozess startet:
<?php namespace App\Console\Commands; use Illuminate\Console\Command; use Illuminate\Support\Facades\Redis; class RedisSubscribe extends Command{ /** * 控制台命令的名称和签名。 * * @var string */ protected $signature = 'redis:subscribe'; /** * 控制台命令说明。 * * @var string */ protected $description = 'Subscribe to a Redis channel'; /** * 执行控制台命令。 * * @return mixed */ public function handle() { Redis::subscribe(['test-channel'], function ($message) { echo $message; }); } }
Jetzt können wir die publish
-Methode verwenden, um eine Nachricht im Kanal zu veröffentlichen:
Route::get('publish', function () { // 路由... Redis::publish('test-channel', json_encode(['foo' => 'bar'])); });
Wildcard-Abonnement
verwendenpsubscribe
Methode zum Abonnieren von Wildcard-Kanälen und kann zum Abrufen aller Nachrichten auf allen Kanälen verwendet werden. $channel
Der Name wird als zweiter Parameter an den bereitgestellten Rückruf übergeben 闭包
:
Redis::psubscribe(['*'], function ($message, $channel) { echo $message;});Redis::psubscribe(['users.*'], function ($message, $channel) { echo $message; });