다음을 통해 공유

连接复原能力

重要

Azure Redis 缓存宣布了所有 SKU 的停用时间线。 建议尽快将现有的 Azure Redis 缓存实例移动到 Azure 托管 Redis

有关停用的更多详细信息:

重试命令

将客户端连接配置为使用指数退避重试指令。 有关详细信息,请参阅 重试指南

测试韧性

使用 重新启动 来模拟修补程序,测试系统对连接中断的复原能力。 有关测试性能的详细信息,请参阅 性能测试

Linux 托管客户端应用程序的 TCP 设置

某些 Linux 版本中的默认 TCP 设置可能会导致 Redis 服务器连接失败 13 分钟或更多。 默认设置可以防止客户端应用程序检测关闭的连接,并在连接未正常关闭的情况下自动还原它们。

如果网络连接中断或 Redis 服务器因计划外维护而脱机,则无法重新建立连接。

建议使用以下 TCP 设置:

设置 价值
net.ipv4.tcp_retries2 5

有关该场景的详细信息,请参阅 在 Linux 上运行时,连接在 15 分钟内不会重新建立。 虽然此讨论涉及 StackExchange.Redis 库,但 Linux 上运行的其他客户端库也会受到影响。 该说明仍然很有用,你可以通用化到其他库。

将 ForceReconnect 与 StackExchange.Redis 配合使用

在极少数情况下, StackExchange.Redis 在断开连接后无法重新连接。 在这些情况下,重启客户端或创建新的 ConnectionMultiplexer 修复问题。 我们建议使用单例ConnectionMultiplexer模式,同时允许应用程序定期强制重新连接。 查看与应用程序使用的框架和平台最匹配的快速入门示例项目。 在本 快速入门中,可以看到此代码模式的示例。

用户 ConnectionMultiplexer 必须处理因释放旧错误而可能发生的任何 ObjectDisposedException 错误。

调用 ForceReconnectAsync()RedisConnectionExceptionsRedisSocketExceptions。 你也可以使用ForceReconnectAsync()来调用RedisTimeoutExceptions,但前提是你使用充裕的ReconnectMinIntervalReconnectErrorThreshold。 否则,建立新连接可能会导致正在因过载而超时的服务器发生级联故障。

在 ASP.NET 应用程序中,可以在 Microsoft.Extensions.Caching.StackExchangeRedis 包中使用集成实现,而不是直接使用 StackExchange.Redis 包。 如果在 ASP.NET 应用程序中使用 Microsoft.Extensions.Caching.StackExchangeRedis ,而不是直接使用 StackExchange.Redis ,则可以将 UseForceReconnect 属性设置为 true:

Microsoft.AspNetCore.Caching.StackExchangeRedis.UseForceReconnect = true

配置适当的超时

在连接复原能力中,需要考虑两个超时值: 连接超时命令超时

连接超时

connect timeout客户端等待与 Redis 服务器建立连接的时间。 将您的客户端库配置为使用 connect timeout 为 5 秒,以确保系统在较高的 CPU 负载条件下有足够的时间进行连接。

一个小 connection timeout 值不能保证在该时间范围内建立连接。 如果出现问题(高客户端 CPU、高服务器 CPU 等),则短 connection timeout 值会导致连接尝试失败。 这种行为往往使情况变得更糟。 更短的超时通过强制系统重启尝试重新连接的过程来加剧问题,这可能导致 连接 -> 失败 -> 重试 循环。

命令超时

大多数客户端库具有另一个超时配置,即 command timeouts,这是指客户端等待 Redis 服务器响应的时间。 虽然我们建议初始设置在5秒以内,但请根据您的具体场景以及缓存中存储的值的大小,考虑将command timeout设定得更高或更低。

如果 command timeout 太小,则连接看起来不稳定。 但是,如果 command timeout 太大,应用程序可能需要等待很长时间才能确定命令是否会超时。

避免客户端连接高峰

避免在连接丢失后重新连接时同时创建许多连接。 与 短连接超时 可能导致较长中断的方式类似,同时启动许多重新连接尝试也会增加服务器负载,并延长所有客户端成功重新连接所需的时间。

如果要重新连接多个客户端实例,请考虑错开新连接,以避免连接客户端数量的急剧上升。

注释

使用 StackExchange.Redis 客户端库时,请在连接字符串中设置为abortConnectfalse。 建议让 ConnectionMultiplexer 处理重新连接。 有关详细信息,请参阅 StackExchange.Redis 最佳做法

避免剩余连接

缓存对每个缓存层的客户端连接数有限制。 确保当客户端应用程序重新创建连接时,关闭并删除旧连接。

提前维护通知

使用通知了解即将进行的维护。 有关详细信息,请参阅 是否可以在计划内维护之前收到通知

计划维护时段

调整缓存设置以适应维护。 有关创建维护时段以减少对缓存的任何负面影响的详细信息,请参阅 更新通道和计划更新

更多弹性设计模式

应用弹性设计模式。 有关详细信息,请参阅 如何使应用程序具有复原能力

空闲超时

Azure Cache for Redis 的空闲连接超时为 10 分钟。 10分钟的超时时间允许服务器自动清理漏泄连接或被客户端应用程序遗弃的连接。 大多数 Redis 客户端库具有定期发送 heartbeatkeepalive 命令的内置功能,以防止连接关闭,即使客户端应用程序没有请求也是如此。

如果存在连接闲置超过 10 分钟的风险,请将 keepalive 间隔配置为小于 10 分钟的值。 如果应用程序使用的客户端库对keepalive功能没有原生支持,则可以通过定期发送PING命令来在应用程序中实现它。