溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Redis中用scan替換keys的方法

發(fā)布時間:2020-05-21 15:28:50 來源:億速云 閱讀:454 作者:鴿子 欄目:關(guān)系型數(shù)據(jù)庫

我們都知道查找 Redis 的鍵時,可以使用 keys pattern,但當(dāng) key 太多時,keys 命令的效率就很低,如果在線上直接使用,甚至可能發(fā)生生產(chǎn)事故,這時候,我們不妨使用 scan 命令。

SCAN 命令是一個基于游標(biāo)的迭代器(cursor based iterator):

SCAN 命令每次被調(diào)用之后, 都會向用戶返回一個新的游標(biāo), 用戶在下次迭代時需要使用這個新游標(biāo)作為 SCAN 命令的游標(biāo)參數(shù), 以此來延續(xù)之前的迭代過程。

當(dāng) SCAN 命令的游標(biāo)參數(shù)被設(shè)置為 0 時, 服務(wù)器將開始一次新的迭代, 而當(dāng)服務(wù)器向用戶返回值為 0 的游標(biāo)時, 表示迭代已結(jié)束。

生成 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 查看個數(shù)

keys c*

Redis中用scan替換keys的方法

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;
// 務(wù)必設(shè)置,如果沒掃描到,繼續(xù)掃描,而不是返回空,否則while直接退出,遍歷就會不準(zhǔn)確
$redis->setOption(\Redis::OPT_SCAN, \Redis::SCAN_RETRY);
$total = [];
$i = 0;
// $count可以不設(shè)置,非必需參數(shù)
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的方法

當(dāng)然你也可以不使用 \Redis::OPT_SCAN, \Redis::SCAN_RETRY 這兩個參數(shù),自行循環(huán),判斷返回值是不是 false,也能遍歷成功。

以上就是Redis 中如何使用 scan 替換 keys的詳細(xì)內(nèi)容,更多請關(guān)注億速云其它相關(guān)文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI