Redis生产事故(Jedis)

现象

jedis(ClusterPipeline)在pipeline模式下发生读写错误并不会同步redis集群拓扑变化.

分析

jedis客户端本身不默认自动支持集群拓扑的刷新。Jedis是一个较为底层的客户端,它提供了与Redis服务器进行交互的基本功能,但对于集群的高级特性,如自动拓扑刷新和故障转移,Jedis的默认行为是依赖于应用程序来处理的。

在Jedis中,集群拓扑的更新通常需要应用程序手动进行或通过某些机制触发。例如,你可以使用Jedis提供的JedisCluster类来创建一个集群连接,并通过该连接执行命令。当集群拓扑发生变化时,你需要重新创建JedisCluster实例或更新现有的实例以反映最新的拓扑结构。

Jedis也提供了一些方法来获取集群的状态信息,如clusterNodes()clusterInfo(),你可以使用这些方法来检查集群的状态,并在必要时更新你的Jedis集群连接。

关于 Jedis 客户端处理 Redis 集群的异常和自动故障恢复机制,虽然 Jedis 本身在处理连接中断时确实具有一定的重试逻辑,但请注意以下几点:

  1. 集群拓扑刷新:JedisCluster 在初始化后并不主动监控或刷新服务端的集群信息。当集群拓扑发生变化时(例如节点增加、删除或者主从切换),客户端并不会自动获取新的集群配置。应用程序需要根据业务需求手动处理这类情况,例如重新初始化 JedisCluster 对象或者调用 refreshCluster() 方法来强制更新集群配置。

  2. 自动故障恢复:Jedis 在执行命令时,如果遇到如 MOVED 或 ASK 类型的错误响应(这是 Redis Cluster 在请求路由到错误节点时返回的错误类型),会根据这些异常反馈尝试重定向到正确的节点上执行命令。这意味着在单个操作层面,Jedis 具有一定的自我修复能力,能够应对节点故障转移的情况。

  3. 连接管理与重连:对于连接中断等网络问题,Jedis 的连接池(如 JedisPool)通常会配置超时重试策略,在尝试获取连接失败时进行重试。但是这更多的是针对单个 Redis 节点的连接重试,并非直接指向集群拓扑变化的自动适应。

综上所述,虽然 Jedis 在执行命令过程中可以通过异常反馈实现一定程度的自动故障恢复,但对整个 Redis 集群拓扑结构的变化,则不具备自动刷新和重新配置的能力。开发人员仍需结合业务场景自行设计相应的集群状态监测和更新机制,你可以在应用程序中实现自定义的逻辑来定期检查和更新集群拓扑。这可以通过定时任务或使用Redis发布/订阅机制来实现,以便在集群拓扑发生变化时接收通知并更新Jedis连接。

总结

对比

Jedis
  • 优点:

    • Jedis 是早期出现且成熟的客户端,提供了全面的 Redis 命令支持。
    • 直接操作 Redis API 比较简洁,对于简单的使用场景易于上手。
  • 缺点:

    • 在集群模式下,JedisCluster 对于节点状态变化的处理不如 Lettuce 自动化,需要手动管理连接和路由信息。
    • Jedis 的实例不是线程安全的,所以在并发环境下,每个线程通常需要有自己的 Jedis 实例或者通过连接池来管理资源。
    • Jedis 不支持异步非阻塞 I/O(直至 Jedis 4.x 版本开始引入),这可能影响到高并发场景下的性能表现。
Lettuce
  • 优点:

    • Lettuce 是基于 Netty 实现的,支持异步非阻塞 I/O,具有较高的性能和可伸缩性。
    • 提供了对 Redis 集群和哨兵模式的自动发现和重新配置功能,能够更好地适应集群拓扑结构的变化。
    • Lettuce 的连接池管理更为精细,适合大规模并发环境。
    • 支持响应式编程模型(Reactor, RxJava)以实现更灵活的事件驱动编程风格。
  • 缺点:

    • API 设计相对复杂一些,特别是对于不熟悉响应式编程的开发者来说可能学习曲线稍陡峭。
    • 虽然功能丰富,但如果只需要简单操作 Redis,Lettuce 可能显得过于重型。

