php-redis中scan命令使用脚本


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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章