So löschen Sie Schlüssel stapelweise in PHP Redis: Öffnen Sie zuerst das Befehlsfenster. Verwenden Sie dann den Befehl „redis-cli keys video* | xargs redis-cli del“, um Schlüssel stapelweise zu löschen.
redis implementiert die Funktion zum Löschen von Schlüsseln in Stapeln Wir haben kein Redis, das Batch-Löschbefehle bereitstellt, aber wir können Key-Traversal-Keys verwenden, um
//批量删除以video开头的key redis-cli keys video* | xargs redis-cli del //以j,r开头,紧跟edis字符串的所有键 redis-cli keys [j,r]edis | xargs redis-cli del
注意: redis是单线程架构,如果redis包含了大量的键,执行keys命令可能会造成redis阻塞,所以一般建议不要在生产环境下使用keys命令。 如果非要遍历键删除的话,可以在一下三种情况使用: (1)在一个不对外提供服务的Redis从节点上执行,这样不会阻塞到客户端的请求,但是会影响到主从复制。 (2)如果确认键值总数确实比较少,可以执行该命令。 (3)使用scan命令渐进式的遍历所有键,可以有效防止阻塞。
Hinweis:
Progressive Durchquerung kann das Blockierungsproblem, das der Tastenbefehl verursachen kann, effektiv lösen, aber der Scan ist nicht perfekt. Wenn sich während des Scanvorgangs Änderungen an den Schlüsseln ergeben (hinzugefügt, gelöscht, geändert),<?php namespace Redis; use Redis; class RedisTest { const PORT = 6379; /** * redis对象 */ public $redis = null; public function __construct() { $this->redis = new Redis(); $this->redis->connect('127.0.0.1', self::PORT); } public function info() { print_r($this->redis->info()); } /** * 删除前缀是test:的key */ public function keyDelete() { $pre = 'test:'; for ($i = 0; $i < 10; $i++) { $this->redis->set($pre . "$i", "$i"); } // Have scan retry $this->redis->setOption(Redis::OPT_SCAN, Redis::SCAN_RETRY); $it = NULL; while ($arr_keys = $this->redis->scan($it, "$pre*", 5)) { call_user_func_array([$this->redis, 'del'], $arr_keys); echo var_export($arr_keys, true) . PHP_EOL; } } }
array ( 0 => 'test:8', ) array ( 0 => 'test:1', ) array ( 0 => 'test:9', ) array ( 0 => 'test:6', ) array ( 0 => 'test:5', ) array ( 0 => 'test:0', ) array ( 0 => 'test:3', ) array ( 0 => 'test:7', ) array ( 0 => 'test:4', ) array ( 0 => 'test:2', )
Um das Problem zu vermeiden, dass arr_keys ein leeres Array zurückgibt, können wir es wie folgt lösen: Lösung 1// Have scan retry $this->redis->setOption(Redis::OPT_SCAN, Redis::SCAN_RETRY); $it = NULL; while ($arr_keys = $this->redis->scan($it, "$pre*", 5)) { call_user_func_array([$this->redis, 'del'], $arr_keys); echo var_export($arr_keys, true) . PHP_EOL; }Nach dem Login kopierenLaut Dokumentation des Scans: Der Scan-Befehl kann bei jeder Iteration null zurückgeben, aber das ist kein Zeichen des Endes , endet es, wenn der Wert der zurückgegebenen Iteration „0“ ist.
Wenn also der obige Code iteriert und kein arr_keys zurückgegeben wird, ist $arr_keys ein leeres Array, sodass die while-Schleife natürlich unterbrochen wird und keine Ausgabe erfolgt.
$this->redis->setOption(Redis::OPT_SCAN, Redis::SCAN_RETRY);
Hinweis: SSCAN, HSCAN und ZSCAN haben die gleiche Logik
Lösung 2//方式一 // Have scan retry $this->redis->setOption(Redis::OPT_SCAN, Redis::SCAN_RETRY); $it = NULL; while ($arr_keys = $this->redis->scan($it, "$pre*", 5)) { call_user_func_array([$this->redis, 'del'], $arr_keys); echo var_export($arr_keys, true) . PHP_EOL; } //方式二 while (true) { $arr_keys = $this->redis->scan($it, "$pre*"); if ($arr_keys === false) {//迭代结束,未找到匹配pattern的key return; } call_user_func_array([$this->redis, 'del'], $arr_keys); echo var_export($arr_keys, true) . PHP_EOL; }
Das obige ist der detaillierte Inhalt vonSo löschen Sie Schlüssel stapelweise in PHP Redis. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!