3

セッション用の永続ストレージ ソリューション (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 を使用して、セッションの有効期限が一致するようにします。保存されたセッション...まあ、誰もサーバーを再起動しない場合...)

このアプローチには、私が見ていない他の問題があることを知りたいですか? (つまり、ガベージ コレクション以外に、メモリ ストアには他にどのような制限がありますか)

他の人々はそれについてどのような経験をしましたか? たぶん、他の誰かがこの種のことを試したことがありますか?

4

1 に答える 1

-1

外部メモリストアを使用することがいかにやり過ぎなのかわかりません。それらは、セッションを処理するのに最適です。たとえば、Redis はキー/バリュー ストアであり、値には Time To Live があるため、メモリ管理などについて心配する必要はありません。TJ Holowaychuk は、Redis をバックエンドとして使用するきちんとしたメモリ ストアを作成しました: connect-redis

したがって、次のことを行う必要があります: 1) Redis をインストールします (5 分かかります。サーバーのファイアウォールが起動している場合、デフォルトの構成で問題ありません) 2) connect-redis をインストールし、Connect または Express のセッションでセッション ストアとして使用します。ミドルウェア 3) 利益。さらに、Redis は、Express アプリとシステムの他のコンポーネントとの間のメッセージ プロバイダーとしても使用できるという利点があります。とても便利です。

于 2013-01-04T10:13:12.093 に答える