Spring Redis错误处理

Spring Redis错误处理,第1张

Spring Redis错误处理

我有同样的问题。我正在通过Spring
Caching注释将Redis用作缓存存储区,从而针对数据库开发一些数据服务。如果Redis服务器不可用,我希望这些服务能够像未缓存一样继续运行,而不是抛出异常。

最初,我尝试了一个自定义的CacheErrorHandler,这是Spring提供的一种机制。它并不是很有效,因为它只处理RuntimeExceptions,并且仍然让java.net.ConnectException之类的东西炸毁。

最后,我所做的是扩展RedisTemplate,覆盖了一些execute()方法,以便它们记录警告而不是传播异常。似乎有点hack,我可能重写了太少的execute()方法或太多了,但是在我所有的测试用例中,它都像一个魅力。

但是,此方法有一个重要的 *** 作方面。如果Redis服务器不可用,则必须刷新它(清除条目),然后才能再次使用它。否则,由于同时发生更新,您可能会开始检索数据不正确的缓存条目。

以下是来源。随意使用它。希望对您有所帮助。

import java.util.List;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.data.redis.core.RedisCallback;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.SessionCallback;import org.springframework.data.redis.core.script.Redisscript;import org.springframework.data.redis.serializer.RedisSerializer;public class LoggingRedisTemplate<K, V> extends RedisTemplate<K, V> {    private static final Logger logger = LoggerFactory.getLogger(LoggingRedisTemplate.class);    @Override    public <T> T execute(final RedisCallback<T> action, final boolean exposeConnection, final boolean pipeline) {        try { return super.execute(action, exposeConnection, pipeline);        }        catch(final Throwable t) { logger.warn("Error executing cache operation: {}", t.getMessage()); return null;        }    }    @Override    public <T> T execute(final Redisscript<T> script, final List<K> keys, final Object... args) {        try { return super.execute(script, keys, args);        }        catch(final Throwable t) { logger.warn("Error executing cache operation: {}", t.getMessage()); return null;        }    }    @Override    public <T> T execute(final Redisscript<T> script, final RedisSerializer<?> argsSerializer, final RedisSerializer<T> resultSerializer, final List<K> keys, final Object... args) {        try { return super.execute(script, argsSerializer, resultSerializer, keys, args);        }        catch(final Throwable t) { logger.warn("Error executing cache operation: {}", t.getMessage()); return null;        }    }    @Override    public <T> T execute(final SessionCallback<T> session) {        try { return super.execute(session);        }        catch(final Throwable t) { logger.warn("Error executing cache operation: {}", t.getMessage()); return null;        }    }}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5010170.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-14
下一篇 2022-11-15

发表评论

登录后才能评论

评论列表(0条)

保存