我们在我们的应用程序中集成了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>
在ajax中添加async:false,请告诉我结果。 –
async:false会起作用,因为它会同步开始处理请求,但随后它将开始显示性能问题,这将再次成为我的一个新问题。 –
你有没有得到任何解决方案? –