我使用哈希鍵來存儲用戶的細節,如:如何在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 = 25
,name = lee
用戶。如何在給定字段中搜索指定的值?
我使用哈希鍵來存儲用戶的細節,如:如何在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 = 25
,name = lee
用戶。如何在給定字段中搜索指定的值?
你不能。 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
我面臨同樣的設計問題,但我的問題是在命令「華夏時代:25名稱:李」之後,結果應該是id列表。所以我需要第二次查詢以獲取真實的用戶數據。這是唯一的方法嗎? – 2013-10-04 01:52:11
如果要執行一個往返,服務器端Lua的腳本將做你想做的(即燒結,然後每個選定的項目一個hgetall)。 – 2013-10-04 07:08:39
維護HASH本身並沒有意義,因爲您已經存儲了所有HASH字段的反向索引。 – droidlabour 2015-01-25 17:43:31
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你可以在兩步中做到這一點,把你需要的任何數量的值放在鍵中找到它們。但考慮將所有值放入關鍵字並不是一個好主意。只需放入需要進行過濾的值。乾杯:)
雖然這可能有效,但我真的會建議不要這樣做,以免造成嚴重的後果。在Redis文檔中,針對在生產環境中使用KEYS命令存在特定警告,因爲它可能會降低大型數據庫的性能:https://redis.io/commands/keys。 – xiy 2017-08-13 22:49:45
在Redis的文件最近添加的頁提供了有關[與Redis的副索引]的詳細信息(http://redis.io/topics/indexes),並涵蓋在[非範圍索引]這種情況下(HTTP ://redis.io/topics/indexes#non-range-indexes)部分。 – 2016-03-04 14:51:28