综上所述,在Redis集群模式下,如果项目强调高性能、异步处理和更好的集群管理能力,Lettuce 通常是更好的选择;而如果需求比较简单,并发要求不高,或者是维护现有基于 Jedis 的项目,Jedis 也可以是一个可行的选择。不过随着技术发展,Lettuce 已经成为 Spring Boot 等现代框架中默认推荐的 Redis 客户端,因为它更能满足现代应用架构的灵活性和性能要求。

客户端选型

在Java中,有多个流行的Redis客户端可供选择。以下是一些常见的Redis Java客户端:

  1. Jedis: Jedis是最早和广泛使用的Java Redis客户端之一。它提供了与Redis服务器的同步和异步连接,并支持大多数Redis命令。Jedis是一个相对底层的客户端,需要应用程序手动处理连接池和集群拓扑的更新

  2. Lettuce: Lettuce是一个现代、线程安全的Redis客户端,专注于性能。它提供了异步和非阻塞的API,并支持Redis集群的自动拓扑更新和故障转移。Lettuce是一个更高级别的客户端,更适合构建大规模分布式系统。

  3. Redisson: Redisson是一个在Redis基础上实现的Java驻留对象和服务。它提供了许多分布式Java对象和服务,如分布式锁、分布式集合、分布式计数器、分布式计划任务等。Redisson也支持Redis集群,并提供了自动拓扑更新和故障转移功能。

  4. Spring Data Redis: 如果你正在使用Spring框架,Spring Data Redis是一个很好的选择。它提供了对Redis的支持,并集成了Spring的特性和便利性。Spring Data Redis支持Redis模板和Repository模式,并简化了与Redis的交互。

在选择客户端时,应该考虑你的项目需求、性能要求、集群支持以及其他高级功能的需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/727870.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

grid布局所有元素在同一行显示且等分列

目录 一、问题 二、实现方式 三、总结 tiips:如嫌繁琐,直接移步总结即可! 一、问题 1.grid布局可以通过 grid-template-columns来指定列的宽度。且可以通过repeat来指定重复的次数。但是现在的需求是:grid布局中元素的数量不确定&#…

一篇文章带你通关并查集(持续更新中)

