使用@Cacheable注解时,Redis连不上,直接调用方法内部的解决方案

最近redis 域名一致解析错误,导致业务多了很多异常。那么如何在这种情况下直接访问数据库,而不是报错呢

1. 解决方案

其实很简单,在配置 redis 时,只需要多一项配置,继承 CachingConfigurerSupport ,然后重写其 errorHandler 方法即可,代码如下:

/**
     * 如果cache出错, 我们会记录在日志里,方便排查,比如反序列化异常
     */
    @Override
    public CacheErrorHandler errorHandler() {
        return new LoggingCacheErrorHandler();
    }

static class LoggingCacheErrorHandler extends SimpleCacheErrorHandler {

        private final Logger logger = LoggerFactory.getLogger(this.getClass());

        @Override
        public void handleCacheGetError(RuntimeException exception, Cache cache, Object key) {
            logger.error(String.format("cacheName:%s,cacheKey:%s", cache == null ? "unknown" : cache.getName(), key), exception);
//            super.handleCacheGetError(exception, cache, key);  不抛出错误,记录日志
        }

        @Override
        public void handleCachePutError(RuntimeException exception, Cache cache, Object key, Object value) {
            logger.error(String.format("cacheName:%s,cacheKey:%s", cache == null ? "unknown" : cache.getName(), key), exception);
//            super.handleCachePutError(exception, cache, key, value);不抛出错误,记录日志
        }

        @Override
        public void handleCacheEvictError(RuntimeException exception, Cache cache, Object key) {
            logger.error(String.format("cacheName:%s,cacheKey:%s", cache == null ? "unknown" : cache.getName(), key), exception);
//            super.handleCacheEvictError(exception, cache, key);不抛出错误,记录日志
        }

        @Override
        public void handleCacheClearError(RuntimeException exception, Cache cache) {
            logger.error(String.format("cacheName:%s", cache == null ? "unknown" : cache.getName()), exception);
//            super.handleCacheClearError(exception, cache);不抛出错误,记录日志
        }
    }

只要处理时不抛出错误,就会继续走下去,然后调用原方法体内。

注意:错误仅仅打日志会让我们忽略,而异常我们是可以看得到的。所以,这种错误还是需要被感知,也就是需要给开发者发邮件通知,然后针对去处理

2. 参考

https://blog.csdn.net/l1028386804/article/details/82597154

原文地址:https://www.cnblogs.com/paxing/p/redis.html