私はredisを使用して、ハッシュごとに最大10万レコードのハッシュを保存しています。指定されたハッシュ内のレコードのフィルタリング(ファセット)を実装したいと思います。ハッシュエントリはn個のフィルターに属することができることに注意してください。
- フィルタごとにソートされたSETを実装します。SET内の値は、HASH内のキーに対応します。
- 指定されたフィルターSETからHASHキーを取得します。
- SETからHASHキーを取得したら、HASHから対応するエントリをフェッチします。これにより、フィルターに属するすべてのエントリが得られます。
まず、上記のアプローチは大まかに正しいですか?
アプローチがOKであると仮定すると、私が見逃しているビットは、HASHエントリを取得するための最も効率的な実装は何ですか?HASHキーを取得したら、PIPELINEを使用して、各HASHキーを通過する複数のHGETALLコマンドをキューに入れる必要があると考えていますか?より良いアプローチはありますか?
PIPELINEの使用に関する私の懸念は、コマンドの処理中に他のすべてのクライアントをブロックすると信じていることです。フィルタリングされた結果を1ページあたり500件の結果でページングします。複数のブラウザベースのクライアントがフィルタリングを実行している場合、SETとHASHを設定するバックエンドプロセスは言うまでもなく、PIPELINEがブロックすると、多くの競合が発生する可能性があるように思われます。誰かがこれについての見解を提供できますか?
それが役立つ場合は、2.2.4 redis、Webクライアント用のpredis、バックエンド用のservicestackを使用しています。
ありがとう、ポール