首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当Redis缓存不可用时如何防止所有RedisConnectionFailureException

当Redis缓存不可用时如何防止所有RedisConnectionFailureException
EN

Stack Overflow用户
提问于 2022-07-08 23:08:17
回答 1查看 203关注 0票数 1

我的服务mocksConnector中有这个可缓存的方法。

代码语言:javascript
运行
复制
@Cacheable(value = GET_PRODUCT_CACHE)
public ProductDetailMock getProduct(final String productId) {
    ...
}

如果我使用Redis缓存运行这段代码,那么一切都很好:

代码语言:javascript
运行
复制
mocksConnector.getProduct(productId)

但是如果我阻止了Redis,那么就会抛出RedisConnectionFailureException (这很有道理)

假设数据是关键的,方法getProduct应该总是返回一些内容。

有什么方法可以将缓存配置为自动运行方法getProduct 的主体而不是简单地失败??

请注意,我正在搜索一般配置(或者方法级别的配置,可能?)。我知道我可以手动配置缓存并使用try/catch块,如下所示:

代码语言:javascript
运行
复制
try {
    redisClient.get(key)
} catch (Exception e) {
    // Do something else...
}

但我不想那么做。

EN

回答 1

Stack Overflow用户

发布于 2022-07-08 23:54:48

我通过使用不抛出任何异常的CustomCacheErrorHandler重写缓存错误处理程序来解决这个问题。参见How to handle redis exceptions by using Spring Cache?中威尔士语的响应

首先,创建一个类

代码语言:javascript
运行
复制
import org.springframework.cache.Cache;
import org.springframework.cache.interceptor.CacheErrorHandler;

public class CustomCacheErrorHandler implements CacheErrorHandler {
    @Override
    public void handleCacheGetError(RuntimeException exception, Cache cache, Object key) {
        // Do nothing or log error
    }

    @Override
    public void handleCachePutError(RuntimeException exception, Cache cache, Object key, Object value) {
        // Do nothing or log error
    }

    @Override
    public void handleCacheEvictError(RuntimeException exception, Cache cache, Object key) {
        // Do nothing or log error
    }

    @Override
    public void handleCacheClearError(RuntimeException exception, Cache cache) {
        // Do nothing or log error
    }
}

然后重写配置中的CacheErrorHandler

代码语言:javascript
运行
复制
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.CacheErrorHandler;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableCaching
public class CacheConfig extends CachingConfigurerSupport {
    ...

    @Override
    public CacheErrorHandler errorHandler() {
        return new CustomCacheErrorHandler();
    }
}

现在,即使缓存不可用,我们也可以在Redis缓存中使用服务。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72917783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档