セッション用の永続ストレージ ソリューション (Node/Express セットアップ用) をインストールすることが、小規模な Web サイト (redis、mongo など) にとっては少しやり過ぎのように思えることについて、いくつかのさまざまなコメントを読みました。
永続性に加えて、古いセッションのガベージ コレクションが、実稼働 Web サイトでメモリ ストアを使用しない理由であることがわかりました... (つまり、ブラウザを閉じますが、セッションはサーバーのメモリ ストアにまだ保存されています)。
この問題に対処するために、この単純なガベージ コレクターのようなものを投入しました。
var sessionGarbageCollector = function(req, res, next) {
// Set a session lifetime (Renewed each time this is called)
var now = new Date();
var expirydate = now.getime();
expirydate += 60000; // Some Session lifespan
req.session.LifeTime = expirydate;
req.session.sessionID = req.sessionID; // Make session ID accessible inside session
// Loop through all sessions and check for expired sessions
for ( var x in req.sessionStore.sessions ) {
req.sessionStore.get(x, function(err,sessionObj) {
if ( sessionObj.LifeTime ) {
if ( now.getTime() > sessionObj.LifeTime ) {
console.log("Removing Expired Sesson: " + sessionObj.sessionID);
req.sessionStore.destroy(sessionObj.sessionID, function(err,data) { } );
}
}
});
}
next();
}
次に、すべてのリクエストで実行するために、次のものを含めました。そのため、誰かがページをリクエストするたびに、ガベージ コレクターはセッションを削除する必要があるかどうかを確認します。
app.use(sessionGarbageCollector);
おそらく、毎回これを呼び出したくはありませんが、おそらく10分が経過した後、またはある程度の間隔が経過した後のリクエストでのみ...しかし、これは私が目指しているものに十分近いです。(「ログイン状態を維持する」セッションの場合、クライアントのセッション キー Cookie の「セッションのみ」ステータスを上書きし、特定の有効期限を設定します。req.session.LifeTime を使用して、セッションの有効期限が一致するようにします。保存されたセッション...まあ、誰もサーバーを再起動しない場合...)
このアプローチには、私が見ていない他の問題があることを知りたいですか? (つまり、ガベージ コレクション以外に、メモリ ストアには他にどのような制限がありますか)
他の人々はそれについてどのような経験をしましたか? たぶん、他の誰かがこの種のことを試したことがありますか?