我在ASP.NET MVC应用程序中使用RedisSessionStateProvider作为会话提供程序遇到了一个奇怪的问题。 我有下一个代码(简化了一点)从DB获取图像然后存储到会话中但如果图像已经在会话中但哈希是不同的 - 更新存储的图像。如果不是 - 只需从会话返回图像而不从DB
获取public FileResult GetImage(
int entityId,
string imageHash)
{
var storedImage =
this.ImagesList.FirstOrDefault(
i => i.EntityId == entityId);
if (storedImage != null && storedImage.ImageHash == imageHash)
{
return this.File(storedImage.Content, "image/png", "Image.png");
}
//// Here I get image from DB
if (storedImage != null)
{
//// Here I update image stored in Redis if it's changed
}
else
{
//// Here I insert image into Redis
}
return this.File(resizedImage, "image/png", "Image.png");
}
where this.Images列出了存储在Session中的图像列表,但因为我使用的是RedisSessionStateProvider - 它存储在Redis中。所以我不能直接与Redis合作。
然后我在前端定义src获取图像,作为ImageController的Url to GetImage动作。这是不好的方法,因为我最终发现我们会重新制作它,但我想找出超时的原因,因为我们将在我们的应用程序中使用Redis Cache作为会话存储以满足其他需求。
图片尺寸不大。我不认为有1 Mb的图像。它最有可能是100Kb。
因此,当我经常加载包含图像(15-20条记录)的记录列表时,我会得到下一个异常:
超时执行EVAL,inst:7,mgr:无效,错误:从不,队列:0, qu:0,qs:0,qc:0,wr:0,wq:0,in:0,ar:0,clientName: RD00155D62D65A,serverEndpoint:未指定/ .......,keyHashSlot: 5043,IOCP :(忙碌= 0,自由= 1000,最小值= 1,最大值= 1000),工人: (忙= 7,自由= 8184,最小= 1,最大= 8191)(请看看这篇文章 对于一些可能导致超时的常见客户端问题: http://stackexchange.github.io/StackExchange.Redis/Timeouts)
我已在异常文章中指定并在Application_Start中修复了ThreadPool以设置IOCP min = 20和Workers min = 25。但后来我得到了同样的例外:
类型的异常' System.Web.HttpException'被抛出。超时 执行EVAL,inst:1,mgr:不活动,错误:从不,队列:12,qu:0, qs:12,qc:0,wr:0,wq:0,in:65536,ar:0,clientName: RD00155D62D65A,serverEndpoint: 未指定/ ....., keyHashSlot: 5043,IOCP :(忙碌= 1,自由= 999,最小值= 20,最大值= 1000),工人: (忙= 8,自由= 8183,最小= 25,最大= 8191)(请看看这篇文章 对于一些可能导致超时的常见客户端问题: http://stackexchange.github.io/StackExchange.Redis/Timeouts)
我发现可能的问题是例外的下一个属性:
in:65536
根据this文章:
您还可以在:64221中看到。这表示已经有64211个字节 在内核套接字层接收但尚未被读取 应用程序(例如StackExchange.Redis)。这通常意味着你的 应用程序不能快速地从网络读取数据 服务器正在发送给你。
但是如何处理我的基础设施中的问题 - 我还没有理解。