私はNoSQLにかなり慣れていませんが、私はいつもそれのアイデアが好きでした。私は見ました レディスそして、複数のアイテムを保管して受信するための最良の方法についていくつか質問がありました。 hashes
.
以下のシナリオを想定します。
Store a list of objects (redis "Hashes") and select them by their timestamp.
これをアーカイブするには SQL
1つのテーブルと2つの単純なクエリ(INSERT&SELECT)が必要です。
でこれをやろうとしている Redis
、私は次のような構造を作成しました。
私は1つのテーブルの代わりに2つのキーの追加のメンテナンス作業をすることができますが(SQL)、私はのプロセスについて興味があります 複数のオブジェクトを選択する:
ZRANGEBYSCORE index:timestamp:$id timestampStart timestampEnd
これは、 array
間に作成されたすべてのIDの timestampStart
そして timestampEnd
。オブジェクトそのものを取得するには、次のようにしてすべてのオブジェクトを要求します。
GET object:$id
- これは正しいやり方ですか?
- SQLデータベースと比較して:それはまだかなり速いのか、それとも数が多いために遅くなるのかもしれません。
GET
?
回答:
回答№1の場合は3A ZRANGEBYSCORE
コスト O(log(N) + M)
どこで N=|items in your set|
そして M=|items you"re selecting|
。だから、やって ZRANGEBYSCORE
そしてM GET
操作はただ O(long(N)+M+M)
= O(log(N)+M)
そしてせいぜい2倍遅いでしょう。 ネットワークの行き来は大幅に遅くなる可能性がありますが、それぞれのgetは独立した操作なので、それらをパイプライン処理するだけで済みます。あなたはLuaスクリプトの中に全部を入れて、前後に一つだけ持っていくこともできます。私は99%の確信でこれがSQLで同じことをするより速いだろうと言うでしょう。
また、これが非常に頻繁な操作である場合は、IDだけではなくオブジェクト全体をソートセットに格納するだけでさらに高速化できます。あなたが持っている key = object encoded as json
, score = timestamp
。これはあなたを救うでしょう O(M)
何もする必要がないという点であなたの操作に GET
s。
これが物事の良い方法であるかどうか本当にあなたのユースケースに依存します。あなたは本当にどれくらいの速度が必要ですか、そしてあなたにとって伝統的なデータベースの他の機能はどれほど重要ですか? Redisは、従来のデータベースよりもクライアントからアクセス可能な単なるデータ構造であり、すべてRAMに格納する必要があります。それがあなたにとって正しいことであるかどうかを知るためには、もっと情報が必要です。