簡體   English   中英

php-redis (new Redis()) getKeys() 方法是否使用“KEYS *”或“SCAN”進行迭代?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM