2011-08-06 62 views
153

Redisのキーの通常の命名規則は何ですか?値が:で区切られているのを見たことがありますが、通常の規約が何であるか、またはその理由がわかりません。ユーザーのIDが00Redisキーの命名規則

は、すべてのユーザーを返すために、キーのほんの始まりを照会することができていますした場合は、ユーザーのために

あなたが何かのような...

user:00

を行うだろう?

私は主に、人々のために働く方法とその理由を研究することで、将来の問題を避けることを望んでいます。

答えて

125

redisのキーの通常の命名規則は何ですか? の値は次のように区切られていますが、通常の規則である 、またはその理由がわかりません。

はい、コロン記号:は、キーを命名するときの規則です。 thisでredisウェブサイトのチュートリアルが記載されています:スキーマを固執してみてください。たとえば、 "object-type:id:field"は "user:1000:password"のように という素晴らしいアイデアです。私は マルチワードフィールドのドットを "comment:1234:reply.to"のように使用します。

すべて のユーザーを返すために、キーのほんの始まりを照会することができますか?

あなたは直接そのためkeysコマンドがあるuser:で始まるすべてのキーを照会などのいろいろ書いを意味する場合。ただし、このコマンドはデバッグの目的でのみ使用する必要があります.O(N)です。これは、データベース内のすべてのキーを検索しているためです。

この問題のより適切なソリューションは、listまたはsetのデータ構造など、すべてのユーザーキーを格納するusersという名前の専用キーを作成することです。

+0

これは規約ではありませんが、URI形式と似ていますので、どこにでも共通しています。 – Gustav

+0

@GustavはURI形式のwikiページを見ていますが、実際の標準がどのようにURI形式のようなものであるのかわかりません。説明できますか? – CivFan

+0

私は、そのwikiページで 'urn:example:animal:ferret:nose'について話しています。 – Gustav

5

Redisのキーネーミングには、まだ「ベストプラクティス」が広く普及しているかどうかはわかりません。

私はセパレータとしてASCII NUL文字を使用して実験しました(RedisとPythonはどちらも8ビットクリーンなので)。生のキーを見ていると少し醜いですが、考え方は抽象レイヤの背後に隠すことです。コロンとパイプ記号は、名前空間のコンポーネントがそれらを使用しないことが保証されているか、必要に応じて各コンポーネントをエンコードする意思がある限り、明白な選択肢です。しかし、もしあなたがそれらをエンコードするなら、抽象レイヤーを開発して、とにかく生の鍵を見ることを避けたいと思うでしょう。それは私の主張に\ 0を使用するだけに私を戻しました。

これに他の意見が明記されているかどうかは面白いでしょう。

18

名前空間の区切り文字としてコロン(:)を使用し、キーのid-partにハッシュ(#)を使用します。:

logistics:building#23 
+0

ロケール、カテゴリなどのキーが多い場合、 {リソース}:{キー}#{値}、{キー}#{値} =>テキスト:ロケール#en、カテゴリ#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

規約はので、私は個人的にセパレータにスラッシュ(/)を好む私は、ウェブ開発者だコロン(:) しかしのようです。スラッシュはすでにURL内で重要なセパレータであり、Uniform Resource Locatorsというようにリソースの種類のキーを意味します。コロン(:)で別のアプローチを取る理由は?それは何かを助けるか?

は、この例を考えてみましょう:

私たちは、おもちゃのオブジェクトのためのRESTful APIを持っています。 1つがあります:

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、または同様のものを手に入れようとしています。 – ELLIOTTCABLE

+2

コロン、ハッシュ、およびスラッシュを使用して、さまざまなレベルの入れ子を指定できます(例: 'User#23:uploads:my/path/to/file.ext' – incarnate

+20

ユーザの入力をキーとしてデータベースに入力しないでください。 – Lyle