2016-09-30 2 views
1

時刻と曜日に基づいて適用するルーティングルールを見つける必要があるアプリケーション(nodejs/express)があります。だから、REDIS - クエリを減らすための意味のあるキーを作成する

例えば、私は、次のビジネスルールを持っている:9:00 GMTから12:00 GMTの間に、月曜日と火曜日に

  • 、私は「位置x」にルートオブジェクトABCが必要です。
  • 火曜日は13:00から13:30の間にABCを「場所y」にルーティングする必要があります。私は限り私はRedisのデータベースで私の鍵を設計する方法として、2つのオプションの議論しています

(この議論の目的のために、本当にABCが何であるかのオブジェクトは関係ありません。)

オプション1

このように、日情報オブジェクトデータの一部行います

HMSET routing_rules:objectABC_09:00_12:00 days 'mon tues' location X 
HMSET routing_rules:objectABC_13:00_13:30 days 'tues' location Y 
この方法の

利点 - それは、私は単にこれを行うことができ日間のリストを更新する時間です:

HMSET routing_rules:objectABC_09:00_12:00 days 'mon tues thu' 

ここでの欠点は、右のルールを見つけるために、私は2つのクエリをしなければならないということです。..まず、正しい時間範囲を見つけるためにSCANコマンドを実行し、一致するものがあれば...曜日の値を見つける別のクエリを実行します。

オプション2

キー

HMSET routing_rules:objectABC_09:00_12:00_mt location X 
HMSET routing_rules:objectABC_13:00_13:30_t location Y 

の一環として、私はオプション2に

m = monday 
t = tuesday 
w = wed 
r = thursday 
etc. 

利点のような命名規則を使用する曜日情報を含めます現在の日時に基づいて適切なルーティングルールを見つけるためには、1つのSCANコマンドを実行するだけです(私たちは私のSCANコマンドは、1回のショットですべての結果を返します)

しかし、私は、キーに新しい一日を追加する必要がある場合は、オプション2の欠点は、私 iがキーと値を削除する必要があると思います。 ..それを作り直してください。これは正しいです?

今のところ、私が削除する方法を知っている唯一の方法は、オブジェクト内の各値に対してHDELを実行し、次にキーを削除することです。私は全体のキー/値のペアを削除するには、オブジェクト内のすべての値をリストする必要があり

127.0.0.1:6379> HDEL routing_rules:objectABC_00:00_00:00 days 'mon tues' location x 

: だから例えば、私はこのような何かをやってきました。 この例では、このキーの2つの値(locationフィールドとdaysフィールドのみ)があるため、それほど悪くありません。しかし、さらに多くのデータがあれば、少し面倒です。また、このキーに関連付けられているフィールドの数以外に考慮すべき他の考慮事項があるかどうかはわかりません。

最適なパフォーマンスとメンテナンスのためにこのキーを設計する方法についてご意見がありましたら、私はすべて耳にします。私が見ているように、スキャンを少なくとも1回は実行しないようにする方法はありません。しかし、これは私の最初のredisデータベースの試みですので、私は修復の質問/ noobの間違いを事前に謝罪します。

EDIT 1

私は十分なメモリを持っていると仮定すると、私は唯一の私は、このように私のキーを作成しましょう、1つのフィールド/キーごとに値を保存する必要があると仮定:

SET routing_rules:objectABC_09:00_12:00_m X 
SET routing_rules:objectABC_09:00_12:00_t X 
SET routing_rules:objectABC_13:00_13:30_t Y 

そして、今ではオブジェクトABCの要求があり、月曜日はUTC 11です。私のキーは開始時刻と終了時刻(別名範囲)を表しているので、スキャンを行わずに正しいキーと値のペアを見つける方法はわかりません。

何か不足していますか?

答えて

0

この場合、ほとんどの場合、SCANコマンドは使用しません。キースペース全体をスキャンするには、複数回呼び出す必要がありますが、探しているデータに直接アクセスできる他の方法があります。これがK/Vストアのパフォーマンスを向上させます。

