采用的是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集群方案(抱歉这个还没研究)?
实际项目中自己实现缓存管理方案?还是其他的好的解决方案?
谢谢!
1、这个问题你要这样想,Redis 有挂掉的可能,数据库也存在这个可能,数据库挂了系统不是也不可用了么?
2、这个貌似没有
3、通常都会对 Redis 集群,其实访问量、数据库不大的话不集群的话问题也不大,服务器中 Redis 也不是那么容易挂的,而且可以设置监控系统监控 Redis 、数据库等运行情况,有异常则报警,报警后及时处理即可。
4、不太清楚你说的自己实现缓存管理方案具体是指什么