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时遇到部分问题,可直接参考本文的实现脚本