2014-04-01 94 views
0

查詢在Redis的多鍵我有redis的保持在以下格式優化通過節點

identifier:username:userid:categoryname 

例如某些關鍵:

Blacklist:tomhanks:12345:movies 
Blacklist:tomhanks:12345:music 
Blacklist:micaheljordan:23456:sports 
Blacklist:micaheljordan:23456:movies 

現在有次我有可用的用戶名和我一起在某些情況下與我一起使用。但是,我不知道哪一個可用。根據API要求,我可以選擇其中任何一個。所以我需要查詢兩次 - 一次使用用戶名 - 其次使用用戶ID。例如:

例如: KEYS Blacklist:tomhanks:* & KEYS Blacklist:*:12345:* 然後合併結果並相應地將從其他API獲取的類別列入黑名單。

我使用的NodeJS查詢這個Redis的實例,因此,而不是查詢兩次,我決定使用節點JS

node redis github example for multi command此頁面上的例子,我查詢Redis的實例multi exec在以下格式

client.multi([ 
    ["keys", "Blacklist:tomhanks:*"], 
    ["keys", "Blacklist:*:12345:*"] 
]).exec(function (err, replies) { 
    console.log(replies.toString()); 
}); 

但最近我在Redis的檢查由slowlog,我發現列表的頂部,還有一些查詢的超時之間EXEC命令。雖然KEYS的數量只有10000個。

另外間歇我得到的console.log消息node_redis: no callback to send error: ERR EXEC without MULTI

POA:

  1. 使用集,而不是KEYS以下列格式 KEY: Blacklist:tomhanks -> movies, music KEY: Blacklist:123456 -> movies, music
  2. 或以某種方式重新構建,其具有2的第二鍵Blacklist:*:12345:*通配符,因此相對較重 建議的結構將是 Blacklist:tomhanks:movies Blacklist:tomhanks:music Blacklist:12345:movies Blacklist:12345:music

由於每warning posted on this page about KEYS

Warning: consider KEYS as a command that should only be used in production environments with extreme care. It may ruin performance when it is executed against large databases. This command is intended for debugging and special operations, such as changing your keyspace layout. Don't use KEYS in your regular application code. If you're looking for a way to find keys in a subset of your keyspace, consider using sets.

是使用SETSKEYS一個更好的主意嗎?

+0

是相同的用戶名在你的情況下?如果不是,你必須通過組合userid進行搜索來找到一個特定的用戶,這會使情況變得更糟。 –

+0

是用戶名和特定用戶的用戶ID是唯一的 – swapnilsarwe

回答

0

從來沒有使用過KEYS命令,它完全阻止整個數據庫(Redis有一個用於處理命令的單個工作線程)響應該命令的持續時間(就像任何其他命令一樣)。與KEYS的區別在於它一次掃描並返回整個數據集。對於大型數據集,它可能被證明是有問題的。

Redis SCAN命令是你的朋友。 SCAN通過迭代匹配結果集(支持glob匹配,如KEYS)工作。直到所有結果都被返回。 這種迭代方法允許在查詢大數據集時進行「公平」的資源分配,因爲每次迭代處理數據的一小部分,並與其他命令「競爭」CPU時間。

你不必爲了掃描元件(儘管存在SSCAN變體)中使用集合,但它將對未來的影響(會羣集或停留在單機/定點模式