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

发布于 2022-09-05 07:41:38 字数 1519 浏览 19 评论 0

采用的是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. 实际项目中自己实现缓存管理方案?还是其他的好的解决方案?

谢谢!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

凯凯我们等你回来 2022-09-12 07:41:38

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

沒落の蓅哖 2022-09-12 07:41:38

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

坐在坟头思考人生 2022-09-12 07:41:38

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

等数载,海棠开 2022-09-12 07:41:38

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

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

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文