これを処理する1つの方法は、セッションを保持するためのハッシュマップとMRU(最近使用された)リストを作成することです。 MRUリストは、二重リンクリストとして実装されています。ユーザーがサイトにアクセスすると、そのセッションはMRUリストの先頭に戻されます。また、セッションが作成されるたびに、システムはMRUリスト内の最後の項目をチェックして、最も古いセッションが期限切れになったかどうかを確認し、削除することができます。
また、リストの最後に期限切れのセッションをすべて削除することもできます。
さらに、期限切れのセッションがまだ削除されていない場合は、ルックアップコードでそのセッションを削除する必要があります。だから、
、あなたが要求を取得する際に、一連のイベントは次のようなものになります。あなたが期限切れのセッションをクリーンアップすることは、あまりにも長い間、あなたのハッシュマップをロックすることを心配している場合
session = get session info from user token
if no session
create session
add to front of MRU list
else if session has expired
delete from mru list
remove from hash map
else // session has not expired
move session to front of MRU list
end
// delete expired sessions
p = last item in MRU list
while p has expired
prev = p->prev
remove from MRU list
delete from hash map
p = prev
end
を、制限を設定期限切れのセッションの数を一度に削除します。新しいセッションが追加されたときに期限切れのセッションを2つだけクリーンアップするように設定すると、データ構造がロックされる時間が最小限に抑えられ、期限切れのセッションが長くなりすぎることはありません。
_ "期限切れのものを消去するためにマップをロックしたくありません。" - 消去する必要のあるハッシュを別のコンテナに保存し、単一のリース操作の場合にのみ地図をロックすることができます。 –
これは、C++プログラミングの問題の範囲を超えて、非常に幅広いアーキテクチャ上の質問です。 –
とにかくセッションの状態はどのくらいですか?数十億という数は、外部記憶装置を必要とするようであり、RAMに適しているよりもパフォーマンスのトレードオフやアルゴリズムがかなり異なる場合があります。 – doynax