我有同样的问题。我正在通过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; } }}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)