22

私は現在 Web アプリを作成していて、Redis を使用してセッションを保存したいと考えています。ログイン時に、対応するユーザー ID と有効期限が 15 分に設定されたセッションが Redis に挿入されます。セッションの逆引き参照を実装したいと思います (特定のユーザー ID を持つセッションを取得します)。ここでの問題は、Redis キースペースを検索できないため、これをどのように実装するかです。1 つの方法は、すべてのセッション ID を含む各 userId に redis を設定することです。しかし、Redis ではセット内のアイテムの有効期限が許可されておらず、セッションが期限切れになるように設定されているため、セット内に存在しないセッション ID が大量に存在することになります。

キーの有効期限が切れたときにセットから ID を削除する最良の方法は何でしょうか? または、私が望むものを達成するためのより良い方法はありますか (逆引き)?

4

2 に答える 2

25

Redis (2.6)の現在のリリース ブランチでは、アイテムの有効期限が切れたときに通知を受け取ることができません。おそらく次のバージョンで変更されるでしょう。

それまでは、要件をサポートするために、有効期限通知サポートを手動で実装する必要があります。だからあなたは持っています:

session:<sessionid> -> a hash storing your session data - one of the field is <userid>
user:<userid> -> a set of <sessionid>

sessionidセッションの有効期限が切れたら、ユーザー セットから削除する必要があります。したがって、スコアがタイムスタンプである追加のソート済みセットを維持できます。

ユーザー 100 のセッション 10 を作成すると、次のようになります。

MULTI
HMSET session:10 userid:100 ... other session data ...
SADD user:100 10
ZADD to_be_expired <current timestamp + session timeout> 10
EXEC

次に、期限切れになるセッションを識別するために zset をポーリングするデーモンを構築する必要があります ( ZRANGEBYSCORE)。期限切れのセッションごとに、データ構造を維持する必要があります。

  • zset からセッションをポップします ( ZREMRANGEBYRANK)
  • セッションのユーザー ID を取得する ( HMGET)
  • セッションの削除 ( DEL)
  • ユーザー ID セットからセッションを削除 ( SREM)

主な問題は、デーモンがアイテムをポーリングして処理するときに競合状態が発生しないようにすることです。この質問に対する私の回答を参照して、実装方法を確認してください。

セッションの期限切れベースの redis を処理する方法は?

于 2013-05-25T08:27:32.700 に答える