• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

php使用redis的scan命令时遇到的坑

php 搞代码 4年前 (2022-01-22) 43次浏览 已收录 0个评论

使用keys命令可以得到设置的”test1″,”test2″,…..,”test5″这5个key,但是使用scan却什么也没有输出。

……

…………

………………

经过多方分析,最终发现,是scan命令的返回值有问题。

其实redis的官方文档也明确说了,scan命令每次迭代的时候,有可能返回空,但这并不是结束的标志,而是当返回的迭代的值为”0″时才算结束。

因此,上面的代码在迭代的时候,若没有key返回,$keys是个空数组,所以while循环自然就中断了,所以没有任何输出。

这种情况在redis中key特别多的时候尤其明显,当key只有几十个上百个的时候,很少会出现这种情况,但是当key达到上千万,这种情况几乎必现。

要减少这种情况的出现,可以通过将scan函数的第三个参数count设定为一个较大的数。但这不是解决此问题的根本办法,根本办法有以下两种:

1.setOption

通过setOption函数来设定迭代时的行为。以下是示例代码:

$redis = new Redis();$redis->connect('localhost', 6379);$redis->setOption(Redis::OPT_SCAN,Redis::SCAN_RETRY);$iterator = null;while ($keys = $redis->scan($iterator, 'test*')) {    foreach ($keys as $key) {        echo $key . PHP_EOL;    }}

和上面的代码相比,只是多了个setOption的操作,这个操作的作用是啥呢?这个操作就是告诉redis扩展,当执行scan命令后,返回的结果集为空的话,函数不返回,而是直接继续执行scan命令,当然,这些步骤都是由扩展自动完成,当scan函数返回的时候,要么返回false,即迭代结束,未发现匹配模式pattern的key,要么就返回匹配的key,而不再会返回空数组了。

2.while(true)

上面那种方式是由php的扩展%本文来源gaodai#ma#com搞*代#码9网#搞gaodaima代码自动完成的,那么我们也可以换一种写法来达到相同的效果。

$redis = new Redis();$redis->connect('localhost', 6379);$iterator = null;while (true) {    $keys = $redis->scan($iterator, 'test*');    if ($keys === false) {//迭代结束,未找到匹配pattern的key        return;    }    foreach ($keys as $key) {        echo $key . PHP_EOL;    }}

以上就是php使用redis的scan命令时遇到的坑 的详细内容,更多请关注搞代码gaodaima其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:php使用redis的scan命令时遇到的坑

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址