问题描述

在Java应用中,使用 Lettuce 作为客户端SDK与Azure Redis 服务连接,当遇见连接断开后,长达15分钟才会重连。导致应用在长达15分的时间,持续报错Timeout

问题解答

这是 Lettuce 目前的一个未解决的已知问题,可以查看此 github issue来了解这个问题的背景:

  1. https://github.com/StackExchange/StackExchange.Redis/issues/1848 (Connection does not re-establish for 15 minutes when running on Linux #1848)
  2. https://github.com/lettuce-io/lettuce-core/issues/2082 ( Add support for disconnect on timeout to recover early from no RST packet failures #2082)

问题根源是 在于在某些时候Redis服务或者客户端由于网络原因等断掉TCP连接后,Lettuce会等待TCP重试15之后才丢弃该连接(重试15次是和操作系统 tcp_retries2 的配置有关),然后创建新的TCP连接,因此 Lettuce 不会立即重连而是等待15分钟后进行重连,造成了超时。

所以可以通过使用其他Redis的SDK来代替Lettuce(如 Jedis)。或者是根据微软官方文档介绍,修改Linux系统中的 tcp_retries2 参数值 (net.ipv4.tcp_retries2  为 5)。

(参考:https://docs.azure.cn/zh-cn/azure-cache-for-redis/cache-best-practices-connection#tcp-settings-for-linux-hosted-client-applications

可以通过以下的代码来复现 "Lettuce在Linux系统上超时15分钟" 问题

测试代码:

public class Main {
public static void main(String[] args) {
RedisClient client = RedisClient.create(RedisURI.Builder.redis("redis-hostname", 6379)
.withSsl(false)
.withPassword("xxxxxx")
// .withTimeout(Duration.ofSeconds(10))
.build());
client.setOptions(ClientOptions.builder()
// .socketOptions(socketOptions)
.autoReconnect(true)
.disconnectedBehavior(ClientOptions.DisconnectedBehavior.DEFAULT)
.build()); RedisCommands<String, String> sync = client.connect().sync(); for (int i = 0; i < 1000; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
} try {
System.out.println("========" + i);
sync.set("" + i, "" + i); } catch (Exception e) {
System.out.println("eeeeeeee" + e.getMessage());
}
}
}
}

首先,将程序在Linux服务器运行,程序会循环往Redis Set一些值。

然后,人为操作,对Azure Redis进行重启操作。

最后,可以发现Lettuce客户端会持续Timeout,直到大约15分钟后才会和Redis进行重新连接。

参考资料

Azure Redis有关连接复原的最佳做法:https://docs.azure.cn/zh-cn/azure-cache-for-redis/cache-best-practices-connection#tcp-settings-for-linux-hosted-client-applications

【Azure Redis 缓存】Lettuce 连接到Azure Redis服务,出现15分钟Timeout问题的更多相关文章

  1. 【Azure Redis 缓存】如何得知Azure Redis服务有更新行为?

    问题描述 Azure Redis作为微软云提供的一种PaaS服务,由于PaaS的特性,服务端的安装和维护.修补.升级等操作均由平台放负责.虽然最终用户只需要关注当前服务的使用,但是后台的升级和补丁行为 ...

  2. 【Azure Redis 缓存】Windows版创建 Redis Cluster 实验 (精简版)

    简介 学习Redis Cluster的第一步,即本地搭建Redis Cluster.但是在Redis的官方文档中,是介绍在Linux系统中搭建Redis Cluster.本文主要介绍在Windows系 ...

  3. redis缓存数据库及Python操作redis

    缓存数据库介绍  NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库,随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站, 特 ...

  4. Redis缓存篇(一)Redis是如何工作的

    Redis提供了高性能的数据存取功能,所以广泛应用在缓存场景中,既能有效地提升业务应用的响应速度,还可以避免把高并发压力发送到数据库层. 因为Redis用作缓存的普遍性以及它在业务应用中的重要作用,所 ...

  5. 【Azure Redis 缓存】 Python连接Azure Redis, 使用redis.ConnectionPool 出现 "ConnectionResetError: [Errno 104] Connection reset by peer"

    问题描述 Python连接Azure Redis, 使用redis.ConnectionPool 出现 "ConnectionResetError: [Errno 104] Connecti ...

  6. Redis缓存系统-Java-Jedis操作Redis,基本操作以及 实现对象保存

    源代码下载:   http://download.csdn.net/detail/jiangtao_st/7623113 1.Maven配置 <dependency> <groupI ...

  7. memcache和redis缓存对比及我为什么选择redis

    对比结论 1. 性能上: 性能上都很出色,具体到细节,由于Redis只使用单核,而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比Memcached性能更高.而在100k以 ...

  8. SQL Server ->> 使用Azure Active Directory Authentication连接到Azure SQL Database

    SQL Server 2016以后支持Azure AD集成验证,这当中有些数据驱动必须在高版本才可以使用,支持的包括sqlcmd,SSDT,JDBC,ODBC,SSMS等. 对于SSIS来讲,我们需要 ...

  9. 【Azure Redis 缓存 Azure Cache For Redis】如何设置让Azure Redis中的RDB文件暂留更久(如7天)

    问题描述 Azure Redis和所有的Redis服务一样,可以让你保留存储在Redis中的数据.以防万一在Redis服务器出现故障的时候能尽可能小的减少数据的损失.在Azure Redis服务中,默 ...

  10. 【Azure Redis 缓存】Azure Redis 功能性讨论二

    继承上一次讨论了Azure Redis的可用性,可靠性,稳定性,安全性,监控方面的九大功能点.详情可回顾文章:[Azure Redis 缓存]Azure Redis功能性讨论 这次我们继续讨论Azur ...

