快速会话-会话上的并发修改

时间:2018-12-08 19:50:19

标签: node.js express session concurrency session-store

我正在使用expressjs和express-session以及nodejs中的redis-connect存储来实现基于会话的服务,并且对会话存储进行并发修改时遇到问题。查找以下问题示例:

  • 已发布两条路线:/ api / op1和/ api / op2
  • / api / op1:增加request.session.op1Calls的值并执行对外部服务的调用(3秒)
  • / api / op2:增加request.session.op2Calls的值,什么也不做(要执行0.1毫秒)

这里的问题是:如果在执行op1的过程中多次执行op2,则request.session.op2Calls值只会丢失。我应该如何实现会话存储以永不丢失值?

谢谢!

1 个答案:

答案 0 :(得分:0)

在发出请求时,正在从商店(在您的情况下为redis商店)中读取Express会话(request.session)。

让请求执行任务,然后然后修改会话并将其保存回商店,实际上将保存已充斥着更新属性的 read 会话。

您可以采取的措施是在保存之前重新加载会话:

app.get( "/op2", function( req, res, next ) {
   someReallyLongAsyncTask( function() {
       req.session.reload(function(err) {    
           if ( !req.session.op2Call ) { req.session.op2Call = 0; }
           req.session.op2Call++;
           req.session.save( function() { 
               res.json( { success: true } )
           } );
       } );
   } );    
} );

这样,您将确保在保存之前重新读取会话。