项目中使用Redis的游标scan的一些小问题

Posted 梁老师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了项目中使用Redis的游标scan的一些小问题相关的知识,希望对你有一定的参考价值。

      最近项目中有一个需求就是在下拉中要筛选车辆列表,本来想着是在内存中全部用程序去遍历处理,但发现数据有点多,一个个去处理会有点慢。然后就找到了redis的游标

感觉这个能满足我的需求,我可以把key存成车牌号,value为车辆id的值,通过正则匹配到车牌号就能获取车辆id来查找信息了。思路有了,接下来就开工了。

    在官网上找到这么一段程序

 

/* 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";

这段程序在我的环境会有问题(php7). 会报  Parameter 1 to Redis::scan() expected to be a reference, value given

应该是那个游标对象$it得用引用。所以需要改成call_user_func_array调用

 

$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 ($array = call_user_func_array(array($redis, ‘scan‘), array(&$it)) {
    foreach ($arr_keys as $str_key) {
        echo "Here is a key: $str_key\n";
    }
}
echo "No more keys to scan!\n";

用上面的程序,就能通过游标把所有符合的值取出来。在业务层使用就行了

以上是关于项目中使用Redis的游标scan的一些小问题的主要内容,如果未能解决你的问题,请参考以下文章

Redis-Jedis使用Scan实现redis前缀key查找

Redis命令:scan实现模糊查询

redis之Scan

Redis中scan命令踩坑,一定要记住!千万不要乱用

Redis中scan命令踩坑,本文告诉你千万别乱用!!不看后悔

redis scan count的含义/二进制安全问题