我面臨加速我的應用程序(用PHP編寫,簡單的GET服務)的需求,我決定將它從RDBMS方法轉移到Redis。在我的關係數據庫研究的支出如何做到這一點,並考慮了一個星期,我有很多的表有很多領域我的Redis做了這樣的結構: {nameOfTable:clientID:itemID}
,例如Redis和大量的鍵
SET clientSubjects:1:1 bigJSONStringHere1
SET clientSubjects:1:2 bigJSONStringHere2
SET clientSubjects:1:3 bigJSONStringHere3
SET clientSubjects:2:1 bigJSONStringHere4
SET clientSubjects:2:2 bigJSONStringHere5
SET clientSubjects:2:3 bigJSONStringHere6
等
而且我有大約2000萬個客戶,每個客戶有4-10個主題,所以它大約有1.5億個密鑰。 要找到所有客戶的主題,每次我收到某個客戶的請求時都必須使用SCAN
。我面臨的一個問題,當我裝完所有的客戶端的Redis,命令
scan 0 match clientSubjects:{someID}:* count 100
回報:
1) "7241728"
2) (empty list or set)
而且......我的決定是找到Redis的存儲密鑰的總數,並用它作爲COUNT
的說法。
這看起來像:
local keyspace = redis.call("info", "keyspace")
local keysCount = keyspace:match("keys=(%d+),")
local result = redis.call("SCAN", 0, "match", "clientSubjects:" .. ARGV[1] .. ":*", "count", keysCount) --ARGV means I pass clientID to lua script
所以一切工作正常,除了它需要大約3秒來執行!但我需要它幾毫秒......我該怎麼辦?
親愛的達莎,這個問題可以通過很多原因關閉,但出於好奇,爲什麼redis?例如。 mongo應該對這個用例非常有用。 –
@AlexBlex因爲我需要一些緩存系統將數據存儲在內存中 – Daria
不夠公平。最明顯的建議是檢查它是否適合內存,檢查緩慢日誌中報告的內容,並詢問如何解決確切的問題。一般來說,最好使用集合來按客戶分組。 –