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找-->连接不上-->抛出错误
但是我理解和问题的是:
缓存如果挂掉了,请求应该就直接去数据库取,否则缓存一挂岂不是整个系统都不可用了?
Spring中是否有什么配置使缓存能否做到可插拔?
实际中会直接使用这种方案吗?还是使用Redis集群方案(抱歉这个还没研究)?
实际项目中自己实现缓存管理方案?还是其他的好的解决方案?
谢谢!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
1、这个问题你要这样想,Redis 有挂掉的可能,数据库也存在这个可能,数据库挂了系统不是也不可用了么?
2、这个貌似没有
3、通常都会对 Redis 集群,其实访问量、数据库不大的话不集群的话问题也不大,服务器中 Redis 也不是那么容易挂的,而且可以设置监控系统监控 Redis 、数据库等运行情况,有异常则报警,报警后及时处理即可。
4、不太清楚你说的自己实现缓存管理方案具体是指什么
可以使用reids哨兵,挂掉之后自动切换
Spring自带的缓存管理没有用过,但一般的缓存逻辑都是先到redis中取,取的到数据就return。取不到按正常流程,并将取到的数据加入redis进行缓存。
1、可以把单节点做成集群,用哨兵监听每个节点,这样redis全挂的机率几乎为0。再说数据库也要做主从,万一挂了呢。。。
2、二级缓存,redis一级缓存取不到数据,就取二级ehcache(适合Java)
3、一般都是集群。(单节点很少用,读写没分离,有很多问题)
4、一般redis集群就够了,是否采用二级缓存看项目和需求