- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我们在我们的应用程序中集成了 Redis 缓存,在正常情况下工作正常。最近,我们在我们的应用程序中发现了一个非常奇怪的问题,即在并发 ajax 请求的情况下,新添加的键会自动删除,并且修改后的键具有旧值。场景如下:
Ajax 请求 1:- 从数据库读取数据,大约需要 5-6 秒返回- 在页面加载时触发(document.ready 事件)
Ajax 请求 2:- 触发按钮点击- 在 session 中设置值- 在 Ajax 请求 1 完成之前完成
Ajax 请求 3:- 简单地读取 session 值- 找到旧值,应该已经收到 Ajax 请求 2 设置的值
所以这里的顺序是这样的:
1) Ajax Req 1 触发并开始处理,
2) Ajax Req 2 triggered , sets the values in session (modified existing as well as added a new key)
3) Ajax Req 2 完成
4) Ajax Req 1 完成
5) Ajax Req 3 被触发,得到了 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>
最佳答案
最后我找到了解决方案,它与 Redis 无关,但它与我们应用程序中的中间层有关,它管理来自同一用户的请求之间的锁定机制。我们发现这是基于 Redis 总是存储在键值对中的事实,它总是会更新存储中的最后一个给定值,但是我们的自定义中间层总是在请求结束时恢复 session ,因此最后结束的请求将恢复其 session 。抱歉对 Redis 的无效疑问
关于asp.net-mvc - 雷迪斯 : New Keys not persisted in concurrent requests,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45326700/
我是一名优秀的程序员,十分优秀!