Redisのキーの命名規則?


226

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

ユーザーのためにあなたは次のようなことをしますか...

user:00

ユーザーのIDが 00

すべてのユーザーを返すために、キーの先頭のみを照会できますか?

私は主に、人々のために働く方法と彼らがそれらを選んだ理由を研究することによって、将来の問題を回避したいと思っています。

回答:


205

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

はい、コロン記号:はキーの命名規則です。ではこの Redisのウェブサイト上のチュートリアルに述べている:スキーマに固執するようにしてください。たとえば、「user-1000:password」のように、「object-type:id:field」は良いアイデアです。「comment:1234:reply.to」のように、複数単語のフィールドにドットを使用するのが好きです。

すべてのユーザーを返すために、キーの先頭のみを照会できますか?

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

この問題のより適切な解決策は、専用のキーを作成することです。名前をにするとusers、すべてのユーザーのキーがリストやデータ構造などに格納されます。


1
scanオプション@EranHではありません。キーを反復することがベストプラクティスです。scan要素のコレクションを段階的に反復するために使用されます。
キショールパワル

2
@ yojimbo87したがって、2つのコマンドがあるとします。最初は次のようにキーを作成することです-user:808021:password = XYZ、2つ目はキーをレジストリまたはインデックス(set)に配置することですが、1つのコマンドが正常に実行されたときに何が起こるでしょうか。その他の失敗は、キーが作成されたが、レジストリにエントリが取得されなかったことを意味します。
LoveToCode 2016

1
@LoveToCodeすべての操作が実行されるか、まったく実行されないことを保証するトランザクションを使用できます。
yojimbo87 2016

2
また、Redisデスクトップマネージャー(Redisクライアントツール)もコロン「:」を区切り文字として扱い、グループ化された複数のキーを表示することに気づきました
Adam Rotaru

1
ユニークな価値は最後にあると私は思います。次のようなことを簡単に実行できます$redis->delete($redis->keys('user:password:*'));
。–クレヨン

26

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

logistics:building#23

ロケール、カテゴリなどのより多くのキーがある場合、最良の命名規則は何ですか?{resource}:{key}#{value}、{key}#{value} => texts:locale#en、category#15?それとも他に提案がありますか?
fsasvari 2017

1
私の例では、「building」は単に「コレクション」の名前であり、23はカスタムの「id」です。locale = enとcategory = 15の複合IDがある場合、実際のIDは{en、15}、つまり、namespace:texts#{en、15}になるか、より詳細になる:namespace:texts#{locale = en、category = 15}。しかし、これは単なるアイデアであり、私はこのように使用したことはありません。もちろんキーが見つからないため、id要素の順序を変更しないように注意してください。実際には、キー名にこのような複雑さをエンコードする代わりに、代わりにredisデータ構造の使用を検討してください。見ていredis.io/topics/indexes
ネイル

16

規約はコロン(:)のように見えますが、私はWeb開発者なので、個人的には区切り記号としてスラッシュ(/)を好みます。スラッシュはURL内ですでに非常に重要な区切り文字であり、Uniform Resource Locatorであるため、リソースのキーの一種です。なぜコロン(:)で別のアプローチを取るのですか?それは何か助けになりますか?

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

我々は持っている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;
    }
}

ユーザーがkeyでオブジェクトをリクエストしますtoy/666。Redisから入手する方法は?Node.js関連の例:

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

スラッシュをコロンに、またはその逆に変換する必要はありません。便利だと思いませんか?

注:ユーザーが意図したものにのみアクセスできることを常に確認してください。上記の生のURLからキーへのアプローチはuser/1/password、コメンテーターによって指摘されているように、フェッチすることもできます。Redisを読み取り専用のパブリックキャッシュとして使用する場合、これは問題になりません。


24
…便利で、ほとんどうんざりするほど安全ではありません。あなたはcurl http://example.com/api/user/1/password「d」または同様のものを得ることを懇願しています。(ただ言うだけです。)
ELLIOTTCABLE

3
コロン、ハッシュとスラッシュがネストの異なるレベルを指定するために使用することができ、例えばUser#23:uploads:my/path/to/file.ext
化身

31
ユーザー入力をデータベースのキーとして使用しないでください。
2015

1
あなたはあなたがウェブ開発者だからスラッシュを好むと思った方法が好きです。
Hector Ordonez

@ELLIOTTCABLEおかげで、不安についてのメモが追加されました。Redisが読み取り専用のパブリックキャッシュとして使用されている場合、このアプローチで問題が発生しますか?
AkseliPalén18年

6

Redisのキーの命名に「ベストプラクティス」が本当に広く普及しているかどうかはまだわかりません。

ASCII NUL文字をセパレーターとして使用して実験しました(RedisとPythonはどちらも8ビットクリーンであるため)。生のキーを見ると少し見苦しいように見えますが、その概念は抽象化レイヤーの背後にそれを隠すことです。コロンとパイプ記号は、名前空間のコンポーネントがそれらを使用しないことが保証されているか、必要に応じて各コンポーネントをエンコードする用意があるかぎり、明白な代替手段です。ただし、それらをエンコードする場合は、抽象化レイヤーを開発し、とにかく生のキーを表示しないようにする必要があります。これにより、推論で\ 0を使用するようになりました。

これについて他の意見が明確にされているかどうかを確認するのは興味深いことです。


0

あなたのユースケースでは、HSET / HGETの方が適しているようです。HKEYSコマンドもあります。

これらのコマンドはすべてGET / SET / KEYSと同じ複雑さを持っているので、なぜそれらを使用しないのですか?

あなたはこの構造を持つことができます:

  • ユーザー> 00>値
  • ユーザー> 01>値

または:

  • users:username> 00> value
  • users:username> 01> value

ユーザーのIDを抽出して、ハッシュキーとして使用するだけです。私は個人的にこの方法を好んでいます。それは感じが良く、既存のユーザーIDを簡単にクエリできるからです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.