2015-08-21 118 views
1

鍵你怎麼尋找與紅寶石價值的鑰匙?例如,獲取值爲「somevalue」的所有KEYS。Redis的搜索與價值

我的鍵是

「XYZ」=> {:狀態=> 「連接」,:主題=> 「ABC」}

「PQR」=> {:狀態=> 「連接」 ,:主題=>「ABC」}

現在我需要找到所有的按鍵,其中的主題是「ABC」

+1

的[查找值鍵](可能重複的http://計算器。COM /問題/ 12745818 /查找鍵按值) – mudasobwa

回答

6

不管編程語言,有效地做到這一點,你需要保持一個「指數」鍵將某些值映射到鍵名稱。用一組或一個有序set這就是你應該平時做 - 即添加新鍵名稱,並根據它們的值刪除它們 - 當你想「搜索」拿到鑰匙的內容。

有一些庫(即寶石),其可以提供這種功能就可以使用 - 看看最優秀的Ohm你的情況。

EDIT

我的鍵是XYZ => {:狀態=> 「連接」,:主題=> 「ABC」} PQR => {:狀態=> 「連接」,:主題=>「ABC」}現在,我需要找到所有的按鍵,其中的主題是「ABC」

我將XYZ的值存儲爲一個字符串或哈希(取決於我是否需要更新/只閱讀的部分它與否)。然後,我會SADD topic:ABC xyzSMEMBERSSSCAN它來獲得與該主題相關的所有鍵的名稱。我也想嘗試記得從話題SREM相關成員:ABC當我DEL關鍵...

+0

我的鑰匙是 XYZ => {:狀態=> 「連接」:主題=> 「ABC」} PQR => {:狀態=> 「連接」:主題=>「ABC」} 現在我需要找到所有的按鍵,其中的主題是「ABC」 –

+0

你好我做mapped_hmset「XYZ」,{狀態:「連接」,主題爲:「ABC」 }。現在該如何前進。我猜如果我確實有污點,它會給我所有的「XYZ」值。如何搜索「ABC」 –

+0

當然,如果這就是你需要的。跟隨'SADD'並用'MULTI/EXE'封裝它的原子性。 –

1

取決於其Redis的版本,你可以使用Redis的> = 2.8.13或者你可以使用keysgetkeys命令照顧一些性能問題(如果你有幾個鍵不應該是一個問題,但如果你有大量的按鍵要注意這一點,因爲鍵命令將阻止爲了幾片刻的Redis來獲取所有鍵)

如果您正在運行Redis的2.8,你就可以使用scan命令代替鑰匙。

編輯:最近添加的Redis'文檔中提供了更多的信息,有關Secondary indexing with Redis和覆蓋下的Non range indexes節這種情況。在它的其他主題包括:

+0

我不同意 - '命令GETKEYS'沒有與此相關的所有,請RTFM。 'KEYS'不是你想要使用的命令...永遠(忘記阻塞,這是孩子的遊戲,OOM是你應該擔心的)。無論如何,'KEYS'和'SCAN'都需要時間和資源,所以如果你想快速回復,它們是一個糟糕的選擇。 –

+0

我同意這一點,我說,使用按鍵命令是不要做生產一個好東西,不是一個安全的solucion。但是,如果需要,可以使用redis解決方案和命令的一部分(例如,如果您正在調試開發或讀取從節點或您想要的任何內容)。 –

+0

如果你是一個開發或管理員還可以做'RM -rf /'':)是SCAN'沒有'KEYS'那麼糟糕,但它仍然需要O(N)遍歷密鑰空間(不提及發回密鑰名稱,然後對每個值進行讀取......)。作爲一種調試/臨時方法,無論如何。作爲解決應用程序需求的方法 - 從來沒有! (順便說一句,見Redis的誡VI:https://gist.github.com/itamarhaber/d125cec7ebc5ec3886ab) –