我使用Redis作为会话状态提供程序,但由于我有很多用户,有时会发生Redis故障。所以我希望有一个默认的会话状态提供程序,以便在第一个发生故障时使用。
这可能吗? 还有其他解决方案吗?
由于
答案 0 :(得分:1)
ASP.NET的会话管道不支持回退到不同的会话提供程序,因此必须将回退功能添加到Redis会话状态提供程序中。但是Redis提供者只与Redis交谈,所以你必须自己做这件事,要么在你自己的project的分支中,要么创建你自己的继承自SessionStateStoreProviderBase的自定义会话提供者并包装访问权限到RedisSessionStateProvider(以及如果您的提供商检测到Redis中断,您希望使用的任何后备存储逻辑)。
但是你现在看起来很麻烦:你应该在哪里临时存储数据(进程内缓存?现在你正在谈论粘性会话.SQL Server?还有另一个要管理的服务器)......而且,一旦Redis重新启动,您如何使用临时存储中的活动会话重新填充它?需要思考很多问题,毫无疑问微软不支持它。
正如@MatíasFidemraizer所提到的,最好的选择是集中精力改进Redis部署,以便它可以处理您的负载,并使用Redis Sentinel设置主从复制来进行自动故障转移。如果这工作太多,那么有许多商业解决方案可以为您完成大量的故障转移(我所工作的公司有一个名为ScaleOut SessionServer的简单产品)
答案 1 :(得分:0)
由于我有很多用户,有时会发生Redis故障
我怀疑这应该是幕后的原因。你有足够的内存吗?可能有很多原因,但我怀疑问题是"许多用户"除非你是谷歌,Twitter或者一些流量极高的网站,毕竟Redis也是为那个用例设计的......
因此,我将跳过如何切换状态提供程序的部分,我将转到:
还有其他解决方案吗?
答案是Redis Sentinel (follow this link to learn more about it)。
来自官方文档:
Redis Sentinel为Redis提供高可用性。实际上 这意味着使用Sentinel可以创建Redis部署 在没有人为干预的情况下抵抗某种失败。