Redis生产实战-Redis集群故障探测以及降级方案设计

Redis 集群故障探测

在生产环境中,如果 Redis 集群崩溃了,那么会导致大量的请求打到数据库中,会导致整个系统都崩溃,所以系统需要可以识别缓存故障,限流保护数据库,并且启动接口的降级机制

降级方案设计
我们在系统中操作 Redis 一般都是通过工具类来进行操作的,假设工具类有两个 RedisCacheRedisLock,那么通过 AOP 对这两个工具类的所有方法做一个切面,如果在这两个类中执行 Redis 操作时,Redis 挂掉了,就会抛出异常(Redis 连接失败),那么我们在切面的处理方法上捕捉异常,再记录下来,判断是 Redis 集群挂了还是展示网络波动

判断是集群挂掉还是网络波动的话,我们可以配置规则,比如 30 秒内出现了 3 次 Redis 连接失败,就认为 Redis 挂掉了(可以使用 Hotkey 配置规则),那么如何自动恢复呢?可以设置 hotkey 中的缓存过期时间,设置为 60 秒,那么缓存过期之后,会再次尝试去操作 Redis,如果 Redis 恢复了就可以正常使用了,如果还没有恢复,会继续向 hotkey 中 set 数据,切面中记录 Redis 故障代码如下:

@Around("redisCachePointcut() || redisLockPointcut()")
public Object around(ProceedingJoinPoint point) {// 签名信息Signature signature = point.getSignature();// 强转为方法信息MethodSignature methodSignature = (MethodSignature) signature;// 参数名称String[] parameterNames = methodSignature.getParameterNames();//执行的对象Object target = point.getTarget();log.debug("处理方法:{}.{}", target.getClass().getName() , methodSignature.getMethod().getName());Object[] parameterValues = point.getArgs();//查看入参log.debug("参数名:{},参数值:{}", JSONObject.toJSONString(parameterNames), JSONObject.toJSONString(parameterValues));Class returnType = methodSignature.getReturnType();// 返回类型是否布尔类型boolean booleanType = boolean.class.equals(returnType) || Boolean.class.equals(returnType);try {if (Objects.nonNull(JdHotKeyStore.get("redis_connection_failed"))) {// 值不为空表示redis连接失败,这里就不再继续请求redis了,直接返回false或者nulllog.error("获取缓存失败,redis连接失败,直接返回 false 或者 null");if (booleanType) {return false;}return null;}return point.proceed();} catch (Throwable throwable) {log.error("执行方法:{}失败,异常信息:{}", methodSignature.getMethod().getName(), throwable);/** redis连接失败,不抛异常,返回空值,* 继续用数据库提供服务,避免整个服务异常* 一分钟之内或者30秒之内出现了几次redis连接失败* 此时可以设置一个key,告诉hotkey,redis连接不上了,指定1分钟左右的过期时间* 下次获取缓存的时候,先根据hotkey来判断,redis是否异常了* hotkey在1分钟之后,会删除key,下次再有redis请求过来,重新去看redis能否连接* 这样可以简单的实现redis挂掉之后直接走数据库的降级*/if (JdHotKeyStore.isHotKey("redis_connection_failed")) {JdHotKeyStore.smartSet("redis_connection_failed", "{}");}// 让后续操作继续,判断返回类型是Boolean则返回false,其他类型返回nulllog.error("缓存操作失败,直接返回 false 或者 null");if (booleanType) {return false;}return null;}
}

如果 Redis 故障的话,通过 key=redis_connection_failed 就已经记录下来了,那么降级操作的话,就从本地缓存 caffeine 中取数据,如果取不到,再查询数据库,降级流程如下:

在这里插入图片描述

这里如果本地缓存中没有数据的话,需要查询数据库之后,再将数据库中的数据放入本地缓存中,这里还是需要加锁的,那么我们就加本地锁即可 ReentrantLock

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

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

相关文章

