8

最近、私はredisを学び、正直に言って非常に感銘を受け、それを使いたくてたまらなくなっています。私を悩ませ続けていることの1つは、「redisをクエリする方法」です。具体的には、以下を解決しようとしています

以下のように何百万ものハッシュを保存しているとしましょう

usage:1 = {created: 20100521, quantity:9, resource:1033, user:1842, ...}
usage:2 = {created: 20100812, quantity:3, resource:7233, user:1842, ...}
usage:3 = {created: 20100927, quantity:4, resource:1031, user:76, ...}

ハッシュには4つだけ示したキーがたくさんあることに注意してください。ここで、特定の日付範囲、ユーザー別、リソース別、または特定の期間のユーザーのレコードを検索したいと思います。

そのようなデータを取得するためのredis固有のパターンがあるのではないかと思います。私はPythonプログラマーです。いくつかのクワイアリングをサポートするredisco(オームポート)を調べましたが、すべてのデータを取得してからpythonでフィルター処理するかどうかはわかりません。

4

2 に答える 2

10

Redisの場合、データの保存方法を決定する前に、データに対してどのような種類のクエリパターンが必要かを理解するのが最善です。

たとえば、データのセットに対して日付範囲クエリを実行する場合、そのデータをソートされたセットとして格納できます。キーはクエリするデータアイテムであり、スコアはUNIXタイムスタンプです。

上記の例では、例のハッシュを次のように保存できます。

 user_to_resource:i = user:j                   # key -> value forward map
 resources => (resource:i, created_timestamp)  # sorted set
 count_resource:i = quantity                   # key -> value quantity map

つまり、サポートしたいクエリパターンに応じて、多くの順方向マップと逆方向マップがあります。

于 2010-09-27T08:09:42.410 に答える
7

あなたが言及するクエリは時間に大きく依存しています。この場合、ソートされたセットを使用するのが賢明です。各エントリのスコアとして日時スタンプを使用できます。

たとえば、次のようにすることができます。

hmset usage:1 created 20100521 quantity 9 resource 1033 user 1842
hmset usage:2 created 20100812 quantity 3 resource 7233 user 1842
hmset usage:3 created 20100927 quantity 4 resource 1031 user 76

zadd usage 20200521 1
zadd usage 20100812 2
zadd usage 20100927 3

すべてを取得するには:

sort usage get 
# get usage:*->created get usage:*->quantity get usage:*->resource get usage:*->user

また

lrange usage 0 -1

範囲のインデックスを取得するには:

zrangebyscore usage 20100800 20100900

ハッシュキー値に基づくクエリの場合、luaで記述されたスクリプトの使用を可能にするredisへの便利な追加があります。Pythonヒアドキュメント内で簡単なluaスクリプトを簡単に記述し、redis.evalメソッドを使用してスクリプトをredisに渡すことができます。スクリプトは、探している値に基づいてフィルタリングするループである可能性があります。

于 2011-05-25T09:06:33.520 に答える