2016-12-08 32 views
0

我面臨加速我的應用程序(用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秒來執行!但我需要它幾毫秒......我該怎麼辦?

+0

親愛的達莎,這個問題可以通過很多原因關閉,但出於好奇,爲什麼redis?例如。 mongo應該對這個用例非常有用。 –

+0

@AlexBlex因爲我需要一些緩存系統將數據存儲在內存中 – Daria

+1

不夠公平。最明顯的建議是檢查它是否適合內存,檢查緩慢日誌中報告的內容,並詢問如何解決確切的問題。一般來說,最好使用集合來按客戶分組。 –

回答

1

擁有2000萬條記錄,您將需要大量內存來存儲所有數據結構以及查詢它的不同方法。

要查找所有客戶的主題,例如,我將擁有一個名爲clientSubjects:{clientID}的名單,其中包含主題ID的值。

您應該擁有不同的數據結構以適合您的不同查詢,並避免使用類似SCAN的內容,因爲這不是最佳選擇。

在我看來,一些關係數據庫有一些良好的索引會更適合這個,它會爲您節省大量的時間和金錢,因爲索引通常在內存中保存並可以回退到磁盤。

請記住,Redis要求您將所有數據存儲在內存中,因此當您添加更多數據結構來解決不同的查詢類型時,這將變得更加昂貴。