我正在使用php-redis软件包,大部分在大多数流行的repos中可用。你称之为
$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);或者类似的东西?
由于前者不应该在生产中使用,并且在开发过程中不显示问题,因此后者“不太可靠”,但对于高可用性的需求则更可靠。
我需要用吗?
$redis->scan()并自己迭代游标,或者
$redis->getKeys()“生产安全”是否已经避免了“密钥”?
发布于 2017-10-17 15:39:28
您可以在来源中看到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()和迭代。正如您所说,用于生产环境的不建议:
警告:认为键是一种命令,应该非常小心地在生产环境中使用。当对大型数据库执行时,它可能会破坏性能。此命令用于调试和特殊操作,例如更改键空间布局。不要在常规应用程序代码中使用密钥。如果您正在寻找在键空间子集中查找键的方法,请考虑使用扫描或集合。
https://stackoverflow.com/questions/46793672
复制相似问题