2013-05-24 51 views
14

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

キーの有効期限が切れても、セットからIDを削除するにはどうすればよいですか?または、私が望むものを達成するためのよりよい方法がありますか(逆参照)?

答えて

16

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

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

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

セッションが期限切れになると、ユーザーセットからセッションIDを削除する必要があります。したがって、スコアがタイムスタンプである追加のソートセットを維持することができます。あなたが期限切れにセッションを識別するためにZSETをポーリングするデーモン(ZRANGEBYSCORE)を構築する必要があり、その後

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

あなたは、ユーザ100のセッション10を作成した場合。

  • がZSETの外にセッションをポップ(ZREMRANGEBYRANK)
  • は、セッションのユーザーIDを取得する(HMGET)
  • セッションを削除(DEL)
  • 削除:各期限切れのセッションの場合は、データ構造を維持しなければなりませんsession from userid set(SREM)

主な難点は、デーモンがアイテムをポーリングして処理するときに競合状態が発生しないことです。この質問への私の答えを見て、どのように実装できるかを見てください。

how to handle session expire basing redis?

関連する問題