質問
最近、私はRedisのを学んでいますし、正直に非常に感銘を受け、それを使用するために死にます。私を悩ませ続けることの一つは、「私は、クエリは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プログラマです。私はいくつかのキシにをサポートしていますが、それはすべてのデータを取得し、その後、pythonでフィルタリングした場合、私はわからないredisco(オームポート)を見てみました。
解決
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
これ、私がサポートしたいクエリパターンに応じて、多くの前進と後進のマップを持っていると思いますされます。
他のヒント
あなたが言及したクエリは、時間に大きく依存しています。この例では、ソートセットを使用することが賢明だろう。あなたは、各エントリのスコアとして日時スタンプを使用することができます。
はたとえば、次の操作を行うことができ
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のにスクリプトを渡すredis.evalメソッドを使用することができます。スクリプトは、あなたが探している値に基づいてフィルタリングするループ可能性があります。