【Azure Redis 缓存】Lettuce 连接到Azure Redis服务,出现15分钟Timeout问题
问题描述
在Java应用中,使用 Lettuce 作为客户端SDK与Azure Redis 服务连接,当遇见连接断开后,长达15分钟才会重连。导致应用在长达15分的时间,持续报错Timeout
问题解答
这是 Lettuce 目前的一个未解决的已知问题,可以查看此 github issue来了解这个问题的背景:
- https://github.com/StackExchange/StackExchange.Redis/issues/1848 (Connection does not re-establish for 15 minutes when running on Linux #1848)
- https://github.com/lettuce-io/lettuce-core/issues/2082 ( Add support for disconnect on timeout to recover early from no
RSTpacket 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)。

可以通过以下的代码来复现 "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问题的更多相关文章
- 【Azure Redis 缓存】如何得知Azure Redis服务有更新行为?
问题描述 Azure Redis作为微软云提供的一种PaaS服务,由于PaaS的特性,服务端的安装和维护.修补.升级等操作均由平台放负责.虽然最终用户只需要关注当前服务的使用,但是后台的升级和补丁行为 ...
- 【Azure Redis 缓存】Windows版创建 Redis Cluster 实验 (精简版)
简介 学习Redis Cluster的第一步,即本地搭建Redis Cluster.但是在Redis的官方文档中,是介绍在Linux系统中搭建Redis Cluster.本文主要介绍在Windows系 ...
- redis缓存数据库及Python操作redis
缓存数据库介绍 NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库,随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站, 特 ...
- Redis缓存篇(一)Redis是如何工作的
Redis提供了高性能的数据存取功能,所以广泛应用在缓存场景中,既能有效地提升业务应用的响应速度,还可以避免把高并发压力发送到数据库层. 因为Redis用作缓存的普遍性以及它在业务应用中的重要作用,所 ...
- 【Azure Redis 缓存】 Python连接Azure Redis, 使用redis.ConnectionPool 出现 "ConnectionResetError: [Errno 104] Connection reset by peer"
问题描述 Python连接Azure Redis, 使用redis.ConnectionPool 出现 "ConnectionResetError: [Errno 104] Connecti ...
- Redis缓存系统-Java-Jedis操作Redis,基本操作以及 实现对象保存
源代码下载: http://download.csdn.net/detail/jiangtao_st/7623113 1.Maven配置 <dependency> <groupI ...
- memcache和redis缓存对比及我为什么选择redis
对比结论 1. 性能上: 性能上都很出色,具体到细节,由于Redis只使用单核,而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比Memcached性能更高.而在100k以 ...
- SQL Server ->> 使用Azure Active Directory Authentication连接到Azure SQL Database
SQL Server 2016以后支持Azure AD集成验证,这当中有些数据驱动必须在高版本才可以使用,支持的包括sqlcmd,SSDT,JDBC,ODBC,SSMS等. 对于SSIS来讲,我们需要 ...
- 【Azure Redis 缓存 Azure Cache For Redis】如何设置让Azure Redis中的RDB文件暂留更久(如7天)
问题描述 Azure Redis和所有的Redis服务一样,可以让你保留存储在Redis中的数据.以防万一在Redis服务器出现故障的时候能尽可能小的减少数据的损失.在Azure Redis服务中,默 ...
- 【Azure Redis 缓存】Azure Redis 功能性讨论二
继承上一次讨论了Azure Redis的可用性,可靠性,稳定性,安全性,监控方面的九大功能点.详情可回顾文章:[Azure Redis 缓存]Azure Redis功能性讨论 这次我们继续讨论Azur ...
随机推荐
- 使用rpm打包nacos然后部署为systemd服务开机自动启动的方法
背景 Nacos是阿里开源的服务注册组件,能够简单的实现微服务的注册与发现机制. 但是官方并没有提供 sytemd的服务脚本, 也没有提供rpm包的方式. 公司里面使用 nacos的场景越来越多, 部 ...
- Widows 关闭 Defender的方法
Study From MS reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender" /v ...
- CCFLOW源码解读系列01-----发起流程
1.发起流程 发起流程时主要做了两件事:一是写入业务数据表,二是新建一条审批流程记录. 发起流程的方法 public static Int64 Node_CreateStartNodeWork(str ...
- FaceFusion:探索无限创意,创造独一无二的面孔融合艺术!
FaceFusion:探索无限创意,创造独一无二的面孔融合艺术! 它使用先进的图像处理技术,允许用户将不同的面部特征融合在一起,创造有趣和令人印象深刻的效果.这个项目的潜在应用包括娱乐.虚拟化妆和艺术 ...
- 4.8 x64dbg 学会扫描应用堆栈
堆栈是计算机中的两种重要数据结构 堆(Heap)和栈(Stack)它们在计算机程序中起着关键作用,在内存中堆区(用于动态内存分配)和栈区(用于存储函数调用.局部变量等临时数据),进程在运行时会使用堆栈 ...
- 《熬夜整理》保姆级系列教程-玩转Wireshark抓包神器教程(1)-初识Wireshark
1.简介 前边已经介绍过两款抓包工具,应该是够用了,也能够处理在日常工作中遇到的问题了,但是还是有人留言让宏哥要讲解讲解Wireshark这一款抓包工具,说实话宏哥之前也没有用过这款工具,只能边研究边 ...
- C++遴选出特定类型的文件或文件名符合要求的文件
本文介绍基于C++语言,遍历文件夹中的全部文件,并从中获取指定类型的文件的方法. 首先,我们来明确一下本文所需实现的需求.现在有一个文件夹,其中包含了很多文件,如下图所示:我们如果想获取其中所 ...
- Linux C/C++ 获取进程号、线程号和设置线程名
1 前言 在Linux开发过程中,设计多线程开发时可以将进程和线程的 id 打印出来,方便开发调试和后期查问题使用,同时也包括设置线程名. 2 函数及头文件 2.1 进程ID #include < ...
- 洛谷P2241 统计方形 ,棋盘问题升级板,给出格子坐标中矩形以及正方形的计算方法
在做这道题之前我们先了解一下棋盘问题 棋盘问题 (qq.com) 对于棋盘问题,我们可以得出对于一个n*n的正方形方格阵如何求其包含的正方形个数 也就是数每个正方形的中间点,然后将其点排列 ...
- 关于Delphi TabOrder 更快捷的设置 方法
今天才发现 delphi IDE 有设置 TabOrder 的 更加 快捷的方法,以前 总觉的 设计 起来 好麻烦.现在 终于 解放了.... ---------------------------- ...