自研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
自研redis sdk支持自动dns切换(附源码)相关推荐
- Spring boot基于redis实现附近的人(附源码下载)
此文章是针对去年写的Java基于Redis实现"附近的人 进行业务优化! 核心源码 public class NearbyPO {@NotNull(message = "id值不能 ...
- 程序员用C++代码实现高清播放器,支持DVD视频,附源码
VC++ 源码编写的一款高清播放器smplayer,支持DVD视频,当然也会支持VCD的格式,另外还可播放MP3等音频,这款播放器是从国外网站下载的,软件界面语言是英文,部分功能依赖Qt4库,该软件源 ...
- Python基于民航业知识图谱的自动问答系统(附源码)
一.开发环境 Windows 10 x64 Python 3.7 Neo4j community 3.5.20 二.项目运行 1.确保安装所需依赖 pip install -r requirement ...
- android广告SDK原理详解(附源码)
广大的开发者吃糠咽菜开发了一两款APP,获取了一些流量后自然就会想到流量变现,一般情况下大家会选择到百度联盟或者Google Admob这些广告服务提供商注册开发者账号,在自己的APP里面加上几行广告 ...
- 30行Python代码实现蚂蚁森林自动偷能量(附源码)
虽然我支付宝加了好多好友,平时有很多能量可以偷,但由于太懒,至今一棵树都没种成,所以心心念念把偷能量这事自动化.之前通过用代码模拟手机点按的方式,实现了 朋友圈自动点赞,但当时蚂蚁森林的操作流程要比朋 ...
- 【MapBox】5种地图(底图)样式自由切换附源码
文章目录 一.不同地图显示样式 1. 卫星 2. 浅色 3. 深色 4. 街道 5. 户外 二.完整源码 一.不同地图显示样式 MapBox提供了5种不同形式的地图显示样式: 1. 卫星 2. 浅色
- 微信小程序实现天气预报功能(支持自动定位)(附源码)
目录 前言 效果图 天气API获取 微信小程序后台域名配置 页面代码 注意问题(必看) 源码 留言 前言 由于和风天气API的更新,之前写的那篇文章 可能会出现版本不兼容的 情况.所以 更新了 这个 ...
- 免费开源的高精度OCR文本提取,支持 100 多种语言、自动文本定位和脚本检测,几行代码即可实现离线使用(附源码)
免费开源的高精度OCR文本提取,支持 100 多种语言.自动文本定位和脚本检测,几行代码即可实现离线使用(附源码). 要从图像.照片中提取文本吗?是否刚刚拍了讲义的照片并想将其转换为文本?那么您将需要 ...
- php如何做7天后自动售货店,PHP自动售货发卡网源码集成多种支付接口
PHP自动售货发卡网源码 集成多种支付接口 支付接口已集成 支付宝当面付 支付宝PC支付 支付宝手机支付 payjs微信扫码. Paysapi(支付宝/微信). 码支付(QQ/支付宝/微信) 微信企业 ...
最新文章
- Python培训分享:PyQT是什么?PyQt4和PyQt5的区别是什么?
- poj 1781 In Danger
- LeetCode: Maximum Product Subarray
- ueditor 添加按钮不显示_不可思议按键精灵的按钮选择框居然这么简单
- 玛酷机器人课程视频_建阳玛酷机器人丨2019WRO机器人比赛凯旋而归!
- 字符串的各种格式转换,C#中自动为数字千位数,百万位数添加逗号
- mysql 长时间连接没操作,断开连接
- c#参数修饰符-ref
- 拓端tecdat|Python中的多项式回归拟合非线性关系实例
- linq 根据指定条件返回集合中不重复的元素
- tukey 窗口_语音信号滤波去噪——使用TUKEYWIN窗设计的FIR滤波器.
- 独木桥的c语言程序,独木桥
- 如何批量生成ISBN条码
- MP3stego下载(强大的隐写工具)
- 助教日志_【沈阳航空航天大学软件工程 1,2 班】团队作业排行
- 16组Sony索尼系列相机Slog2和Slog3常用Vlog电影LTUS调色预设 Slog2 Slog3视频灰片调色预设
- html简单的任务管理系统实现,用Javascript实现Windows任务管理器的代码
- htc+m8+wp+android,WP8.1版HTC One M8官方配置全揭晓
- 自动驾驶目标识别-----毫米波雷达学习笔记(1)
- 基于plcsimadvanced实现1500PLC仿真 OUC通讯