redis抖动问题导致延迟或者断开的处理方案

目录:

    • 1、使用背景
    • 2、redis重试机制
    • 3、redis重连机制
    • 4、其他一些解决redis抖动问题方案

1、使用背景

客户反馈文件偶现打不开,报错现象是session not exist,最终定位是redis抖动导致的延迟/断开的现象,最终研发团方案是加入redis重试机制/重连机制来解决该问题。

2、redis重试机制

① 标准架构实例或集群架构代理(Proxy)模式;使用JedisPool模式。

该示例会将SET命令自动重试5次,且总重试时间不超过10s,每次重试之间等待类指数间隔的时间,如果最终不成功,则抛出异常。

PooledConnectionProvider provider = new PooledConnectionProvider(HostAndPort.from("127.0.0.1:6379"));
int maxAttempts = 5; // 最大重试次数
Duration maxTotalRetriesDuration = Duration.ofSeconds(10); // 最大的重试时间
UnifiedJedis jedis = new UnifiedJedis(provider, maxAttempts, maxTotalRetriesDuration);
try {System.out.println("set key: " + jedis.set("key", "value"));
} catch (Exception e) {// 表示尝试maxAttempts次或到达了最大查询时间maxTotalRetriesDuration仍旧没有访问成功。e.printStackTrace();
}

② 集群架构直连模式;使用JedisCluster模式。

可以通过配置maxAttempts参数来定义失败情况下的重试次数,默认值为5,如果最终不成功,则抛出异常。

HostAndPort hostAndPort = HostAndPort.from("127.0.0.1:30001");
int connectionTimeout = 5000;
int soTimeout = 2000;
int maxAttempts = 5;
ConnectionPoolConfig config = new ConnectionPoolConfig();
JedisCluster jedisCluster = new JedisCluster(hostAndPort, connectionTimeout, soTimeout, maxAttempts, config);
try {System.out.println("set key: " + jedisCluster.set("key", "value"));
} catch (Exception e) {// 表示尝试maxAttempts之后仍旧没有访问成功。e.printStackTrace();
}

2.1–Redisson客户端提供了两个参数来控制重试逻辑:

retryAttempts:重试次数,默认为3。
retryInterval:重试间隔,默认为1,500毫秒。

重试示例如下:

Config config = new Config();
config.useSingleServer().setTimeout(1000).setRetryAttempts(3).setRetryInterval(1500) //ms.setAddress("redis://127.0.0.1:6379");
RedissonClient connect = Redisson.create(config);

3、redis重连机制

3.1、实现步骤

下表展示了实现Redis配置重连的步骤:

在这里插入图片描述

3.2、代码实现

  • 3.2.1 创建Redis连接池

首先,我们需要创建一个Redis连接池,用于管理连接的创建和销毁。我们可以使用JedisPool类来实现。以下是创建Redis连接池的代码:

JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(10);
poolConfig.setMaxIdle(5);
poolConfig.setMinIdle(1);
JedisPool jedisPool = new JedisPool(poolConfig, "localhost", 6379);
  • 3.2.2 获取Redis连接

接下来,我们需要从连接池中获取一个Redis连接。我们可以使用getResource()方法来获取连接。以下是获取Redis连接的代码:

Jedis jedis = jedisPool.getResource();
  • 3.2.3 检测Redis连接状态

在使用Redis连接进行操作之前,我们需要检测连接的状态,确保连接正常。我们可以使用ping()方法来检测连接状态。以下是检测Redis连接状态的代码:

String response = jedis.ping();
if (!"PONG".equals(response)) {// 连接已断开,尝试重新连接// TODO: 重新连接的逻辑
}
  • 3.2.4 重新连接

如果连接断开,我们需要尝试重新连接。重新连接的逻辑可以放在一个循环中,直到连接成功或达到重试次数上限。以下是重新连接的代码:

int maxRetries = 3;
int retries = 0;
while (!"PONG".equals(response) && retries < maxRetries) {jedis.close(); // 关闭旧连接jedis = jedisPool.getResource(); // 创建新连接response = jedis.ping(); // 检测新连接状态retries++;
}
if (!"PONG".equals(response)) {throw new RuntimeException("Redis connection failed after maximum retries.");
}
  • 3.2.5 完整示例代码

