2014-04-07 66 views
1

我今天使用redis開始,我經歷過的教程和計算器一定的聯繫,但我不理解如何正確使用Redis的東西它似乎是一個非常簡單的用例。Redis:如何存儲用戶散列列表並檢索它?

目標:將多個用戶數據保存到redis中,並一次讀取所有用戶。

我開始Redis的客戶,我通過添加具有ID 1第一個用戶開始:

127.0.0.1:6379> hmset user:1 name "vitor" age 35 
OK 
127.0.0.1:6379> hgetall user:1 
1) "name" 
2) "vitor" 
3) "age" 
4) "35" 

我添加一些更多的用戶的,做幾個命令像這樣的:

127.0.0.1:6379> hmset user:2 name "nuno" age 10 

我當時(可能錯誤地)期待能夠通過這樣做來查詢我所有的用戶:

hgetall "user:" 

甚至

hgetall "user:*" 

,我從來沒見過這樣的事情在教程的事實,那種告訴我,我沒有使用Redis的適合這種使用情況。

你能告訴我應該是什麼這個用例的方法呢?

回答

6

要了解爲什麼這些類型的操作都必須在NoSQL的實現顯得不平凡,這是很好的思考爲什麼NoSQL的存在(並已成爲非常流行),在所有。

當你看到在早期的NoSQL實現像memcached的,第一個用例是很簡單,但很重要:一個極快的緩存分佈的數據,緩存例如網頁數據。非常迅速地增加了羣集和分片等功能,因此並非所有數據都必須在集羣中的每個節點上一次都可用,但可以根據需要收集。

NoSQL與關係數據存儲非常不同。不要過度使用它。考慮關係型數據庫也是如此,因爲它們有時候更適合你正在努力完成的任務。在你設計的所有東西中,問問你自己:「這個規模好嗎?」。

好的,回到你的問題。做通配符搜索通常是不好的做法。您可以通過可擴展的方式檢索數據來準備數據。

Redis是一個非常chique的解決方案,可以讓你克服了很多NoSQL的侷限性,一種優雅的方式。

如果獲得「所有用戶的列表」不是你必須經常做的事情,或者不需要很好地擴展,總是「我真的總是想要所有的用戶」,因爲它是每天無論如何掃描,使用HSCANSCAN正確批次的操作不會妨礙其他客戶端的操作,您可以一次檢索幾千條記錄,並在幾次調用之後獲得所有內容。

您還可以將用戶存儲在一個SET。沒有訂購,所以沒有分頁。它可以幫助保持您的用戶名唯一。

如果您想要執行諸如「讓我以字母'a'開頭的所有用戶」,我會使用ZSET。我將等待一兩週的ZRANGEBYLEX即將在我們發言的作品中公佈。或者使用像Josiah Carlsons的'rom'包這樣的ORM。

當你問自己「但現在我必須做三次調用,而不是一個時,存儲我的數據......?」:燁,這就是它的工作原理。如果您需要原子性,請使用Lua腳本或MULTI + EXEC流水線。 Lua通常更容易。

您還可以問問自己是否需要使用HSET。你需要檢索個人數據成員嗎?每個鍵或成員都有一些開銷。最重要的是,HGETALL的Big-O規格爲O(N),所以它不能很好地擴展。最好使用JSON或MsgPack將您的行作爲整體進行序列化,並將其存儲在一個HSET成員中,或者將其存儲在一個HSET成員中,或者將其存儲在一個簡單的GET/SET中。另請閱讀SORT

希望這有助於TW

+0

Hi @Tw Bert,謝謝你的回答。我總是考慮關係型數據庫,但是因爲在這種情況下,我沒有關係,所以我想存儲或查詢,我關於REDIS,因爲我只想存儲用戶並在大多數時間檢索它們。我想給你的解釋我可能想要一個SET,尤其是因爲在非常樂觀的情況下,用戶列表永遠不會超過1k。 – bitoiu

+1

不客氣。 1k是沒有用的,如果它只是局域網上的用戶標識,那麼這是一個很好的起點。如果您使用Azure或Heroku這樣的雲服務,它可能會變成一個不同的故事,您可能需要使用不同的redis數據類型來調整它。如果您事先發現潛在的問題,那從未如此難過。 –

2

如果你仍然想使用Redis的,你可以使用類似:

SADD用戶 「{」 用戶id 「:1,」 名「:約翰, 」維托爾「: X, 「年齡:35}」

SADD用戶 「{」 用戶id 「:2,」 名 「:XT, 」維托爾「:X,」 年齡:43}」 ...

你可以使用以下方法檢索:

SMEMB ERS用戶

+0

我仍然使用Redis,但最終我將用戶存儲在簡單的鍵中,但這也是一個不錯的選擇。 – bitoiu

相關問題