1.x版本的配置
因为我这边用的是2.0的版本所有图片中的方法不存在
下面是1.x版本的代码
/**
* 1.XX版本的配置
*
* @author yangjikang
* @param redisTemplate
* @return
*/
@Bean
public RedisCacheManager myRedisCacheManager(RedisTemplate redisTemplate) {
RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
//默认使用cacheNames作为key的前缀
cacheManager.setUsePrefix(true);
//设置缓存过期时间(秒)
cacheManager.setDefaultExpiration(45);
return cacheManager;
}
2.x版本的配置
下面是2.x版本的代码
/**
* 2.XX版本的配置
*
* @author yangjikang
* @param factory
* @return
*/
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig(); // 生成一个默认配置,通过config对象即可对缓存进行自定义配置
config = config.entryTtl(Duration.ofMinutes(2)) // 设置缓存的默认过期时间,也是使用Duration设置
.disableCachingNullValues(); // 不缓存空值
// 设置一个初始化的缓存空间set集合
Set<String> cacheNames = new HashSet<>();
cacheNames.add("catalog_test_id");
cacheNames.add("catalog_test_name");
// 对每个缓存空间应用不同的配置
Map<String, RedisCacheConfiguration> configMap = new HashMap<>();
configMap.put("catalog_test_id", config);
configMap.put("catalog_test_name", config.entryTtl(Duration.ofMinutes(5)));
RedisCacheManager cacheManager = RedisCacheManager.builder(factory) // 使用自定义的缓存配置初始化一个cacheManager
.initialCacheNames(cacheNames) // 注意这两句的调用顺序,一定要先调用该方法设置初始化的缓存名,再初始化相关的配置
.withInitialCacheConfigurations(configMap)
.build();
return cacheManager;
}
该方法设置的缓存大概原理就是存储在redis的时候,会给这个key添加一个时间(你设置的时间),下次查询该key的时候redis
会去判断该key的生效时间,如果到期了,就会把这个值清理掉。你需要重新查询数据库,把新的结果放入redis(这里网友说了一个分布式的问题,但我这里还有研究,网友的意思大概是,两个线程同时去获取这个key,第一个线程获取的时候发现超时了,但是redis先是清了value,再清理key。此时key并没有清理,第二个线程进查询的value就是null.这个问题感兴趣的同学可以自己试一下,解决方案,可以把原来先判断key is exist换成 value is exist )
想看2.x版本更新的详细信息可以查看https://blog.csdn.net/yingziisme/article/details/81463391
本文2.x代码引荐这里