15

我已经在我的 Spring 应用程序中启用了缓存,我使用 Redis 来达到这个目的。但是,每当发生连接故障时,应用程序就会停止工作,而我认为它最好跳过缓存并继续正常执行流程。

那么,有没有人知道如何在 Spring 中优雅地做到这一点?

这是我得到的例外。

Caused by: org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
4

4 回答 4

7

从 Spring Framework 4.1 开始,CacheErrorHandler您可以实现一个来处理此类异常。有关详细信息,请参阅javadoc

您可以通过@Configuration扩展您的类来注册它CachingConfigurerSupport(请参阅 参考资料errorHandler())。

于 2015-01-04T16:19:08.820 回答
4

Stephane Nicoll 建议的 CacheErrorHandler 很有用。但是当它无法创建与 redis 的连接时,它并没有帮助。

@Cacheable 之类的缓存方法仍然失败,并出现 RedisConnectionFailureException。

于 2017-01-22T07:12:57.797 回答
1

您可以CacheErrorHandler按照 Stephane Nicoll 的建议使用。但是你应该确保 RedisCacheManager transactionAwarefalse你的 Redis 缓存配置中进行(以确保在执行缓存部分时尽早提交事务并且错误被捕获CacheErrorHandler并且不要等到跳过CacheErrorHandler部分的执行结束)。transactionAware要设置的函数false如下所示:

    @Bean
    public RedisCacheManager redisCacheManager(LettuceConnectionFactory lettuceConnectionFactory) {
        JdkSerializationRedisSerializer redisSerializer = new JdkSerializationRedisSerializer(getClass().getClassLoader());

        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofHours(redisDataTTL))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer));

        redisCacheConfiguration.usePrefix();

        RedisCacheManager redisCacheManager = RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(lettuceConnectionFactory)
                .cacheDefaults(redisCacheConfiguration)
                .build();

        redisCacheManager.setTransactionAware(false);
        return redisCacheManager;
    }
于 2021-02-02T12:47:43.130 回答
0

与 Stephane 提到的类似,我通过使用 try catch 块中的错误来完成。添加一个回退机制,如果 Redis 未启动或数据不存在,则我从 DB 中获取数据。(稍后如果我找到一个,然后我在 Redis 中添加相同的数据,如果它是为了保持一致性。 )

于 2016-08-17T06:19:57.493 回答