我們都知道要尋找Redis 的鍵時,可以使用keys pattern,但當key 太多時,keys 指令的效率就很低,如果在線上直接使用,甚至可能發生生產事故,這時候,我們不妨使用scan 指令。
SCAN 指令是一個基於遊標的迭代器(cursor based iterator
):
SCAN 指令每次被呼叫之後, 都會傳回使用者一個新的遊標,使用者在下次迭代時需要使用這個新遊標作為SCAN 指令的遊標參數, 以此來延續先前的迭代過程。
當 SCAN 指令的遊標參數被設定為 0 時, 伺服器將開始一次新的迭代, 而當伺服器傳回值為 0 的遊標時, 表示迭代已結束。
產生key
<?php // 生成1000个 $redis = new \Redis(); $redis->connect('127.0.0.1', 6379, 10); $redis->select(2); $arr = [ 'rwer', '24erw', 'rterq4', 'sdgfd5', 'dgsdg', 'sfst', ]; for ($i=0; $i<1000; $i++) { $redis->set(md5($i.$arr[$i%6]), md5($arr[$i%6].'sdfsd')); } echo "OK".PHP_EOL;
keys 檢視個數
##keys c*
Redis中使用scan取代keys
#scan 遍歷
<?php $redis = new \Redis(); $redis->connect('127.0.0.1', 6379, 10); $redis->select(2); $iterator = null; // 遍历前缀 $pattern = 'c*'; $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::OPT_SCAN,
\Redis::SCAN_RETRY 這兩個參數,自行循環,判斷回傳值是不是false,也能遍歷成功。
redis資料庫教學欄位。
以上是Redis 中如何使用 scan 來替換 keys的詳細內容。更多資訊請關注PHP中文網其他相關文章!