首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >php(新的Redis()) getKeys()方法使用的是“键*”或“扫描”与迭代?

php(新的Redis()) getKeys()方法使用的是“键*”或“扫描”与迭代?
EN

Stack Overflow用户
提问于 2017-10-17 15:21:11
回答 1查看 521关注 0票数 1

我正在使用php-redis软件包,大部分在大多数流行的repos中可用。你称之为

代码语言:javascript
复制
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

如果我想的话

代码语言:javascript
复制
$var = $redis->getKeys('something.*');

在后端,它会进行同步和阻塞吗?

代码语言:javascript
复制
KEYS something.*

或者以非阻塞的方式迭代使用扫描,允许并发线程作为

代码语言:javascript
复制
SCAN 0 MATCH something.* COUNT 10
SCAN $iteratorFromLastCall MATCH something.* COUNT 10
... 
while ($iteratorFromLastCall > 0);

或者类似的东西?

由于前者不应该在生产中使用,并且在开发过程中不显示问题,因此后者“不太可靠”,但对于高可用性的需求则更可靠。

我需要用吗?

代码语言:javascript
复制
$redis->scan()

并自己迭代游标,或者

代码语言:javascript
复制
$redis->getKeys()

“生产安全”是否已经避免了“密钥”?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-17 15:39:28

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

代码语言:javascript
复制
/* {{{ proto array Redis::getKeys(string pattern)
 */
PHP_METHOD(Redis, getKeys)
{
    REDIS_PROCESS_KW_CMD("KEYS", redis_key_cmd, redis_mbulk_reply_raw);
}
/* }}} */

因此,您需要使用第二个选项,使用scan()和迭代。正如您所说,用于生产环境的不建议

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46793672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档