たとえば、最初の解決策では、すべての値をハッシュに入れ、1回の要求ですべてのルートをHGETALLで取得します。次に、適切な値を選択するために、アプリケーションの値を反復処理する必要があります。あなたが探している値を持つ1つのGET要求で次に

SET routing_rules:objectABC_09:00_12:00_m location X SET routing_rules:objectABC_13:00_13:30_t location Y ...

アプリケーション側の任意の反復を必要としない別の解決策は、一日あたりおよび時間帯ごとにルートを作成することですために。 1日を追加するには、SETが必要です。 ソリューションと比較した場合の欠点はメモリ使用量です。エントリを倍数にします。あなたはエントリーの数について何の手がかりも与えませんでしたが、それが非常に高い場合、問題になる可能性があります。必要なメモリを減らすには、routing_rules:objectABC_09:00_12:00_mの代わりにr:objectABC_09001200mなどの短いキー名を使用することから始めます。時間範囲は一定ではいないようだ、と現在の時刻からの時間範囲を推定するために何のアルゴリズムが存在しないと仮定すると、ハッシュを使用してに基づいて、第1の解決策は、と思われるという事実を考えると

更新

GET/SETに基づいて、彼よりも優れています。

HSETのrouting_rules:objectABC 09:00_12:00 X HSETのrouting_rules:objectABC 12:00_12:30 Y

それから私は、与えられたため、すべてのフィールドになるだろうが、私は時間範囲に応じてフィールドに名前を付けるだろうオブジェクトをHGETALL routing_rules:objectABCを使用して検索し、メンバーキーを反復処理して正しいものを探します。

+0

パスカル、エントリ数の「高い」値とは何でしょうか? – Happydevdays

+0

これは、サーバー上の使用可能なメモリーと比較して、各キー+値のメモリー・サイズに依存します。 –

+0

私は約15 GBの使用するオブジェクトと50,000個のオブジェクトを持っていると思います。各オブジェクトには最大5つのルーティングルールがあります。 – Happydevdays

0

私はソートされた解決策、各オブジェクトのセット、値は位置*でなければなりません、スコアはこのルールが終了する週の分でなければなりません。

9:00 GMT 12:00 GMTの間の月曜日と火曜日に

(週は月曜日00:00に開始します)、私は「位置x」へのルート オブジェクトABCが必要です。

月曜日12:00 => 720 火曜日12:00 => 2160

ZADD ABC_rules 720 x 2160 x

2つの問題がここにありますが、あなたの例第一は規則がないことを時間を示し、したがって、この必須考慮に入れてください。 2つ以上の主要な設定オブジェクトは一意でなければならず、xは2回保存することはできません。両方とも一緒に上記の理由、それを解決する方法は、ルールが始まる週の分を値のapped/prependすることです:

Monday 9:00 => 540 Tuesday 9:00 => 1980

クエリに

ZADD ABC_rules 720 x:540 2160 x:1980

、あなたが必要とするすべては、週に分でZRANGEBYSCOREを使用して、あなたが場所に追加取得時間はあなたが送信された時間の前にあることを確認することです。月曜日10:00(600)ため

問合せ:

ZRANGEBYSCORE ABC_rules 600 +inf LIMIT 1

結果はx:540となり、540を使用して、xが有効な回答である知っている600よりも低いので。月曜日午前13時00(780)ため

問合せ:

ZRANGEBYSCORE ABC_rules 780 +inf LIMIT 1

結果は、この結果は無効であり、あなたがあなたのデフォルトを取る必要があります(780)x:1980こと、そして1980年以降、クエリよりも大きくなるだろうルーティング(またはあなたの解決策がスケジュール内のマップされていない時間にあるもの)。

ルールを削除するには、開始時刻が付加場所削除する必要があります:あなたはまた、特定の日に適用されるすべてのルールを取得するためにZRANGEBYSCOREを使用することができます

ZREM ABC_rules x:540

を、あなたはLUA書くことができますそれらをクリアするスクリプト。

関連する問題