Redis キーを検索するときに、keys パターンを使用できることは誰もが知っていますが、キーが多すぎると、keys コマンドの効率が非常に低くなります。直接使用すると、オンラインでは、本番が発生する可能性もあります。事故が発生した場合は、scan コマンドを使用した方がよいでしょう。
SCAN コマンドはカーソル ベースの反復子 (カーソル ベースの反復子
) です:
SCAN コマンドが呼び出されるたびに、新しいカーソルがユーザーに返されます。前の反復プロセスを継続するには、ユーザーは次の反復でこの新しいカーソルを SCAN コマンドのカーソル パラメーターとして使用する必要があります。
SCAN コマンドのカーソル パラメーターが 0 に設定されている場合、サーバーは新しい反復を開始し、サーバーが値 0 のカーソルをユーザーに返すと、反復が終了したことを示します。 。
#キーの生成
<?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*
スキャン トラバース
<?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::OPT_SCAN、\Redis::SCAN_RETRY ## を使用することもできません。 # これら 2 つのパラメータは、それ自体でループして戻り値が false かどうかを判断し、トラバーサルも成功する可能性があります。
redis についてさらに詳しく知りたい場合は、
redis データベース チュートリアル
以上がRedis でスキャンを使用してキーを置き換える方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。