/ GETとSQL SELECTの比較 - nosql、redis

Redis GETとSQL SELECT - nosql、redis

私はNoSQLにかなり慣れていませんが、私はいつもそれのアイデアが好きでした。私は見ました レディスそして、複数のアイテムを保管して受信するための最良の方法についていくつか質問がありました。 hashes.

以下のシナリオを想定します。

Store a list of objects (redis "Hashes") and select them by their timestamp.

これをアーカイブするには SQL1つのテーブルと2つの単純なクエリ(INSERT&SELECT)が必要です。

でこれをやろうとしている Redis、私は次のような構造を作成しました。

  1. キー object:$id (ハッシュ) その object
  2. キー index:timestamp:$id (ソートセット) score 等しい timestamp そして value 含む id

私は1つのテーブルの代わりに2つのキーの追加のメンテナンス作業をすることができますが(SQL)、私はのプロセスについて興味があります 複数のオブジェクトを選択する

ZRANGEBYSCORE index:timestamp:$id timestampStart timestampEnd

これは、 array 間に作成されたすべてのIDの timestampStart そして timestampEnd。オブジェクトそのものを取得するには、次のようにしてすべてのオブジェクトを要求します。

GET object:$id
  • これは正しいやり方ですか?
  • SQLデータベースと比較して:それはまだかなり速いのか、それとも数が多いために遅くなるのかもしれません。 GET

回答:

回答№1の場合は3

A 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) 何もする必要がないという点であなたの操作に GETs。

これが物事の良い方法であるかどうか本当にあなたのユースケースに依存します。あなたは本当にどれくらいの速度が必要ですか、そしてあなたにとって伝統的なデータベースの他の機能はどれほど重要ですか? Redisは、従来のデータベースよりもクライアントからアクセス可能な単なるデータ構造であり、すべてRAMに格納する必要があります。それがあなたにとって正しいことであるかどうかを知るためには、もっと情報が必要です。