使用Redis的Spring缓存 - 如果连接失败到Redis,如何优雅地处理甚至跳过缓存

时间:2014-12-30 15:09:54

标签: spring-cache spring-data-redis

我在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

5 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:1)

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

像@Cacheable静态的缓存方法因RedisConnectionFailureException而失败。

答案 2 :(得分:1)

您可以按照 Stephane Nicoll 的建议使用 CacheErrorHandler。但你应该确保 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;
    }

答案 3 :(得分:0)

与Stephane提到的类似,我通过在try catch块中消耗错误来完成。添加一个后退机制,如果Redis没有启动或可能是数据不存在,那么我从数据库中获取数据。(如果我找到一个,那么我在Redis中添加相同的数据,如果它是为了保持一致性。 )

答案 4 :(得分:0)

我一直在寻找相同的东西,使用Spring启动,这个here为我工作。