discuz怎么做网站,望牛墩东莞网站建设,用.net做网站好 还是用php,jsp网站开发的环境配置过程大家好#xff0c;我是烤鸭#xff1a; 标题起的有点大了#xff0c;说是自研#xff0c;其实就是个封装#xff0c;不过倒是解决了dns切换的问题#xff08;虽然不太优雅#xff09;。
背景
之前做活动的时候#xff0c;用域名链接的redis#xff0c;当时做了主备集…大家好我是烤鸭 标题起的有点大了说是自研其实就是个封装不过倒是解决了dns切换的问题虽然不太优雅。
背景
之前做活动的时候用域名链接的redis当时做了主备集群在主集群宕机的时候可以自动链接到备用集群发现不好使。具体原因可以看下我写的这篇。
https://blog.csdn.net/Angry_Mills/article/details/119218854
还有人留言说已经实现了。 不过也没找到代码就着这个思路自己开发一个吧。
思路
就跟上面这个评论一样既然没办法从池化的地方入手就重建client吧不过重建的过程一定会有一些损失。
初始化redis的beanaop切面监听异常达到指定条件销毁并重建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(进入aoperrorCount);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