Spring集成Redis做缓存,Redis宕机时Spring处理的问题

采用的是Spring自带的缓存管理,使用Redis做缓存,在Spring中配置如下

@Configuration
@EnableCaching
public class CachingConfig {

    @Bean
    public CacheManager cacheManager(RedisTemplate redisTemplate) {
        return new RedisCacheManager(redisTemplate);
    }

    @Bean
    public JedisConnectionFactory jedisConnectionFactory() {
        JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
        jedisConnectionFactory.afterPropertiesSet();

        return jedisConnectionFactory;
    }

    @Bean
    public RedisTemplate<String, User> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String,User> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        redisTemplate.afterPropertiesSet();

        return redisTemplate;
    }
}

在DAO实现中使用缓存的代码如下

    @Cacheable(value = "userCache", key = "'id_'+#id")
    public User selectUser(String id) {
        return getMapper().selectUser(id);
    }

这里使用的是单个Redis,在Redis正常工作时没有问题,但是如果这时候Redis挂掉了,访问时就会抛出获取与Redis之间connection异常(这也正常,Redis都挂掉了)。
跟了一下代码,发现此时Spring的处理逻辑是这样的:

配置有缓存-->先去Redis找-->连接不上-->抛出错误

但是我理解和问题的是:

  1. 缓存如果挂掉了,请求应该就直接去数据库取,否则缓存一挂岂不是整个系统都不可用了?

  2. Spring中是否有什么配置使缓存能否做到可插拔?

  3. 实际中会直接使用这种方案吗?还是使用Redis集群方案(抱歉这个还没研究)?

  4. 实际项目中自己实现缓存管理方案?还是其他的好的解决方案?

谢谢!

阅读 7.6k
4 个回答

1、这个问题你要这样想,Redis 有挂掉的可能,数据库也存在这个可能,数据库挂了系统不是也不可用了么?
2、这个貌似没有
3、通常都会对 Redis 集群,其实访问量、数据库不大的话不集群的话问题也不大,服务器中 Redis 也不是那么容易挂的,而且可以设置监控系统监控 Redis 、数据库等运行情况,有异常则报警,报警后及时处理即可。
4、不太清楚你说的自己实现缓存管理方案具体是指什么

可以使用reids哨兵,挂掉之后自动切换

Spring自带的缓存管理没有用过,但一般的缓存逻辑都是先到redis中取,取的到数据就return。取不到按正常流程,并将取到的数据加入redis进行缓存。

1、可以把单节点做成集群,用哨兵监听每个节点,这样redis全挂的机率几乎为0。再说数据库也要做主从,万一挂了呢。。。

2、二级缓存,redis一级缓存取不到数据,就取二级ehcache(适合Java)

3、一般都是集群。(单节点很少用,读写没分离,有很多问题)

4、一般redis集群就够了,是否采用二级缓存看项目和需求

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题