大家好,我是烤鸭:

标题起的有点大了,说是自研,其实就是个封装,不过倒是解决了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

自研redis sdk支持自动dns切换(附源码)相关推荐

  1. Spring boot基于redis实现附近的人(附源码下载)

    此文章是针对去年写的Java基于Redis实现"附近的人 进行业务优化! 核心源码 public class NearbyPO {@NotNull(message = "id值不能 ...

  2. 程序员用C++代码实现高清播放器,支持DVD视频,附源码

    VC++ 源码编写的一款高清播放器smplayer,支持DVD视频,当然也会支持VCD的格式,另外还可播放MP3等音频,这款播放器是从国外网站下载的,软件界面语言是英文,部分功能依赖Qt4库,该软件源 ...

  3. Python基于民航业知识图谱的自动问答系统(附源码)

    一.开发环境 Windows 10 x64 Python 3.7 Neo4j community 3.5.20 二.项目运行 1.确保安装所需依赖 pip install -r requirement ...

  4. android广告SDK原理详解(附源码)

    广大的开发者吃糠咽菜开发了一两款APP,获取了一些流量后自然就会想到流量变现,一般情况下大家会选择到百度联盟或者Google Admob这些广告服务提供商注册开发者账号,在自己的APP里面加上几行广告 ...

  5. 30行Python代码实现蚂蚁森林自动偷能量(附源码)

    虽然我支付宝加了好多好友,平时有很多能量可以偷,但由于太懒,至今一棵树都没种成,所以心心念念把偷能量这事自动化.之前通过用代码模拟手机点按的方式,实现了 朋友圈自动点赞,但当时蚂蚁森林的操作流程要比朋 ...

  6. 【MapBox】5种地图(底图)样式自由切换附源码

    文章目录 一.不同地图显示样式 1. 卫星 2. 浅色 3. 深色 4. 街道 5. 户外 二.完整源码 一.不同地图显示样式 MapBox提供了5种不同形式的地图显示样式: 1. 卫星 2. 浅色

  7. 微信小程序实现天气预报功能(支持自动定位)(附源码)

    目录 前言 效果图 天气API获取 微信小程序后台域名配置 页面代码 注意问题(必看) 源码 留言 前言 由于和风天气API的更新,之前写的那篇文章 可能会出现版本不兼容的 情况.所以 更新了 这个 ...

  8. 免费开源的高精度OCR文本提取,支持 100 多种语言、自动文本定位和脚本检测,几行代码即可实现离线使用(附源码)

    免费开源的高精度OCR文本提取,支持 100 多种语言.自动文本定位和脚本检测,几行代码即可实现离线使用(附源码). 要从图像.照片中提取文本吗?是否刚刚拍了讲义的照片并想将其转换为文本?那么您将需要 ...

  9. php如何做7天后自动售货店,PHP自动售货发卡网源码集成多种支付接口

    PHP自动售货发卡网源码 集成多种支付接口 支付接口已集成 支付宝当面付 支付宝PC支付 支付宝手机支付 payjs微信扫码. Paysapi(支付宝/微信). 码支付(QQ/支付宝/微信) 微信企业 ...

最新文章

  1. Python培训分享:PyQT是什么?PyQt4和PyQt5的区别是什么?
  2. poj 1781 In Danger
  3. LeetCode: Maximum Product Subarray
  4. ueditor 添加按钮不显示_不可思议按键精灵的按钮选择框居然这么简单
  5. 玛酷机器人课程视频_建阳玛酷机器人丨2019WRO机器人比赛凯旋而归!
  6. 字符串的各种格式转换,C#中自动为数字千位数,百万位数添加逗号
  7. mysql 长时间连接没操作,断开连接
  8. c#参数修饰符-ref
  9. 拓端tecdat|Python中的多项式回归拟合非线性关系实例
  10. linq 根据指定条件返回集合中不重复的元素
  11. tukey 窗口_语音信号滤波去噪——使用TUKEYWIN窗设计的FIR滤波器.
  12. 独木桥的c语言程序,独木桥
  13. 如何批量生成ISBN条码
  14. MP3stego下载(强大的隐写工具)
  15. 助教日志_【沈阳航空航天大学软件工程 1,2 班】团队作业排行
  16. 16组Sony索尼系列相机Slog2和Slog3常用Vlog电影LTUS调色预设 Slog2 Slog3视频灰片调色预设
  17. html简单的任务管理系统实现,用Javascript实现Windows任务管理器的代码
  18. htc+m8+wp+android,WP8.1版HTC One M8官方配置全揭晓
  19. 自动驾驶目标识别-----毫米波雷达学习笔记(1)
  20. 基于plcsimadvanced实现1500PLC仿真 OUC通讯

热门文章

  1. 前端学习(3132):react-hello-react之受控组件
  2. [css] 有用过Flex吗?简要说下你对它的了解
  3. 前端学习(2813):小程序开发前的环境搭建
  4. 工作45:注意公用方法 别混入
  5. 前端学习(2184):tabber--封装成独立的组件
  6. 前端学习(1181):vue语法模板
  7. 前端学习(224):iconfont矢量库
  8. 第一百一十九期:支付宝历年双十一背后的技术揭秘
  9. 第十七期:2019人工智能统计数字和一些重要事实
  10. 实例56:python