下面是一个完整的示例代码,演示了如何实现Redis配置重连功能:

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;public class RedisReconnectExample {private static final int MAX_RETRIES = 3;public static void main(String[] args) {JedisPoolConfig poolConfig = new JedisPoolConfig();poolConfig.setMaxTotal(10);poolConfig.setMaxIdle(5);poolConfig.setMinIdle(1);JedisPool jedisPool = new JedisPool(poolConfig, "localhost", 6379);Jedis jedis = jedisPool.getResource();String response = jedis.ping();int retries = 0;while (!"PONG".equals(response) && retries < MAX_RETRIES) {jedis.close();jedis = jedisPool.getResource();response = jedis.ping();retries++;}if (!"PONG".equals(response)) {throw new RuntimeException("Redis connection failed after maximum retries.");}// TODO: 使用Redis连接进行操作jedis.close();jedisPool.close();}
}

4、其他一些解决redis抖动问题方案

  1. 数据分片:将数据分散到多个Redis实例上,避免单个实例的负载过高导致响应抖动。可以使用Redis Cluster或者自己实现分片逻辑。

  2. 负载均衡:使用负载均衡器将请求分发到多个Redis实例上,均衡负载,防止单个实例负载过高。常见的负载均衡器有Nginx、HAProxy等。

  3. 增加实例数量:如果Redis实例的负载过高,可以考虑增加实例数量,将负载分散到更多的实例上,降低单个实例的负载。

  4. 优化Redis配置:根据实际情况调整Redis的配置,例如调整最大连接数、超时时间等参数,以提高系统的吞吐量和稳定性。

  5. 使用Pipeline批量操作:通过使用Redis的Pipeline功能,可以将多个操作批量发送给Redis,减少网络开销和响应时间。

  6. 使用缓存:将经常访问的数据缓存到Redis中,减少对数据库的访问,提高响应速度。

  7. 监控和调优:使用监控工具对Redis进行实时监控,分析并找出响应抖动的原因,然后进行调优。

总结来说,解决Redis响应抖动问题可以通过数据分片、负载均衡、增加实例数量、优化配置、使用Pipeline批量操作、使用缓存等方法来提高Redis的性能和稳定性。

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

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

相关文章

排序算法及实现(上)

稳定性的判断&#xff1a;如果两个相同大小的元素也进行了交换就是不稳定&#xff0c;否则稳定 1.直接插入排序&#xff1a; 当插入第 i 位置元素时&#xff0c;前面 0 到 i-1 位置的元素已经各自有序。 此时将i 再次从i-1到0位置依次进行比较。找到合适位置将其插入&#x…

【Python】PYQT5详细介绍

本专栏内容为&#xff1a;Python学习专栏 通过本专栏的深入学习&#xff0c;你可以了解并掌握Python。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;Python &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &#x1f3…

GitHub操作

远程库-GitHub GitHub网址 GitHub是全球最大的远程库 1. 创建远程库 2. 远程仓库操作 2.1 创建远程仓库别名 git remote -v 查看当前所有远程库地址别名 git remote add 别名 远程地址 设置远程库地址别名 案例操作 起一个别名会出现两个别名&#xff0c;是因为既可以拉取…

macOS DOSBox 汇编环境搭建

正文 一、安装DOSBox 首先前往DOSBox的官网下载并安装最新版本的DOSBox。 二、下载必备的工具包 在用户目录下新建一个文件夹&#xff0c;比如 dosbox: mkdir dosbox然后下载一些常用的工具。下载好了后&#xff0c;将这些工具解压&#xff0c;重新放在 dosbox 这个文件夹…

数据链路层(详细版)【02】

接 数据链路层&#xff08;详细版&#xff09;【01】 文章目录 四、以太网MAC层&#xff08;一&#xff09;MAC地址组成&#xff08;1&#xff09;48位MAC地址格式&#xff08;2&#xff09;单播地址 & 多播地址 & 广播地址&#xff08;3&#xff09;全球管理 & 本…

笔记2:cifar10数据集获取及pytorch批量处理

&#xff08;1&#xff09;cifar10数据集预处理 CIFAR-10是一个广泛使用的图像数据集&#xff0c;它由10个类别的共60000张32x32彩色图像组成&#xff0c;每个类别有6000张图像。 CIFAR-10官网 以下为CIFAR-10数据集data_batch_*表示训练集数据&#xff0c;test_batch表示测试…

Colibri for Mac v2.2.0 原生无损音频播放器 激活版

Colibri支持所有流行的无损和有损音频格式的完美清晰的比特完美播放&#xff0c;仅使用微小的计算能力&#xff0c;并提供干净和直观的用户体验。 Colibri在播放音乐时使用极少的计算能力。该应用程序使用最先进的Swift 3编程语言构建&#xff0c;BASS音频引擎作为机器代码捆绑…

46 udp网络程序

查询网络服务的命令 netstat -nlup n: 显示数字 a&#xff1a;显示所有 u&#xff1a;udp服务 p&#xff1a;显示pid Recv-Q收到的数量&#xff0c;本地ip和远端ip&#xff0c;00表示可以收到任何地址 网络聊天 服务端 定义一个server类&#xff0c;成员保存ip地址&#xff…

JVM 类加载机制

JVM 类加载机制分为五个部分&#xff1a;加载&#xff0c;验证&#xff0c;准备&#xff0c;解析&#xff0c;初始化&#xff0c;下面我们就分别来看一下这五个过程。 加载 加载是类加载过程中的一个阶段&#xff0c;这个阶段会在内存中生成一个代表这个类的 java.lang.class 对…

基于yolov5+streamlit目标检测演示系统设计

YOLOv5与Streamlit&#xff1a;智能目标检测可视化展示介绍 随着人工智能技术的飞速发展&#xff0c;目标检测技术已成为推动智能化社会进步的关键技术之一。在众多目标检测算法中&#xff0c;YOLOv5以其卓越的性能和实时性&#xff0c;成为了业界的佼佼者。与此同时&#xff…

UDP多播

1 、多播的概念 多播&#xff0c;也被称为组播&#xff0c;是一种网络通信模式&#xff0c;其中数据的传输和接收仅在同一组内进行。多播具有以下特点&#xff1a; 多播地址标识一组接口&#xff1a;多播使用特定的多播地址&#xff0c;该地址标识一组接收数据的接口。发送到多…

实现红黑树

目录 红黑树的概念 红黑树的节点结构定义 红黑树的插入 红黑树的验证 实现红黑树完整代码 红黑树的概念 红黑树 &#xff0c;是一种 二叉搜索树 &#xff0c;但 在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是 Red 或 Black 。 通过对 任何一条从根到叶子的…

Leetcode39.组合总和

文章目录 题目描述解题思路重复子集剪枝 代码 题目 参考题解 题目描述 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返…

【JavaSE】/*初识Java*/

目录 一、了解 Java 语言 二、Java 语言的重要性 2.1 使用程度 2.2 工作领域 三、Java 语言的特性 四、Java 的基础语法 五、可能遇到的错误 六、第一个 java 程序代码解析 七、Java 注释 八、Java 标识符 九、Java 关键字 一、了解 Java 语言 Java 是由 Sun Micr…

图论(洛谷刷题)

目录 前言&#xff1a; 题单&#xff1a; P3386 【模板】二分图最大匹配 P1525 [NOIP2010 提高组] 关押罪犯 P3385 【模板】负环 P3371 【模板】单源最短路径&#xff08;弱化版&#xff09; SPFA写法 Dij写法&#xff1a; P3385 【模板】负环 P5960 【模板】差分约束…

【iOS开发】—— 初识锁

【iOS开发】—— 初识锁 线程安全锁的种类自旋锁定义原理自旋锁缺点OSSpinLock&#xff08;自旋锁&#xff09; 互斥锁os_unfair_lockpthread_mutexNSLockNSRecusiveLockSemaphore信号量synchronized 总结两种之间的区别和联系&#xff1a; 线程安全 当一个线程访问数据的时候…

双向冒泡法,可以只求最大最小值

int BiBubbleSort(int Arr[],int n,int maxnum){int left0,rightn-1;int i;bool notDone true;int temp;if(n<2)return -1;while(left<right&&notDone){ notDone false; //设置未发生交换标志 for(ileft;i<right;i){if(Arr[i]>Arr[i1]){//swap(Arr[…

Python-VBA函数之旅-staticmethod函数

目录 一、staticmethod函数的常见应用场景 二、staticmethod函数使用注意事项 三、如何用好staticmethod函数&#xff1f; 1、staticmethod函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a; https://blog…

HackMyVM-VivifyTech

目录 信息收集 arp nmap nikto whatweb WEB web信息收集 wpscan feroxbuster hydra 提权 系统信息收集 横向渗透 git提权 get root 信息收集 arp ┌──(root㉿0x00)-[~/HackMyVM] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 08:00:27:9d:6d:7b, …