2017-07-26 140 views
0

我们在我们的应用程序中集成了Redis缓存,该缓存在正常情况下工作正常。最近我们在我们的应用程序中发现了一个非常奇怪的问题,那就是新添加的键会自动删除,并且在并发ajax请求的情况下修改键具有旧值。 方案是象下面这样:Redis:新密钥不会在并发请求中持续存在

AJAX请求1: - 读从分贝数据,取approax 5-6秒返回 - 触发在网页加载(的document.ready事件)

AJAX请求2: - 触发按钮点击 - 在会议 设定值 - 完成Ajax请求之前完成1

Ajax请求3: - 只是读取会话值 - 发现旧的价值观念,应该已经收到由阿加设定值X请求2

因此,这里的序列是这样的:

1)的Ajax所需物品1触发,并开始处理,

2)的Ajax所需物品2被触发,将在会话中的值(修改现有以及加入新的密钥)

3)的Ajax所需物品2完成

4)的Ajax所需物品1完成

5)的Ajax所需物品3被触发时,得到了ö ld值与Req 1一致,应该已经收到Req 2设置的值

最初我们认为必须有一些代码覆盖值,但没有找到这样的代码。

我试图使用示例应用程序重现相同的情况,并能够看到类似的情况。 下面是源代码:

public JsonResult Test1() 
     { 
      Session["MyTest"] = "Vijay"; 
      SessionManager.ProposalRequestID = 1; 
      SessionManager.VendorID = 2; 

      return Json(new { reqID = SessionManager.ProposalRequestID, venID = SessionManager.VendorID, mytest = Session["MyTest"] }, JsonRequestBehavior.AllowGet); 
     } 

     public JsonResult Test2() 
     { 
      System.Threading.Thread.Sleep(3000); 
      return Json(new { reqID = SessionManager.ProposalRequestID, venID = SessionManager.VendorID, mytest = Session["MyTest"] }, JsonRequestBehavior.AllowGet); 
     } 

     public JsonResult Test3() 
     { 
      return Json(new { reqID = SessionManager.ProposalRequestID, venID = SessionManager.VendorID, mytest = Session["MyTest"] }, JsonRequestBehavior.AllowGet); 
     } 

和UI是象下面这样:

<body> 
    <div> 
     <button id="btn1">Set Session</button> 
     <button id="btn2">Heavy Task</button> 
     <button id="btn3">Use Session</button> 
    </div> 
    <div style="color:red;height:500px;overflow-y:auto"> 
     <span id="message"></span> 
    </div> 
</body> 

<script type="text/javascript"> 

    $(document).ready(function() { 
     SendTestAjaxCall('@Url.Action("Test2")', "Heave Task"); 

     $('#btn1').click(function() { SendTestAjaxCall('@Url.Action("Test1")', "Set Session") }); 
     $('#btn2').click(function() { SendTestAjaxCall('@Url.Action("Test2")', "Heave Task") }); 
     $('#btn3').click(function() { SendTestAjaxCall('@Url.Action("Test3")', "User Session") }); 
    }); 

    function SendTestAjaxCall(URL, message) { 
     addToLog("Sending request for " + message); 
     $.ajax({ 
      url: URL, 
      success: function (result) { 
       addToLog("Response from " + message, result); 
      } 
     }); 
    } 

    function addToLog(message, data) { 
     $("#message").html($("#message").html() + '<p>' + message + '</p>'); 
     if (data) { 
      addToLog(JSON.stringify(data), null); 
     } 
    } 

</script> 
+0

在ajax中添加async:false,请告诉我结果。 –

+0

async:false会起作用,因为它会同步开始处理请求,但随后它将开始显示性能问题,这将再次成为我的一个新问题。 –

+0

你有没有得到任何解决方案? –

回答

0

最后我找到了解决办法,这是不相关的Redis的,但关系到我们有一个中间层的东西在我们的应用程序中,它是管理来自同一用户的请求之间的锁定机制我们发现这是基于以下事实:Redis始终存储在键值对中,它始终会更新存储中的最后一个给定值,但是,只要请求结束,我们的自定义中间层就会始终恢复会话,因此最后结束的请求将恢复其会话。 对不起,对Redis的无效怀疑