date:20200413
php-redis中scan命令使用腳本
項目中需要對某部分前綴的key進行遷移清洗,由於keys命令會造成redis阻塞,所以用scan進行匹配。目前的scan的demo樣例存在各種問題,現貼出本文的可執行腳本
目標:將滿足前綴的key集合返回
本文可執行腳本
function matchTglUser(){
$redis = new Redis();
$redis->connect('localhost', 6379);
$redis->setOption(Redis::OPT_SCAN, Redis::SCAN_RETRY); //設置迭代
$match = 'test*'; //匹配模式
$iterator = null;
$count = 100000; //迭代步長
while ($keys = call_user_func_array(array($redis, 'scan'), array(&$iterator, $match, $count))){
foreach ($keys as $key) {
echo "Here is a key: $key\n";
}
}
echo "No more keys to scan!\n";
}
官方demo
//第一種方式
/* Without enabling Redis::SCAN_RETRY (default condition) */
$it = NULL;
do {
// Scan for some keys
$arr_keys = $redis->scan($it);
// Redis may return empty results, so protect against that
if ($arr_keys !== FALSE) {
foreach($arr_keys as $str_key) {
echo "Here is a key: $str_key\n";
}
}
} while ($it > 0);
echo "No more keys to scan!\n";
//第二種方式
/* With Redis::SCAN_RETRY enabled */
$redis->setOption(Redis::OPT_SCAN, Redis::SCAN_RETRY);
$it = NULL;
/* phpredis will retry the SCAN command if empty results are returned from the
server, so no empty results check is required. */
while ($arr_keys = $redis->scan($it)) {
foreach ($arr_keys as $str_key) {
echo "Here is a key: $str_key\n";
}
}
echo "No more keys to scan!\n";
在執行官方demo時遇到部分問題,可直接參考本文的實現腳本