php redis(new redis())getKeys()方法正在使用;钥匙*”;或;扫描";有迭代吗?
我使用的是php redis软件包,这些软件包大部分在最流行的repos中提供。你称之为php redis(new redis())getKeys()方法正在使用;钥匙*”;或;扫描";有迭代吗?,php,redis,key,Php,Redis,Key,我使用的是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 SCA
$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()
是否已“安全生产”避免使用“键*”?您可以从中看到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()
和迭代。正如您所说,对于生产环境:
<强>警告:< /强>将键视为只应在生产环境中极其谨慎地使用的命令。当它在大型数据库上执行时,可能会破坏性能。此命令用于调试和特殊操作,例如更改键空间布局。不要在常规应用程序代码中使用密钥。如果您正在寻找在键区的一个子集中找到键的方法,请考虑使用扫描或设置。
我想您正在寻找
HSET
和HGETALL
。HGETALL是异步的吗?还是以与“键*”相同的方式阻塞?如果我使用键值存储,并且每天有几次我通过类似“something.*”的匹配模式搜索键值,那么你确定HSET是最理想的数据集吗?啊,那么我最终使用的是PhpRedis。“predis”的存在让我困惑。谢谢,他们(phpredis)甚至在github上的文档中有一个很好的代码示例用于扫描。@dszakal据我所知,您使用的是PHP扩展而不是包(即来自composer),因此您没有使用,而是。