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時遇到部分問題,可直接參考本文的實現腳本

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