随机推荐

  1. rabbitmq rpm包安装以及简单设置用户的方法

    公司有一台性能比较好的power机器. 同事要求安装rabbitmq 今天尝试进行了一下处理 公司里面有网络有相应的源 性能还不错 第一步安装一下依赖的erlang yum install erlan ...

  2. 使用CSS3实现鼠标移到图片上图片放大

    转自 http://www.webkaka.com/tutorial/html/2017/072731/ 在现在的网页设计中,鼠标移到图片上图片放大的效果常常被用到,这个效果多应用于文章列表里.我一开 ...

  3. Docker 安装 Nacos 注册中心

    废话不多说直接上安装脚本: 在运行安装脚本之前,首先,我们查看一下 Nacos 的版本分别有哪些使用 docker search nacos: 然后在执行: docker pull nacos/nac ...

  4. MedicalGPT:基于LLaMA-13B的中英医疗问答模型(LoRA)

    MedicalGPT:基于LLaMA-13B的中英医疗问答模型(LoRA).实现包括二次预训练.有监督微调.奖励建模.强化学习训练[LLM:含Ziya-LLaMA]. **** 训练医疗大模型,实现包 ...

  5. 【5】Vscode Todo Tree插件使用和TODO、FIXME和XXX的注释使用说明以及自制自己的TODO图标样式!

    相关文章: [一]tensorflow安装.常用python镜像源.tensorflow 深度学习强化学习教学 [二]tensorflow调试报错.tensorflow 深度学习强化学习教学 [三]t ...

  6. 3.3 Windows驱动开发:内核MDL读写进程内存

    MDL内存读写是一种通过创建MDL结构体来实现跨进程内存读写的方式.在Windows操作系统中,每个进程都有自己独立的虚拟地址空间,不同进程之间的内存空间是隔离的.因此,要在一个进程中读取或写入另一个 ...

  7. 使用 docker 部署 kafka

    在很多时候我们需要使用到消息队列, 其中 kafka 是一个非常优秀的消息队列, 在我们平时开发中也经常会用到, 但是在开发环境中部署 kafka 是一个非常麻烦的事情 在 kafka 官网上, 有一 ...

  8. 17.3 给内存映射文件指定基地址--《Windows核心编程》

    可以使用 MapViewOfFileEx 函数,建议系统把文件映射到指定的地址. 其他参数与 MapViewOfFile 相同,最后一个参数 pvBaseeAddress 指定目标地址.同 Virtu ...

  9. 聚石塔容器查看tomcat 日志的方法

    通过以上命令可以看出日志的路径,从而得出直接执行的命令:tail -f acs/log/catalina.log

  10. Hadoop集群常用组件的命令

    1. Hadoop (1).HDFS:启动HDFS:start-dfs.sh关闭HDFS:stop-dfs.sh格式化NameNode:hdfs namenode -format查看文件系统状态:hd ...