为什么Redis不推荐使用Lettuce

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 为什么Redis不推荐使用Lettuce

问题描述

为什么Redis不推荐使用Lettuce


回答

问题原因

  1. 在Lettuce 连接到 Redis 主机并正常读写时。
  2. 此时如果主机出现故障(硬件问题直接导致关机,此时没有给客户端的RST回复)。
  3. 客户端会继续超时,直到tcp重传结束,才能恢复。此时在 Linux 中大约需要 925.6 s(参考 tcp_retries2 )。


为什么keepalive 没有起到保活的效果:

因为重传包的优先级高于keepalive,所以在到达keepalive阶段之前,会继续重传,直到重新连接。

问题出现的场景

  1. 在大多数情况下,当操作系统关闭和进程退出时,RST可以返回给客户端,但当电源被切断或某些机器硬件发生故障时,RST将不会返回。
  2. 在云环境中,通常使用SLB。当后端主机故障时,如果SLB不支持连接耗尽,就会出现问题


问题重现步骤

  1. Start a Redis on a certain port, let's say 6379, and use the following code to connect to Redis.
RedisClientclient=RedisClient.create(RedisURI.Builder.redis(host, port).withPassword(args[1])
                                        .withTimeout(Duration.ofSeconds(timeout)).build());
client.setOptions(ClientOptions.builder()
                  .socketOptions(socketOptions)
                  .autoReconnect(autoReconnect)
                  .disconnectedBehavior(disconnectedBehavior)
                  .build());
RedisCommands<String, String>sync=client.connect().sync();
for (inti=0; i<times; i++) {
Thread.sleep(1000);
try {
LOGGER.info("{}:{}", i, sync.set(""+i, ""+i));
    } catch (Exceptione) {
LOGGER.error("Set Exception: {}", e.getMessage());
    }
        }

   

  1. Use iptables to disable port 6379 packets on the Redis machine.

iptables -A INPUT -p tcp --dport 6379 -j DROP
iptables -A OUTPUT -p tcp --sport 6379 -j DROP

  1. Observe that the client starts timing out and cannot recover until after 925.6 s (related to tcp_retries2)


  1. After the test, clear the iptables rules

iptables -F INPUT
iptables -F OUTPUT


参考issues 记录:https://github.com/lettuce-io/lettuce-core/issues/2082


解决方案

建议使用Jedis 客户端连接。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
NoSQL Java Redis
redis集群拓扑结构自动更新:使用Lettuce连接Cluster集群实例时异常处理(一)
redis集群拓扑结构自动更新:使用Lettuce连接Cluster集群实例时异常处理
901 0
|
4月前
|
缓存 NoSQL 网络协议
【Azure Redis 缓存】Lettuce 连接到Azure Redis服务,出现15分钟Timeout问题
【Azure Redis 缓存】Lettuce 连接到Azure Redis服务,出现15分钟Timeout问题
【Azure Redis 缓存】Lettuce 连接到Azure Redis服务,出现15分钟Timeout问题
|
4月前
|
NoSQL 网络协议 Redis
【Azure Redis】AKS中使用Lettuce连接Redis Cache出现 timed out 问题的解决思路
【Azure Redis】AKS中使用Lettuce连接Redis Cache出现 timed out 问题的解决思路
【Azure Redis】AKS中使用Lettuce连接Redis Cache出现 timed out 问题的解决思路
|
4月前
|
NoSQL 网络协议 Linux
【Azure Redis】Lettuce客户端遇见连接Azure Redis长达15分钟的超时
【Azure Redis】Lettuce客户端遇见连接Azure Redis长达15分钟的超时
|
4月前
|
缓存 NoSQL Java
【Azure Redis 缓存】定位Java Spring Boot 使用 Jedis 或 Lettuce 无法连接到 Redis的网络连通性步骤
【Azure Redis 缓存】定位Java Spring Boot 使用 Jedis 或 Lettuce 无法连接到 Redis的网络连通性步骤
|
7月前
|
NoSQL Java 数据库连接
springboot整合Redis中连接池jedis与lettuce的对比和实现
springboot整合Redis中连接池jedis与lettuce的对比和实现
1081 0
|
4月前
|
NoSQL Java 调度
Lettuce的特性和内部实现问题之Redis的管道模式提升性能的问题如何解决
Lettuce的特性和内部实现问题之Redis的管道模式提升性能的问题如何解决
|
4月前
|
NoSQL 网络协议 安全
Lettuce的特性和内部实现问题之Lettuce天然地使用管道模式与Redis交互的问题如何解决
Lettuce的特性和内部实现问题之Lettuce天然地使用管道模式与Redis交互的问题如何解决
|
5月前
|
安全 NoSQL Java
网络安全-----Redis12的Java客户端----客户端对比12,Jedis介绍,使用简单安全性不足,lettuce(官方默认)是基于Netty,支持同步,异步和响应式,并且线程是安全的,支持R
网络安全-----Redis12的Java客户端----客户端对比12,Jedis介绍,使用简单安全性不足,lettuce(官方默认)是基于Netty,支持同步,异步和响应式,并且线程是安全的,支持R
|
7月前
|
NoSQL 网络协议 Java
Redis客户端Lettuce深度分析介绍(上)
Spring Boot自2.0版本开始默认使用Lettuce作为Redis的客户端(注1)。Lettuce客户端基于Netty的NIO框架实现,对于大多数的Redis操作,只需要维持单一的连接即可高效支持业务端的并发请求 —— 这点与Jedis的连接池模式有很大不同。同时,Lettuce支持的特性更加全面,且其性能表现并不逊于,甚至优于Jedis。本文通过分析Lettuce的特性和内部实现(基于6.0版本),及其与Jedis的对照比较,对这两种客户端,以及Redis服务端进行深度探讨。
101664 8