Redis を使用してタグ付けを実装しようとしています。これは次のようになります。
mykey (my item)
mykey:tags (a set with the tags associated to that item)
tags:tag1 (a set with references to all items tagged with "tag1")
...
Redis Keyspace Notificationsを使用して、期限切れのキーがタグ セットに永遠に残るのを防ぐことを計画しています (キャッシュ内のすべてのアイテムにデフォルトの TTL セットがある場合でも、古いデータを保持するのは好きではありません)。
これらは私が検討しているオプションです:
1) すべての「期限切れ」のイベントを購読します。
psubscribe '__keyevent@*:expired'
長所:
- 購読者は1名のみ。
短所:
- すべてのアイテムにタグが含まれているわけではないため、mykey:tags を確認し、存在する場合はタグを取得して、各タグ セットからアイテムを削除する必要があります。
- このメソッドの競合は、ストア内のキーの量に応じて増加します。
2) タグのみを含むキーのすべてのイベントをサブスクライブします。
psubscribe '__keyspace@*:mykey'
長所:
- サブスクリプションは、タグ付きのアイテムに対してのみ作成されます。
短所:
- 各サブスクライバーに関連付けられたオーバーヘッドが必要です。
- 購読者の数は、ストア内のタグ付けされたアイテムの数に応じて、かなり急速に増加する可能性があります.
質問:
- どのオプションを実装する必要がありますか? 2) の加入者数を気にする必要がありますか? それとも 1) の競合の方が大きいですか? このテーマに関する推奨事項は見つかりませんでした。
- 最終的なゲームは、これを Redis クラスターに実装することです。これにより、実装に特別な懸念が追加されますか?
更新 1:
これは、キャッシュの上にタグ付けするための一般的な実装です。この時点では、最終的にそれをどのように使用したかはわかりません。これは、私が取り組んでいる PoC に似ています。コメントのいくつかの質問に答えようとしているいくつかの数字:
- ボリューム: 1 日あたり何千万ものユニークな訪問者がいます。ただし、訪問者ごとにキャッシュに保存されているすべてのアイテムにタグがあるわけではありません。しかし、これは絶えず変化します。
- タグ: タグを管理します。現在、数十のタグがあります。将来的にはフリー テキスト タグのサポートを検討しています。
- ここで提案している 2 つのアプローチのいずれもテストしていません。オプションの1つが非常に悪く、オプションでさえなかったことを望んでいました:)
更新 2:
いくつかの試行錯誤といくつかの調査の後、私は破棄しました2)。redis クライアントと出力バッファーには制限があるため、このオプションは使用できません。詳細については、こちらとこちらをご覧ください。私は1)を試しましたが、うまくいきました。キーの有効期限を互いに 5 ミリ秒間隔に設定しても、コードはそれを適切に処理します。これは行く代わりになる可能性があります。
別のオプションは、@ thepirat000 によって提案されたものです。この回答を承認済みとしてマークしていますが、彼の提案に少し調整を加えています。タグ操作ごとにタグのメンテナンスを行いたくありません。代わりに、いつ行うかをランダムに決定できます。これは、pub/sub もキースペース通知も使用しない十分なアプローチです。