php-redis(new Redis())getKeys()方法正在使用" KEYS *"或" SCAN"迭代?

时间:2017-10-17 15:21:12

标签: php redis key

我使用的php-redis软件包主要在最受欢迎的回购中使用。你称之为

的人
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

如果我这样做

$var = $redis->getKeys('something.*');

在后端会进行同步和阻止

KEYS something.*

或者将迭代地使用非阻塞扫描,允许并发线程作为

工作
SCAN 0 MATCH something.* COUNT 10
SCAN $iteratorFromLastCall MATCH something.* COUNT 10
... 
while ($iteratorFromLastCall > 0);

或类似的东西?

由于前者不应该在生产中使用并且在开发过程中没有显示出任何问题,因此后者是“不太保证”#34;但是,对于高可用性要求更可靠。

我需要使用

吗?
$redis->scan()

自己迭代光标,或

$redis->getKeys()

已经"生产安全"避免" KEYS *"?

1 个答案:

答案 0 :(得分:1)

您可以在the source中看到getKeys()使用KEYS命令:

/* {{{ proto array Redis::getKeys(string pattern)
 */
PHP_METHOD(Redis, getKeys)
{
    REDIS_PROCESS_KW_CMD("KEYS", redis_key_cmd, redis_mbulk_reply_raw);
}
/* }}} */

所以你需要使用scan()并迭代你的第二个选项。正如您所说,KEYS is not recommended适用于生产环境:

  

警告:将KEYS视为一项只能在生产环境中使用的命令。在针对大型数据库执行时可能会破坏性能。此命令用于调试和特殊操作,例如更改键空间布局。不要在常规应用程序代码中使用KEYS。如果您正在寻找在密钥空间子集中查找密钥的方法,请考虑使用SCAN或集合。