首頁 >資料庫 >Redis >Redis 中如何使用 scan 來替換 keys

Redis 中如何使用 scan 來替換 keys

藏色散人
藏色散人轉載
2020-01-28 14:06:323805瀏覽

Redis 中如何使用 scan 來替換 keys

我們都知道要尋找Redis 的鍵時,可以使用keys pattern,但當key 太多時,keys 指令的效率就很低,如果在線上直接使用,甚至可能發生生產事故,這時候,我們不妨使用scan 指令。

SCAN 指令是一個基於遊標的迭代器(cursor based iterator): 

SCAN 指令每次被呼叫之後, 都會傳回使用者一個新的遊標,使用者在下次迭代時需要使用這個新遊標作為SCAN 指令的遊標參數, 以此來延續先前的迭代過程。

當 SCAN 指令的遊標參數被設定為 0 時, 伺服器將開始一次新的迭代, 而當伺服器傳回值為 0 的遊標時, 表示迭代已結束。

產生key

<?php
// 生成1000个
$redis = new \Redis();
$redis->connect(&#39;127.0.0.1&#39;, 6379, 10);
$redis->select(2);
$arr = [
    &#39;rwer&#39;,
    &#39;24erw&#39;,
    &#39;rterq4&#39;,
    &#39;sdgfd5&#39;,
    &#39;dgsdg&#39;,
    &#39;sfst&#39;,
];
for ($i=0; $i<1000; $i++) {
    $redis->set(md5($i.$arr[$i%6]), md5($arr[$i%6].&#39;sdfsd&#39;));
}
echo "OK".PHP_EOL;

keys 檢視個數

##keys c*

Redis 中如何使用 scan 來替換 keys

Redis中使用scan取代keys

#scan 遍歷

<?php
$redis = new \Redis();
$redis->connect(&#39;127.0.0.1&#39;, 6379, 10);
$redis->select(2);
$iterator = null;
// 遍历前缀
$pattern = &#39;c*&#39;;
$count = 100;
// 务必设置,如果没扫描到,继续扫描,而不是返回空,否则while直接退出,遍历就会不准确
$redis->setOption(\Redis::OPT_SCAN, \Redis::SCAN_RETRY);
$total = [];
$i = 0;
// $count可以不设置,非必需参数
while($arr = $redis->scan($iterator, $pattern, $count)) {
    $arrVal = $redis->mget($arr);
    $ret = array_combine($arr, $arrVal);
    $total = array_merge($total, $ret);
    $i++;
}
// var_dump($total);
var_dump($i);
echo count($total).PHP_EOL;

Redis中使用scan替換keys

Redis 中如何使用 scan 來替換 keys

當然也可以不使用

\Redis::OPT_SCAN, \Redis::SCAN_RETRY 這兩個參數,自行循環,判斷回傳值是不是false,也能遍歷成功。

更多redis知識請關注

redis資料庫教學欄位。

以上是Redis 中如何使用 scan 來替換 keys的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:learnku.com。如有侵權,請聯絡admin@php.cn刪除