教程篇(7.2) 01. 介绍和初始访问 ❀ FortiAnalyzer分析师 ❀ Fortinet 网络安全专家 NSE5

在本课中,你将了解FortiAnalyzer的关键功能和概念,以及如何最初访问FortiAnalyzer。 FortiAnalyzer将日志记录、分析和报告集成到一个系统中,因此你可以快速识别和响应。 在本课中,你将探索上图显示的主题。 通过展示FortiAnalyze…

2分钟带你了解什么是Vsync

了解Vsync,首先我们需要认知如下问题 什么是GPUCPU在渲染之前起到什么作用什么是帧,帧率什么是画面撕裂 什么是GPU GPU为图形处理器,又称显示核心、视觉处理器、显示芯片。 是一种专门在个人电脑、工作站、游戏机和一些移动设备(如平板电脑…

Nature Communications 高时空分辨率的机器人传感系统及其在纹理识别方面的应用

前沿速览: 现有的触觉传感器虽然可以精确的检测压力、剪切力和应变等物理刺激,但还难以像人类手指一样通过滑动触摸,同时获取静态压力与高频振动来实现精确的纹理识别。为了解决这一问题,来自南方科技大学的郭传飞团队提出了衔接…

Tomcat主配置文件(server.xml)详解

前言 Tomcat主配置文件(server.xml)是Tomcat服务器的主要配置文件,文件位置在conf目录下,它包含了Tomcat的全局配置信息,包括监听端口、虚拟主机、安全配置、连接器等。 目录 1 server.xml组件类别 2 组件介绍 3 se…

浅谈基于泛在电力物联网的综合能源管控平台设计及硬件选型

贾丽丽 安科瑞电气股份有限公司 上海嘉定 201801 摘要:城区内一般都具有错综复杂的能源系统,且大部分能耗都集中于城区的各企、事业单位中。基于泛在电力物联网的综合能源管控平台将城区内从能源产生到能源消耗的整体流动情况采用大屏清晰展示&#xff…

搜索推荐技术-爱奇艺搜索引擎技术

一、爱奇艺的搜索引擎框架示意图 即通过召回系统,即基于文本匹配的matching system,得到大量视频资源的候选集,经过粗排和精排,最后返回给用户。重点在于召回模块和排序模块。 二、召回模块 召回模块比较重要的是基础相关性&am…

使用Notepad++编辑器,安装compare比较差异插件

概述 是一款非常有特色的编辑器,Notepad是开源软件,Notepad中文版可以免费使用。 操作步骤: 1、在工具栏 ->“插件”选项。 2、勾选Compare选项,点击右上角“安装”即可。 3、 确认安装插件 4、下载插件 5、插件已安装 6、打…

Linux本地部署1Panel服务器运维管理面板并实现公网访问

文章目录 前言1. Linux 安装1Panel2. 安装cpolar内网穿透3. 配置1Panel公网访问地址4. 公网远程访问1Panel管理界面5. 固定1Panel公网地址 前言 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器,包括主机监控、…

阿里云 ACR 制品中心 AI/大数据镜像专场上新推荐榜

今天,AI 领域的快速发展不仅需要算法的突破,也需要工程的创新。随着容器技术和服务在企业的应用程度不断加深,企业对于容器的使用也越来越多地从在线业务逐渐向 AI、大数据类型的工作负载发展。同时,开发人员在考虑如何通过云原生…

分布式搜索引擎03

1.数据聚合 聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如: 什么品牌的手机最受欢迎? 这些手机的平均价格、最高价格、最低价格? 这些手机每月的销售情况如何? 实现这些统计功能的比数据库的sql要方便的多,而且查询速度非常快,可以实现近…

在jupyter notebook中修改其他文件的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

No Chromedriver found that can automate Chrome ‘x.x.xxxx‘的解决办法

一、前置说明 在使用Appium对Android设备自动化测试时,切换WebView时抛出异常: selenium.common.exceptions.WebDriverException: Message: An unknown server-side error occurred while processing the command. Original error: No Chromedriver foun…