这篇文章的所有题目均来自于自行整理,代码均来自于自行梳理调试(思路可能比较暴力)。初衷在于整理练习思路,且起到督促自己学习的作用 本文分成将三个模块 1.普及组 (洛谷黄题) 2.提高组 (洛…

sqlserver 默认端口号不通 1433 开启监听

1.打开SQL Server 2022 配置管理器 查看这3个东西是否启用,然后双击TCP/IP 把默认端口全部设置成1433 然后cmd netstat -an | find "1433" 查看端口是否打开监听

存储架构 NAS 与 SAN:有什么区别?

SAN(Storage Area Network)和NAS(Network Attached Storage)是两种存储架构,它们在数据存储和管理方面有着不同的设计理念和应用场景。SAN通常将存储设备连接到一个独立的高速网络,而NAS则通过普通的网络协…

Unity性能优化篇(九) 模型优化之LOD技术概述以及操作方法

LOD模型优化技术概述: 1.LOD技术可以根据摄像头远近来显示不同精度的模型(例如吃鸡游戏 随着跳伞高度 来显示下面树木以及建筑的模型精度) LOD模型优化技术操作方法: 可使用Unity自带的LOD Group组件,并根据项目的情况来调整该组件的属性。Untiy资源商店也有一些其…

信息安全概论 习题

用密钥information构造一个Playfair矩阵 Playfair密码是一种替换加密技术,它不像传统的单字母替换密码那样工作,而是将信息分成一对字母(双字母)进行加密。构造Playfair矩阵时,首先需要一个密钥词,然后根据…

如何选择VR全景设备,才能拍摄高质量的VR全景?

随着VR全景技术的不断成熟和发展,VR全景已经成为了摄影爱好者乐于尝试的新手段,VR全景也为广大用户提供了一个全新的视角来探索世界,如果想要拍摄出高质量的VR全景,选择合适的VR全景拍摄设备以及掌握正确的拍摄技巧才是关键。 VR全…

云手机:网页运行?易用性分析

云手机作为一种新兴的技术,近年来在移动互联网领域备受关注。它通过云计算技术,将手机的操作系统和应用程序运行在远程服务器上,用户通过网络连接访问和操作云手机,从而实现了在任何设备上都能够享受手机的功能和体验。本文将探讨…

vue系列——vscode,node.js vue开发环境搭建

第一步安装node.js 推荐使用nvm进行node.js 的安装 nvm(Node.js version manager) 是一个命令行应用,可以协助您快速地 更新、安装、使用、卸载 本机的全局 node.js 版本。 可以去网上查找相关版本 我这里使用 nvm-setu… 链接:https://pan.baidu.com/s/1UEUtmzw5x…

代码随想录算法训练营第三十九天|动态规划|62.不同路径、63. 不同路径 II

62.不同路径 文章 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路径&…

12.WEB渗透测试-Linux系统管理、安全加固(下)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:11.WEB渗透测试-Linux系统管理、安全加固(上)-CSDN博客 Linux任务…

好书安利:《大模型应用开发极简入门:基于GPT-4和ChatGPT》这本书太好了!150页就能让你上手大模型应用开发

文章目录 前言一、ChatGPT 出现,一切都变得不一样了二、蛇尾书特色三、蛇尾书思维导图四、作译者简介五、业内专家书评总结 前言 ​如果问个问题:有哪些产品曾经创造了伟大的奇迹?ChatGPT 应该会当之无愧入选。仅仅发布 5 天,Chat…

【RabbitMQ】WorkQueue

📝个人主页:五敷有你 🔥系列专栏:MQ ⛺️稳中求进,晒太阳 Work Queues Work queues任务模型,简单来说就是让多个消费者绑定到一个队列,共同消费队列中的消息 当消息处理比较耗时的时候&…

力扣112 路径总和 Java版本

文章目录 题目描述解题思路代码 题目描述 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则&#xff0…

新型设备巡检方案-手机云巡检

随着科技的不断发展,设备巡检工作也在逐步向智能化、高效化方向转变。传统的巡检方式往往需要人工逐个设备检查,耗时耗力,效率低下,同时还容易漏检和误检。而新型设备巡检应用—手机蓝牙云巡检的出现,则为设备巡检工作…

每日OJ题_链表②_力扣24. 两两交换链表中的节点

目录 力扣24. 两两交换链表中的节点 解析代码 力扣24. 两两交换链表中的节点 24. 两两交换链表中的节点 难度 中等 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即&…

c语言如何调用函数

c语言中要调用的函数必须先定义,后调用。 调用函数的语法形式是 函数名(实参列表) 如果实参列表没有参数,括号也不能省去。如果有多个参数,则用逗号隔开。 调用函数的三种形式: 1.函数调用语句。 2.函数表达式 3.函数参数 代码示例如下 #in…

Java定时调度范式定时操作

在 Java 中,我们可以使用各种方法来执行定时操作。这些操作包括执行任务、调度任务、执行重复任务等。下面将介绍几种常见的 Java 定时调度范式。 1. Timer 和 TimerTask Java 提供了 Timer 和 TimerTask 类,用于执行定时任务。 示例代码:…

MyBatis操作数据库(SQL注入)

本文主要来讲解6大标签&#xff0c;以便更好的MyBatis操作数据库&#xff01; <if>标签<trim>标签<where>标签<set>标签<foreach>标签<include>标签 前提需求&#xff1a; MyBatis是一个持久层框架&#xff0c;和Spring没有任何关系&…

【力扣白嫖日记】1070.产品销售分析III

前言 练习sql语句&#xff0c;所有题目来自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免费数据库练习题。 今日题目&#xff1a; 1070.产品销售分析III 表&#xff1a;Sales 列名类型sale_idintproduct_idintyearintquantityintpriceint …