您的位置:首页 > 数据库 > Redis

spring 配置 cache 缓存使用 Redis(基于注解)

2019-08-19 14:48 387 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/u014615041/article/details/99725835

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 注解

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: