正如@for_stack說,Hash
將非常適合你的情況。
你說過,每個用戶在db中索引的行數都是user_id
和tag_id
。所以它是(user_id,tag_id)唯一指定一行。每一行的功能依賴於這個元組,你可以使用元組作爲HASH KEY。
例如,如果你想保存行(USER_ID,TAG_ID,用戶名,年齡),該值( 「123456」, 「FDSA」, 「安區」,20)到Redis的,你可以這樣做:
HMSET 123456:FDSA username "gsz" age 30
當您想查詢與USER_ID和TAG_ID的用戶名,你可以這樣做:
HGET 123456:FDSA username
所以每一個散列鍵將是user_id
和tag_id
組合,如果你想關鍵更具人性化,您可以添加前綴字符串,例如「USERINFO」。例如:USERINFO:123456:FDSA
。
但是如果你只想查詢一個user_id並獲得所有具有這個user_id的行,上面的這個方法是不夠的。
你可以建立在Redis的的secondary indexes你HASH。
如上所述,我們使用user_id:tag_id
作爲HASH密鑰。因爲它可以唯一指向一行。如果我們想查詢關於一個user_id的所有行。
我們可以使用sorted set
建立一個二級索引,以便哈希存儲有關此user_id的信息。
我們可以在SortedSet的補充一點:
ZADD user_index 0 123456:FDSA
如上所述,我們設置了member
到string of HASH key
,並設置score
爲0和規則是,我們應該將所有評分在這個zset到0,然後我們可以使用字典順序來進行範圍查詢。請參閱zrangebylex。
E.g.我們想要得到的所有行約USER_ID 123456,
ZRANGEBYLEX user_index [123456 (123457
這將返回所有其前綴是123456的散列鍵,然後我們使用這個字符串作爲散列關鍵字和hget或hmget檢索信息來源,我們想要的東西。
[
表示包含性,(
表示排他性。以及爲什麼我們使用123457
?這很明顯。因此,當我們想要獲取具有user_id的所有行時,我們應該指定使user_id字符串的最左端字符的ascii值加1的上限。
有關lex索引的更多信息,請參閱上文提到的文章。
你所說的「進程外的內存數據庫表」呢? – Sameer
你的前端是什麼?一些像Asp.net這樣的託管環境具有輸出緩存或中間件緩存功能,如果符合您的需求,您還可以查看Elastic Search。我存儲的數據爲 –