2014-10-18 23 views
10

我是新來的Redis所以我做錯了什麼,我敢肯定:StackExchange.Redis server.Keys(模式:「IsVerySlow *」)

我存儲在大約16000鍵/值Azure Redis。

我用下面寫的鍵/值

 foreach (var worksheet in wksList) 
     { 
     var wksYYMM = string.Format("{0}{1:00}", worksheet.ReviewDt.Year, worksheet.ReviewDt.Month); 
     var wksKey = string.Format("{0}:{1}:{2}", provCode, wksYYMM, worksheet.AcctNbr); 
     string jsonStr = JsonConvert.SerializeObject(MakeWsListDto(worksheet, provCoderList, rvrList)); 
     cache.StringSet(wksKey, jsonStr); 
     } 

所以我的鑰匙是這樣的: 「AP:201401:AZ5798BK」

當我嘗試像查找:

var keys = server.Keys(pattern: "AP:201401:*"); // returns in milliseconds 
    var keyAry = keys.ToArray(); // returns in over one minute 
    (note: this returns 12 keys) 

它需要1分鐘12秒返回的鍵。一旦我有密鑰,需要幾毫秒來檢索這些值。如果我遍歷鍵的值並返回值,我會得到類似的結果。我做了一個ToArray()來隔離問題。

如果我嘗試在同一查詢redis的-cli.exe它回來以毫秒爲單位。

我使用這個命令是否有誤?

回答

15

server.KeysKEYS和基於服務器版本的優選SCAN之間自動選擇。我懷疑發生了什麼,因此您使用SCAN的頁面太小。有一個可選的頁面大小參數。請嘗試指定比默認值大得多的值 - 數百,數千等。如果未指定,則頁面大小使用Redis SCAN默認值10,這可能會導致需要執行大量往返操作。

+0

謝謝馬克我會試一試,讓你知道它是如何去的。這可以解釋爲什麼redis-cli.exe更快。 – Weej 2014-10-19 01:04:04

+1

Marc!是的,這是答案。一個後續問題:我進行了一些優化測試,發現在頁面大小達到2000的情況下,我的性能得到了提升,儘管它在1650年左右達到了穩定水平。此時,它在大約180毫秒的時間內穩定下來。兩個問題:頁面優化是數據庫大小還是密鑰大小的函數?第二個問題:頁面大小的內存分配是發生在客戶端還是服務器上?非常感謝您的回答! – Weej 2014-10-19 11:06:37

+0

這幫助我解決了與'server.Keys'類似的性能問題。謝謝! – G0dsquad 2017-02-07 10:54:59

6

不要使用KEYS - 它是阻塞命令在運行時會呈現你的Redis服務器無法爲其它請求。從command's documentation報價:

警告:考慮鍵作爲應當只在非常謹慎 生產環境中使用的命令。當它針對大型數據庫執行時,它可能會破壞性能 。此命令旨在 用於調試和特種作戰,如更改密鑰空間 佈局。請勿在常規應用程序代碼中使用KEYS。如果你 尋找一種方式來找到你的密鑰空間的一個子集密鑰,可以考慮使用 掃描或套。

如果您徹底閱讀了警告,您會注意到段落末尾的建議方法,即使用SCAN或Redis套件。 SCAN是非阻塞的,但由於您的問題表明您已進入性能,因此我建議使用套件。

的想法是保持Redis的設置與所有與該「模式」相關的鍵值名,所以在你的榜樣,你有你的呼叫cache.SetString後,例如做SADD AP:201401 AP:201401:AZ5798BK的StackExchange.Redis相當於:

cache.SetAdd(wksYYMM, wksKey); 

免責聲明:我不是一個C#程序員我也不是太熟悉了StackExchange.Redis(對不起馬克;))

現在,不用KEYS或掃描,讓您的鑰匙,只是做SMEMBERS AP:201401或大概:

var keys = cache.Members(wksYYMM); 

獎金:因爲你在這些鍵的值實際上有興趣,你可以使用Redis的Lua腳本獲取基於集合的成員鍵的值,或只使用SORT

純的Redis:

SORT AP:201401 BY nosort GET *` 

C#& StackExchange.Redis:

vals = cache.Sort(wksYYMM, by = "nosort", get = "*"); 
+2

server.Keys實際上自動使用SCAN(如果可用)。有關單獨答案的更多信息。 – 2014-10-18 13:15:10

+0

啊,非常聰明:) – 2014-10-18 14:23:08

+0

我很滿意實施,我必須承認。當您處理數據時,它將自動返回滾動/頁面的可枚舉序列。 – 2014-10-18 14:49:22

相關問題