redis scan php没有游标,PHP7+REDIS3.2 phpredis scan命令 游标问题

标签:

redis 中匹配某些key的方法一般有keys和scan两种方式,但是鉴于直接在线上执行keys操作可能会造成Redis卡死等问题,所以想看有哪些keys,只能使用scan来操作了。在Redis命令行下操作没啥问题:

SCAN 游标 MATCH 模式 COUNT

每次执行都会返回当前遍历到了哪个槽位和是否找到了对应的key

项目中使用了Phpredis扩展,所以想着用程序来遍历一下看看,一开始按照phpredis官网文档提供的代码示例执行

:这是官方文档,我在PHP7下执行了一下,发现并没有结果。。。。。。。

scan

Description: Scan the keyspace for keys

Parameters

LONG (reference): Iterator, initialized to NULL STRING, Optional: Pattern to match LONG, Optional: Count of keys per iteration (only a suggestion to Redis)

Return value

Array, boolean: This function will return an array of keys or FALSE if Redis returned zero keys

Example

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

然后从网上搜了一下,发现有 $redis->scan($it,$match,$count)的,这样好像能搜到一些key,但还是不行。

我的理想情况是跟命令行一样,每次scan能够返回一个游标的位置和这次扫描出的keys。。。。。。。。。

最后是同事写了一个版本,这个版本可以

$it = null;

$match = 'zhongce:activity_vote*';

$count = 10000;

$index = 0;

$redis->setOption(Redis::OPT_SCAN,Redis::SCAN_RETRY);

$iterator = null;

while ($keys = call_user_func_array(array($redis, 'scan'), array(&$it, $match))) {

foreach ($keys as $key) {

echo $key . PHP_EOL;

}

}

上面是没加count的版本,会直接遍历出所有满足条件的keys,你也可以加上count限制每次遍历的数量。。。。。。。。。。

标签:

来源: http://blog.51cto.com/fulin0532/2336474

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值