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

标签 java spring caching redis

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

@Cacheable(value = GET_PRODUCT_CACHE)
public ProductDetailMock getProduct(final String productId) {
    ...
}

如果我使用 Redis 缓存运行此代码,则一切正常:

mocksConnector.getProduct(productId)

但是如果我停止 Redis,则会抛出 RedisConnectionFailureException(有道理)

enter image description here

假设数据很关键,并且方法 getProduct 应该始终返回一些内容。

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

请注意,我正在搜索通用配置(或者方法级别的配置,也许?)。我知道我可以手动配置缓存并使用 try/catch block ,例如:

try {
    redisClient.get(key)
} catch (Exception e) {
    // Do something else...
}

但我不想这样做。

最佳答案

我通过使用不抛出任何异常的 CustomCacheErrorHandler 覆盖缓存错误处理程序来解决这个问题。请参阅 How to handle redis exceptions by using Spring Cache?威尔士的回复

首先,创建一个类

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

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 缓存的服务。

关于java - 当Redis缓存不可用时如何防止所有RedisConnectionFailureException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72917783/

相关文章:

C++:仿函数的缓存友好性

java - 获取 ListView 中所选项目的 id

java - 尝试从另一个类的随机数中打印出数组

java - Log4j2 基于属性禁用附加程序

java - .jar 错误 - 无法找到或加载主类

java - 我应该使用哪个 Java 模板系统来生成电子邮件?

java - 如何将参数从 cordova HTTP 传递到 Spring Controller

spring - 如何配置Spring Boot和Spring Security同时支持表单登录和Google OAuth2登录

wordpress - 是否有一个易于安装的自托管 wordpress 解决方案(可能有多个站点)

ruby-on-rails - Rails 是否有使缓存过期的标签?