久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長(zhǎng)資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      php redis 批量刪除keys的方法

      php redis批量刪除keys的方法:首先打開(kāi)命令窗口;然后通過(guò)命令“redis-cli keys video* | xargs redis-cli del”實(shí)現(xiàn)批量刪除key即可。

      php redis 批量刪除keys的方法

      redis實(shí)現(xiàn)批量刪除key功能

      推薦:《PHP視頻教程》

      keys

      在測(cè)試環(huán)境使用redis的時(shí)候,經(jīng)常會(huì)要批量刪除key,我們但是redis并沒(méi)有提供批量刪除的命令,但是我們可以在命令行下,使用keys遍歷鍵實(shí)現(xiàn)

      //批量刪除以video開(kāi)頭的key redis-cli keys video* | xargs redis-cli del  //以j,r開(kāi)頭,緊跟edis字符串的所有鍵 redis-cli keys [j,r]edis | xargs redis-cli del
      注意:     redis是單線程架構(gòu),如果redis包含了大量的鍵,執(zhí)行keys命令可能會(huì)造成redis阻塞,所以一般建議不要在生產(chǎn)環(huán)境下使用keys命令。     如果非要遍歷鍵刪除的話,可以在一下三種情況使用:     (1)在一個(gè)不對(duì)外提供服務(wù)的Redis從節(jié)點(diǎn)上執(zhí)行,這樣不會(huì)阻塞到客戶端的請(qǐng)求,但是會(huì)影響到主從復(fù)制。     (2)如果確認(rèn)鍵值總數(shù)確實(shí)比較少,可以執(zhí)行該命令。     (3)使用scan命令漸進(jìn)式的遍歷所有鍵,可以有效防止阻塞。

      漸進(jìn)式遍歷

      scan命令文檔

      Redis提供了面向哈希類型、集合類型、有序集合的掃描遍歷命令,解決諸如hgetall、smembers、zrange可能產(chǎn)生的阻塞問(wèn)題,對(duì)應(yīng)的命令分別是hscan、sscan、zscan,它們的用法和scan基本類似。

      注意:
      漸進(jìn)式遍歷可以有效的解決keys命令可能產(chǎn)生的阻塞問(wèn)題,但是scan并非完美無(wú)瑕,如果在scan的過(guò)程中如果有鍵的變化(增加、刪除、修改),
      那么遍歷效果可能會(huì)碰到如下問(wèn)題:新增的鍵可能沒(méi)有遍歷到,遍歷出了重復(fù)的鍵等情況,也就是說(shuō)scan并不能保證完整的遍歷出來(lái)所有的鍵,這些是我們?cè)陂_(kāi)發(fā)時(shí)需要考慮的。

      <?php  namespace Redis;   use Redis;  class RedisTest {     const PORT = 6379;      /**      * redis對(duì)象      */     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;         }     } }

      返回結(jié)果

      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', )

      SSCAN、HSCAN、ZSCAN、SCAN命令的坑

      // 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;         }

      根據(jù)scan的文檔說(shuō)明可知:scan命令每次迭代的時(shí)候,有可能返回空,但這并不是結(jié)束的標(biāo)志,而是當(dāng)返回的迭代的值為”0″時(shí)才算結(jié)束。

      因此,上面的代碼在迭代的時(shí)候,若沒(méi)有arr_keys返回,$arr_keys是個(gè)空數(shù)組,所以while循環(huán)自然就中斷了,所以沒(méi)有任何輸出。

      為了避免arr_keys返回是個(gè)空數(shù)組的問(wèn)題我們可以這樣解決:

      解決方法一
       $this->redis->setOption(Redis::OPT_SCAN, Redis::SCAN_RETRY);

      告訴redis擴(kuò)展,當(dāng)執(zhí)行scan命令后,返回的結(jié)果集為空的話,函數(shù)不返回,而是直接繼續(xù)執(zhí)行scan命令。這樣當(dāng)scan函數(shù)返回的時(shí)候,要么返回false,即迭代結(jié)束。

      注意:SSCAN、HSCAN、ZSCAN也是一樣的邏輯

      解決方法二

              //方式一         // 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) {//迭代結(jié)束,未找到匹配pattern的key                 return;             }              call_user_func_array([$this->redis, 'del'], $arr_keys);              echo var_export($arr_keys, true) . PHP_EOL;         }

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)