2013-06-16 15 views
7

MySQLデータベースに実際に格納されている3,500万のレコード(読み込み専用)があります。これはパフォーマンス上の理由からRedisに引き渡したいと思っています。実は、私はRedisのには、このようなものを保存するために管理している:いくつかのRubyの接着剤で、私はこの既存のアプリで可能な限り少ないものとして破ることができるようにRedisフルテキスト検索:逆索引や太陽黒点?

1 {"type":"Country","slug":"albania","name_fr":"Albanie","name_en":"Albania"} 
2 {"type":"Country","slug":"armenia","name_fr":"Arménie","name_en":"Armenia"} 
... 

私がここで使うキーは、従来のMySQLのIDです(そして、これはここで深刻な問題です)。

ここで問題は、値の部分の中のキーワード「アルメニア」で検索する必要がある場合です。

  • スラグ=> ID(スラッグに基づいて索引付けを逆転(上記のように)

    • ID => JSON値:私はRedisのインデックスをmultiplicate

      次のいずれかのうちの2つしか方法がありますように思えますこの記事に示すように、それは、オートコンプリートのために特別に、最終的には)別の巨大なインデックスを

    • を基本的な検索トリックを行うことができます:http://oldblog.antirez.com/post/autocomplete-with-redis.html

    はどちらか私はあなたが何をするだろう、または一部の全文検索エンジン(残念ながら、私は実際にはあまり

    ので

    :-(のMySQLに接続されていたThinkingSphinxを使用黒点でしょうか?あなたは、単一のテーブルのRedis移動へのMySQLは良いアイデアだと思いますか?私は16GBのRAM Serverにかかる巨大なRedisキー/値がメモリのフットプリントを恐れています。

    同様のRedisの使用についてのご意見はありますか?

  • 答えて

    4

    本当の答えから始める前に、私はあなたがここでレディスを使用する正当な理由はないと言いたいと思います。あなたがしようとしているように思えるどのようなタイプのユースケースに基づいて、elasticsearchのようなものがあなたのためにもっと適しているように思えます。

    1. field_key -> list_of_idsを指す補助インデックス(あなたのケースでは、「アルメニア:あなたは自分のJSON内のいくつかの異なるフィールドを検索できるようにしたい場合は、次の2つのオプションを持っている、と述べた

      " - > 1)。

    2. Redisの上にあるLuaをJSONのエンコーディングとデコードで使用して、あなたが望むものを得ることができます。これは、より柔軟で空間効率的ですが、テーブルが大きくなるにつれて遅くなります。

    また、私はRedisがあなたにとって良い選択になるようには聞こえないので、どちらもあなたにとって適切だとは思わないが、そうする必要がある場合は動作するはずです。

    +0

    はいエリ、ついにあなたは完全に正しいと思われます。私は最後まで実験を行い、Redis vs ThinkingSphinx indexingを使用した逆インデックスベースの検索をベンチマークしました。ThinkingSphinxが戦闘で勝った(約30%速くなりました)。だからあなたは正しいと思いますが、私はRedisがちょうどいいツールだと思っています。スフィンクスを使って引き続き狂った速さを実現していきます(そして、私のレガシーMySQL DBは読みづらいデータでいっぱいです...) – gbarillot

    +0

    Byちょうど、私はあなたにこれでグーグルで、3百万のレコードセットは650MoのRAMに収まっているので、私が最初に期待していたそれほど重要ではない問題でした – gbarillot

    2

    ここに私のレディスがあります。 基本的には、LRU(least recently used data)のみを格納するように構成できるインメモリ・キャッシュと考えています。私のユースケースで演奏するために私が作った役割はどれですか、その論理はあなたのユースケースについて考える助けに当てはまるかもしれません。

    私は現在、複雑なクエリ(遅い)に基づいて検索エンジンの結果をキャッシュするためにRedisを使用しています。別のDBのデータに裏付けられています(ケースに似ています)。したがって、Redisはクエリに応答するためのキャッシュストレージとして機能します。 Redisのキャッシュミスの場合、すべてのクエリにRedisのデータまたはDBのデータが提供されます。だから、RedisはDBを置き換えるのではなく、私の場合は単にキャッシュを介した拡張であることに注意してください。これはRedisの追加が将来のスケーラビリティを支援することになっていたため、私の特定のユースケースに適合しました。この考え方は、最近のデータの繰り返しアクセス(私の場合は、ユーザーが繰り返しクエリを実行する場合)をRedisによって処理し、DBからいくらかの負荷を取り除くことができるということです。

    基本的に私のRedisスキーマは、上で概説したインデックスの重複に似ています。私はsetとsortedSetsを使ってredis-keyの "バッチ/セット"を作りました。それぞれは特定のredis-keyの下に格納された特定のクエリ結果を指していました。そしてDBでは、私はまだ完全なデータセットとインデックスを持っていました。

    データセットがRAMに収まる場合は、Redisに「テーブルダンプ」を実行して、MySQLの必要性を取り除くことができます。この「テーブル」が将来的に成長するかどうかは、Redisの永続的なストレージを計画し、データの可能性のある成長を計画している限り、これを見ることができます。

    実際のユースケースと、Redisがスタックに収まるように見える方法と、DBの負荷に応じて、上記で説明したオプションの両方を実行する必要性を排除しないでください私の場合)。

    希望すると便利です。

    関連する問題