Spring boot默认使用的是SimpleCacheConfiguration,即使用ConcurrentMapCacheManager来实现缓存。
Spring cache是代码级的缓存,一般是使用一个ConcurrentMap,也就是说实际上还是是使用JVM的内存来缓存对象的,这势必会造成大量的内存消耗。但好处是显然的:使用方便。
Redis 作为一个缓存服务器,是内存级的缓存。它是使用单纯的内存来进行缓存。
集群环境下,每台服务器的spring cache是不同步的,这样会出问题的,spring cache只适合单机环境。
Redis是设置单独的缓存服务器,所有集群服务器统一访问redis,不会出现缓存不同步的情况。
CacheManager负责对缓存的增删改查, CacheManager的缓存的介质可配置ConcurrentMap/EhCache/Redis等,这里我用的是redis配置
Redis配置类
@Configuration
public class RedisConfiguration {
@Bean
@ConfigurationProperties(prefix = "session.redis")
protected RedisConfigVo redisConfig() {
return new RedisConfigVo();
}
/**
* 解决redis.clients.jedis.exceptions.JedisDataException: ERR unknown command ' CONFIG '
*
* @return
*/
@Bean
public static ConfigureRedisAction configureRedisAction() {
return ConfigureRedisAction.NO_OP;
}
/**
* 创建连接工厂
*
* @return
*/
@Bean
public RedisConnectionFactory connectionFactory() {
RedisConfigVo configVo = redisConfig();
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
jedisConnectionFactory.setHostName(configVo.getHost());
jedisConnectionFactory.setPort(configVo.getPort());
jedisConnectionFactory.setTimeout(configVo.getTimeout());
if (configVo.getPassword() != null && !"".equals(configVo.getPassword())) {
jedisConnectionFactory.setPassword(configVo.getPassword());
}
jedisConnectionFactory.setDatabase(configVo.getDatabase());
jedisConnectionFactory.setPoolConfig(poolCofig(configVo));
jedisConnectionFactory.setUsePool(true);
// 初始化连接pool
jedisConnectionFactory.afterPropertiesSet();
return jedisConnectionFactory;
}
/**
* 创建连接池配置
*
* @return
*/
private static JedisPoolConfig poolCofig(RedisConfigVo configVo) {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxIdle(configVo.getMaxIdle() > 0 ? configVo.getMaxIdle() : GenericObjectPoolConfig.DEFAULT_MAX_IDLE);
jedisPoolConfig.setMinIdle(configVo.getMinIdle() > 0 ? configVo.getMinIdle() : GenericObjectPoolConfig.DEFAULT_MIN_IDLE);
jedisPoolConfig.setMaxTotal(configVo.getMaxTotal() > 0 ? configVo.getMaxTotal() : GenericObjectPoolConfig.DEFAULT_MAX_TOTAL);
jedisPoolConfig.setMaxWaitMillis(configVo.getMaxWaitMillis() > 0 ? configVo.getMaxWaitMillis() : GenericObjectPoolConfig.DEFAULT_MAX_WAIT_MILLIS);
jedisPoolConfig.setTestOnBorrow(configVo.isTestOnBorrow());
return jedisPoolConfig;
}
@Bean
public CacheManager cacheManager(RedisTemplate redisTemplate) {
RedisCacheManager rcm = new RedisCacheManager(redisTemplate);
//seconds
rcm.setDefaultExpiration(5 * 60L);
return rcm;
}
}
使用@Cacheable 注解