[英]php-redis (new Redis()) getKeys() method is using "KEYS *" or "SCAN" with iterations?
我使用的 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);
或者類似的東西?
由於前者不應該在生產中使用並且在開發過程中沒有顯示任何問題,因此后者雖然“不太有保證”,但對於高可用性要求更可靠。
我是否需要使用
$redis->scan()
並自己迭代光標,或者
$redis->getKeys()
已經“生產安全”避免“KEYS *”了嗎?
在源碼中可以看到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
:
警告:將 KEYS 視為僅應在生產環境中極其小心地使用的命令。 當它針對大型數據庫執行時,它可能會破壞性能。 此命令用於調試和特殊操作,例如更改鍵空間布局。 不要在常規應用程序代碼中使用 KEYS。 如果您正在尋找一種在鍵空間子集中查找鍵的方法,請考慮使用 SCAN 或集合。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.