在利用phpredis扩展使用阿里云集群版Redis时,scan命令出现了奇怪的问题。集群节点0的CPU占用率飙到100%,数据却出不来。
跟踪scan的代码后发现,scan的游标卡在了72057594037927936上(2的56次方)。因为用的是phpredis官方文档提供的do{}while()方式循环扫描,游标卡在72057594037927936上就导致了死循环。这也解释了为什么CPU会飙到100%。
而使用Redis Desktop Manager管理Redis内容,使用scan方法管理列出key时,并未出错,但游标可以达到500000000000000000以上。
由此可以判断,phpredis在读取scan返回游标时可能发生了溢出。
在几乎不可能改动phpredis扩展的代码的情况下,好在phpredis支持直接执行命令,配合阿里redis集群版的自研命令iscan进行查询还是可以满足需求。(详见https://help.aliyun.com/knowledge_detail/51306.html)/**
* Send arbitrary things to the redis server.
* @param string $command Required command to send to the server.
* @param mixed ...$arguments Optional variable amount of arguments to send to the server.
* @return mixed
* @example
*
* $redis->rawCommand('SET', 'key', 'value'