自研redis sdk支持自动dns切换(附源码)

大家好,我是烤鸭:

   标题起的有点大了,说是自研,其实就是个封装,不过倒是解决了dns切换的问题(虽然不太优雅)。

背景

之前做活动的时候,用域名链接的redis,当时做了主备集群,在主集群宕机的时候,可以自动链接到备用集群,发现不好使。具体原因可以看下我写的这篇。

https://blog.csdn.net/Angry_Mills/article/details/119218854

还有人留言说已经实现了。

在这里插入图片描述

不过也没找到代码,就着这个思路自己开发一个吧。

思路

就跟上面这个评论一样,既然没办法从池化的地方入手,就重建client吧,不过重建的过程一定会有一些损失。

  • 初始化redis的bean
  • aop切面监听异常
  • 达到指定条件,销毁并重建bean(指定异常出现多少次之类的)

开发测试

想测试的话,后边可以直接下载源码。

需要redis集群,搭建可以参考

https://blog.csdn.net/Angry_Mills/article/details/123139680

核心代码在切面,我这里使用aop实现的,这里用的重建逻辑也是比较简单的,判断超时10次,就会重建,为了方便复现,超时时间设置的5ms。

线上中需要考虑实际场景,比如超时时间的设置,以及超时次数,或者可以设置时间窗口(1分钟内超时100次之类的),再进行重建。

