2011-08-06 29 views
153

redis中按鍵的常規命名約定是什麼?我已經看到由:分隔的值,但我不確定正常的約定是什麼,或者爲什麼。Redis的關鍵命名約定?

對於用戶,你會做這樣的事情......

user:00

如果用戶的ID是00

您可以查詢的關鍵剛開始的時候,返回的所有用戶?

我主要只是希望通過研究爲人們工作的方式以及他們爲什麼選擇他們而避免任何未來的問題。

回答

125

redis中按鍵的常規命名約定是什麼?我已經看到 的值被分隔:但我不確定正常的約定是什麼, 或爲什麼。

是的,冒號:是命名密鑰時的慣例。在redis網站的this教程中聲明:嘗試堅持一個模式。比如「object-type:id:field」可以是 的一個不錯的主意,就像在「user:1000:password」中一樣。我喜歡用 多字段字段,如「評論:1234:reply.to」中的點。

您是否能夠查詢鍵,返回所有 用戶僅僅是個開始?

如果你的意思是像成才直接查詢與user:開始有一個keys命令所有的鍵。這個命令應該僅用於調試目的,因爲它是O(N),因爲它正在搜索數據庫中的所有按鍵。

這個問題比較合適的解決方案是創建專用按鍵,讓我們的名字是users,將存儲所有用戶的密鑰,例如在listset數據結構。

+0

這不是一個約定,但它與URI格式類似,這使得它在其他地方很常見。 – Gustav

+0

@Gustav在瀏覽URI格式的wiki頁面時,我無法弄清楚這個redis事實上的標準與URI格式是什麼樣的。你可以解釋嗎? – CivFan

+0

我在那個wiki頁上討論'urn:example:animal:ferret:nose'。 – Gustav

5

我不知道Redis鍵命名是否真的存在普遍的「最佳實踐」。

我已經嘗試使用ASCII NUL字符作爲我的分隔符(因爲Redis和Python都是8位乾淨的)。如果您正在查看原始密鑰,它看起來有點難看,但想法是將其隱藏在抽象層後面。只要你的名字空間的組件保證不使用它們,或者你願意按需要對每個組件進行編碼,冒號和管道符號就是明顯的選擇。但是,如果你想對它們進行編碼,那麼你需要開發抽象層並避免查看原始密鑰......這使我回到了在我的推理中使用\ 0。

我會很高興看到有沒有其他意見在此表達。

18

我們使用冒號(:)作爲名稱空間分隔符和散列(#)作爲鍵的id部分,例如,:

logistics:building#23 
+0

如果您擁有更多按鍵(如語言環境,類別等),最佳姓名約定是什麼? {resource}:{key}#{value},{key}#{value} => texts:locale#en,category#15?或者你有其他建議? – fsasvari

+1

在我的例子中,「building」只是「collection」的名稱,而23是自定義的「id」。如果你有一個locale = en和category = 15的複合id,那麼實際的id可以是{en,15},所以namespace:texts#{en,15},或者更加冗長:namespace:texts#{locale = EN,類別= 15}。但這只是一個想法,我從來沒有像這樣使用過它。小心不要改變id元素的順序,因爲當然不會找到這個鍵。實際上,不要在關鍵名稱中編碼這種複雜性,而應考慮使用redis數據結構。看看https://redis.io/topics/indexes –

10

的公約似乎是冒號(:) 我是一個web開發人員,所以我個人比較喜歡的分隔符斜槓(/)。斜槓在URLs中已經是非常重要的分隔符,它們的含義是Uniform Resource Locators這樣的資源鍵。爲什麼要用冒號(:)來採取不同的方法?它有助於任何事情嗎?

考慮這個例子:

我們對玩具對象的RESTful API。有一個:

http://example.com/api/toy/234 

我們在哪裏存儲它?我們使用Redis和斜槓,所以關鍵是顯而易見的:

toy/234 

這是玩具的唯一鍵。密鑰現在可以也用於在客戶端:

{ 
    key: "toy/234", 
    color: "red", 
    url: function() { 
     return API_BASE_URL + this.key; 
    } 
} 

一個用戶請求的對象與關鍵toy/666。如何從Redis中獲取?使Node.js的相關例子:

redis.get(key, function reply_callback(error, toystring) { 
    var toy = JSON.parse(toystring); 
    ... 
} 

無需斜槓轉換爲冒號,反之亦然。方便,你不覺得嗎?

+19

...方便,幾乎*可惡*不安全。你正在請求'curl http://example.com/api/user/1/password''d或類似的。 (Just sayin') – ELLIOTTCABLE

+2

可以使用冒號,散列和斜槓來指定不同級別的嵌套,例如, '用戶#23:上傳:my/path/to/file.ext' – incarnate

+20

請不要將用戶輸入作爲密鑰輸入到數據庫中。 – Lyle