2012-07-13 87 views
25

我使用哈希鍵來存儲用戶的細節,如:如何在redis中搜索散列鍵?

hmset user:1 user_name lee age 21 
hmset user:2 user_name david age 25 
hmset user:3 user_name chris age 25 

我需要尋找有age = 25name = lee用戶。如何在給定字段中搜索指定的值?

+0

在Redis的文件最近添加的頁提供了有關[與Redis的副索引]的詳細信息(http://redis.io/topics/indexes),並涵蓋在[非範圍索引]這種情況下(HTTP ://redis.io/topics/indexes#non-range-indexes)部分。 – 2016-03-04 14:51:28

回答

47

你不能。 Redis是一個關鍵值存儲,而不是關係數據庫。

爲了搜索特定的數據,你需要建立對這些數據的訪問路徑。例如,要獲得年齡= 25的用戶,您需要構建一個索引以將年齡值映射到用戶。它可以用一套完成。名稱也是如此。

一旦你有套年齡和名字,你可以通過相交的集合進行搜索的用戶。例如:

# Add 3 users 
hmset user:1 user_name lee age 21 
hmset user:2 user_name david age 25 
hmset user:3 user_name chris age 25 

# Maintain age index 
sadd age:21 1 
sadd age:25 2 3 

# Maintain name index 
sadd name:lee 1 
sadd name:david 2 
sadd name:chris 3 

# Get the ID of users having age = 25 and name = lee 
sinter age:25 name:lee 
    -> will return an empty set 
+0

我面臨同樣的設計問題,但我的問題是在命令「華夏時代:25名稱:李」之後,結果應該是id列表。所以我需要第二次查詢以獲取真實的用戶數據。這是唯一的方法嗎? – 2013-10-04 01:52:11

+4

如果要執行一個往返,服務器端Lua的腳本將做你想做的(即燒結,然後每個選定的項目一個hgetall)。 – 2013-10-04 07:08:39

+0

維護HASH本身並沒有意義,因爲您已經存儲了所有HASH字段的反向索引。 – droidlabour 2015-01-25 17:43:31

2

Acually你可以放值做到在關鍵

HMSET lee:25 user_name lee age 25 
HMSET massi:43 user_name massi age 43 
HMSET lee:24 user_name lee age 24 
HMSET lee:28 user_name lee age 28 city Berlin 

現在你可以用 「鑰匙」 命令,找到他們

127.0.0.1:6379> keys *:25 
1) "lee:25" 
127.0.0.1:6379> keys lee* 
1) "lee:25" 
2) "lee:24" 
3) "lee:28" 
127.0.0.1:6379> keys massi:43 
1) "massi:43" 

最後找到具體的哈希

127.0.0.1:6379> HGETALL lee:24 
1) "user_name" 
2) "lee" 
3) "age" 
4) "24" 

所有的,我說的是THA你可以在兩步中做到這一點,把你需要的任何數量的值放在鍵中找到它們。但考慮將所有值放入關鍵字並不是一個好主意。只需放入需要進行過濾的值。乾杯:)

+0

雖然這可能有效,但我真的會建議不要這樣做,以免造成嚴重的後果。在Redis文檔中,針對在生產環境中使用KEYS命令存在特定警告,因爲它可能會降低大型數據庫的性能:https://redis.io/commands/keys。 – xiy 2017-08-13 22:49:45