2

我使用 Redis 作为会话状态提供程序,但由于我有很多用户,有时 Redis 会出现故障。所以我想有一个默认的会话状态提供者来使用,以防第一个出现故障。

这可能吗?还有其他解决方案吗?

谢谢

4

2 回答 2

1

ASP.NET 的会话管道不支持回退到不同的会话提供程序,因此必须将回退功能融入 Redis 会话状态提供程序。但是 Redis 提供者只与 Redis 对话,所以你必须自己做这件事,要么在你自己的项目分支中,要么创建你自己的自定义会话提供者,它继承自SessionStateStoreProviderBase并包装对RedisSessionStateProvider的访问(以及任何回退如果您的提供程序检测到 Redis 中断,您希望使用的存储逻辑)。

但是你现在看起来一团糟:你应该在哪里临时存储数据(一个进程内缓存?现在你在谈论粘性会话。SQL Server?又一个要管理的服务器)......而且,一旦 Redis 出现备份,您如何使用临时存储中的活动会话重新填充它?有很多问题需要思考,难怪微软不支持。

因此,正如@MatíasFidemraizer 所暗示的那样,您最好的选择是将精力集中在改进 Redis 部署上,以便它可以处理您的负载,并使用 Redis Sentinel 设置主从复制以进行自动故障转移。如果工作量太大,那么有许多商业解决方案可以为您完成繁重的故障转移(我工作的公司有一个非常简单的产品,称为ScaleOut SessionServer

于 2016-01-14T22:14:05.737 回答
0

因为我有很多用户,所以有时 Redis 会出现故障

我怀疑这应该是幕后的原因。你有足够的内存吗?可能有很多原因,但我怀疑问题是“很多用户”,除非你是谷歌、Twitter 或一些流量极高的网站,毕竟,Redis 也是为那个用例设计的......

所以我会跳过你如何切换状态提供者的部分,我会去:

还有其他解决方案吗?

答案是Redis Sentinel(点击此链接了解更多信息)

来自官方文档:

Redis Sentinel 为 Redis 提供高可用性。实际上,这意味着使用 Sentinel,您可以创建一个 Redis 部署,该部署无需人工干预即可抵抗某些类型的故障。

于 2016-01-14T19:11:05.713 回答