2011-10-31 85 views
5

我想存儲一些信息如下(注意,我不是執着於這種數據結構可言,但是這表明你的基本信息要存儲):簡單的按價值搜索?

{ user_id: 12345, page_id: 2, country: 'DE' } 

在這些記錄,user_id是唯一字段,但page_id不是。

我想轉換成Redis的數據結構這一點,我想能夠運行有效的搜索如下:

  • 對於USER_ID 12345,找到相關的國家。
  • 對於page_id 2,找到所有相關的user_ids及其國家。

是否真的有可能在Redis中做到這一點?如果是這樣,我應該使用什麼樣的數據結構,以及當我插入時應該如何避免重複記錄的可能性?

回答

4

這聽起來像你需要兩種密鑰類型:一個HASH密鑰存儲您的用戶數據,以及包含相關用戶列表的每個頁面的LIST。下面是一個如何工作的例子。

加載數據:

> RPUSH page:2:users 12345 
> HMSET user:12345 country DE key2 value2 

提取數據:

# All users for page 2 
> LRANGE page:2:users 0 -1 

# All users for page 2 and their countries 
> SORT page:2:users By nosort GET # GET user:*->country GET user:*->key2 

刪除用戶從頁面:在排序

> LREM page:2:users 0 12345 

重複GET來爲用戶檢索附加價值。

我希望這可以幫助,讓我知道如果有什麼你想澄清或如果你需要進一步的援助。我還建議閱讀redis web site上提供的命令列表和文檔,特別是有關SORT操作的文檔。

+0

謝謝 - 實際上我結束了使用HASH和SET,而不是列表 - 但很好的答案! – Richard

1

由於user_id是唯一的,country也是唯一的,因此請將它們保存在簡單的鍵值對中。在這種情況下爲用戶查詢是O(1)...然後,保留一些Redis sets,其中關鍵的page_id和成員的所有user_ids ..

+0

謝謝。我對此的擔心是:如果您將新用戶插入到鍵值中,那麼*之前*可以添加設置條目,數據庫就會關閉?當它回來時,你會留下討厭的半信息。 – Richard

+1

在這種情況下,您有兩種選擇:在客戶端代碼中保留某種狀態,換句話說,檢查每次操作後redis返回的結果,並在出現故障時採取相應措施,或者使用http:// redis。 IO /命令#交易; – hymloth

+1

我認爲[Pipelining](http://redis.io/topics/pipelining)是不錯的選擇 –