0

約 500 項目の静的オブジェクト リストがあります。

このオブジェクトには、(id [int],Name [string], attribute1 [string], attribute2 [string]) のようなプロパティがあります。

このオブジェクトを文字列にシリアル化し、文字列キー値として redis に保存しました。しかし、オブジェクト属性のさまざまなユーザー検索フィルターに基づいて、この 500 項目のリストをフィルター処理し、このリストのサブセットをユーザーに提供する必要があります。

このリストをテーブルとインデックスに追加し、SQL を使用して検索フィルターを適用するという 2 つの方法でそれを行うことができます。その他は、毎回 redis からこのリストを取得し、オブジェクトのリストに逆シリアル化し、linq を使用してフィルターを適用することです。私は別のサーバーに redis を持っているので DB もあります。各 Web サーバーにもそのキャッシュのコピーを置きたくありません。

では、最高のパフォーマンスを得るにはどうすればよいのでしょうか? またはそれをより速く行う別の方法はありますか?

4

1 に答える 1

1

あなたがリストした 2 つのアプローチ (SQL を使用するか、クライアントでデシリアライズとフィルタリングを使用する) の代わりに、本質的に Redis インデックスである少し異なるアプローチを提案したいと思います。

オブジェクトのキー名が obj1、obj2...objn であり、attribute1 の値が val1、val2...valm であると仮定すると、attribute1 の各値 x に対して、 のようなキー名を持つ Redis セットが作成されますattribute1:valx:index。セットのメンバーは、attribute1=valx を持つオブジェクトのキー名になります。これを実現するには、次のことを確認してください。

  • attribute1 の値が valx の objy を作成するときobjyに、キーに追加しattribute1:valx:indexます。
  • objy の attribute1 を valx から valz に更新する場合は、 から削除objyattribute1:valx:indexて に追加しattribute1:valz:indexます。
  • attribute1=valx で objy を削除する場合、 から削除objyattribute1:valx:indexます。
  • 必要に応じて、アプリにとって重要な場合は、上記がアトミックに (つまり、Lua または WATCH/MULTI/EXEC ブロックで) 発生する必要があります。

これらのポイントは、インデックスを維持するために必要なものです。attribute1:valx:indexインデックスを使用するには、attribute1=valx でフィルター処理されたオブジェクトを検索するときにセットのメンバー (SMEMBERS など) をフェッチし、キー名 ( などobjy) を介して実際のオブジェクトをフェッチします。別の方法として、SORT .. GET (例: SORT attribute1:valx:index GET obj*) を使用することも、1 つのコマンドだけを使用して実行する別の方法です。

attribute2 についても同じことを繰り返します。いくつかの追加ポイント:

  • Redis のハッシュを使用してオブジェクト (HSET objy attribute1 valx など) を保存し、シリアル化のオーバーヘッドを節約し、Redis での値の操作を容易にすることを検討してください。
  • 上記の単純なインデックスは、さらに拡張することができます。より複雑なフィルタリング オプションについては、SUNION、SDIFF、SINTER などのセット操作を使用することを検討してください。
于 2014-09-05T11:26:18.453 に答える