@Around("redisApi()")public Object doProfiling(ProceedingJoinPoint point) throws Throwable {log.info("进入aop===================="+errorCount);long initTime = System.currentTimeMillis();long sTime = initTime;String met = null; // 拦截方法名称Object args = null; // 拦截的方法参数Object ret = null; // 拦截方法返回值String clusterName = "";if (point.getTarget() instanceof MagRedisServiceImpl) {clusterName = ((MagRedisServiceImpl) point.getTarget()).getClusterName();}try {if (point.getArgs().length > 0) {//只取第一个参数args = point.getArgs()[0];}MethodSignature methodSignature = (MethodSignature) point.getSignature();met = methodSignature.getName();sTime = System.currentTimeMillis();//单独获取系统时间。减少对系统的交互。毫秒值。ret = point.proceed();} catch (Throwable t) {log.error(t.getMessage(), t);if(t instanceof RedisSystemException || t instanceof QueryTimeoutException && t.getCause() instanceof RedisCommandTimeoutException){log.info("redis 连不上了=========="+errorCount);errorCount ++;if (errorCount == 10) {rebuildRedisTemplate();errorCount = 1;}}throw t;//异常向上抛出} finally {}return ret;}

redis 链接正常的时候,多次访问

在这里插入图片描述

在这里插入图片描述

宕机redis后,第10次访问触发重建逻辑

在这里插入图片描述

切换本地dns后,访问正常

在这里插入图片描述

在这里插入图片描述

最后说一下

demo和线上使用还是有很大区别的,一般redis超时设置可能在100ms以内,如果设置的次数过多,可能超时的时间很长。

还是设置时间窗口+异常类型+超时次数,比较合理。

像RedisCluster is Down 这种的,可能要优先处理。

不过很少有主备集群同时存在,除非做活动或者比较重要的业务,中间件出问题的概率比服务要低很多(不过出了就是大问题)。

源码下载

https://gitee.com/fireduck_admin/redis-maggie-dns

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

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

相关文章

《黑客与画家》读书笔记

《黑客与画家》读书笔记 大家好,我是烤鸭: 《黑客与画家》,读书笔记。这次想修改以前那种章节式的笔记,一个是这本书是比较主观的,一个是想换个风格。 作者 保罗格雷厄姆(Paul Graham)&a…

使用Canal实现redis和mysql的同步

使用Canal实现redis和mysql的同步 ### canal 工作思路 Canal 会将自己伪装成 MySQL 从节点(Slave),并从主节点(Master)获取 Binlog,解析和贮存后供下游消费端使用。Canal 包含两个组成部分:服务…

上线到凌晨4点半 pagehelper的bug?

大家好,我是烤鸭: 上上周末上线到凌晨4点半,哭了,没想到问题竟然如此简单。最近又懒惰了,写了开头就一直放着了,今天终于补上。 ​ 问题日志 Error querying database. Cause: com.github.pagehelper.P…

sql 查询结果自定义排序

sqlserver 使用case when then 语句来实现 select name from fruit order by case namewhen Strawberry then 1when Banana then 2when Apple then 3else 4 end oracle 使用decode实现 select * from table_example order by decode(class,C,1,A,2,D,3,B,4) 转载于:https://www…

skywalking 引起 spring-cloud-gateway 的内存溢出 skywalking的bug

大家好,我是烤鸭: 又是个线上问题记录,这次坑惨了,开源软件也不是万能的,还是要做好压测和灰度。 问题 上游反馈大量超时,不止某一个服务,查看服务没有问题,猜测是网络或者环境问题…

长连接检测 监控的一点思考 java实现

大家好,我是烤鸭: 怎么监控长链接服务器的稳定,除了探活服务之外,怎么保证长链接的收发正常,这篇文章考虑下这个。 问题来源 运营反馈部分直播间无法收到弹幕、点赞消息,第一时间进行复现,发现…

rabbitmq 启动失败 dump日志分析

大家好,我是烤鸭: rabiitmq 突然宕机,并且无法启动。同事反馈测试环境 rabbitmq 有一个节点突然掉了,并且无法启动。 现象 集群有一个节点宕机。 去对应的机器上执行启动命令 ./rabbitmq-server -detached发现进程不在&#x…

项目实战-药品采购系统-day01

目标:项目背景,需求,环境的搭建 难点:环境的搭建 1.学习方法: 一个项目:架构师、高级程序员、一般程序员 难度很大但是普通的程序员做很简单 所以自己对自己的定位要准确(一般程序员&#xff09…

《深入理解Java虚拟机》-读书笔记(第一、第二部分)

大家好,我是烤鸭: 《深入理解Java虚拟机》-读书笔记(第一、第二部分)。 第一部分:走进Java 第1章 走进Java 1.1 概述 摆脱了硬件平台的束缚,实现了“一次编写,到处运行”的理想;…

BZOJ1189: [HNOI2007]紧急疏散evacuate(二分答案,最大流)

Description 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域。每个格子如果是.,那么表示这是一块空地;如果是X,那么表示这是一面墙,如果是D,那么表示这是一扇门,…

[vue]vue渲染模板时怎么保留模板中的HTML注释呢?

[vue]vue渲染模板时怎么保留模板中的HTML注释呢&#xff1f; <template comments>... </template>个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

redis设置为null问题

查看源码后发现&#xff0c;redis没有删除方法&#xff0c;本想给他设置为null,但是redis报错&#xff0c;所有仔细想了一下&#xff0c;发现redis提供了一个时间限制方法&#xff0c;所有可以让redis的时间限制为1s&#xff0c;就想当于删除redis中的这个K。 转载于:https://w…

nacos 返回 403 unknown user 太他么坑了 源码解析

大家好&#xff0c;我是烤鸭&#xff1a; nacos 真的是有点意思&#xff0c;有时候哪怕某个jar包版本冲突了都可能导致莫名其妙的错误&#xff0c;源码走一波吧。 当前版本 <dependencies><dependency><groupId>org.springframework.boot</groupId>&…

[vue] Vue.observable你有了解过吗?说说看

[vue] Vue.observable你有了解过吗&#xff1f;说说看 让一个对象可响应。Vue 内部会用它来处理 data 函数返回的对象。返回的对象可以直接用于渲染函数和计算属性内&#xff0c;并且会在发生改变时触发相应的更新&#xff1b;也可以作为最小化的跨组件状态存储器。个人简介 …