学习使用SpringCache的Demo项目。涉及Ehcache2.x、Ehcache3.x、Redis
- Generic
- JCache (JSR-107) 推测在使用Ehcache3.x时(@EnableCaching)需要采用JCache的配置方式
- EhCache 2.x
- Hazelcast
- Infinispan
- Redis
- Guava
- Simple
由于采用SpringBoot一定要注意SpringBoot的默认设置事项,避免个人设置出现无效的情况
@Component
@CacheConfig(cacheNames = "UserCache")
public class UserCache implements Serializable {
@CachePut(key = "#loginId")
// @CachePut(key = "#p0") 第一个参数作为key, 与 key = "#loginId" 等同
public UserDO put(String loginId){
System.out.println("-- 放置 用户:" + loginId + " 缓存中 --");
return new UserDO(){
{
this.setLoginId(loginId);
this.setName("用户" + loginId);
}
};
}
/**
* 失效某个对象
* @param loginId
*/
@CacheEvict(key = "#loginId")
public void evict(String loginId){
}
/**
* 失效所有对象
*/
@CacheEvict(allEntries = true)
public void evictAll(){
}
/**
* 从缓存中获取
* @param loginId
* @return
*/
@Cacheable(key = "#loginId")
public UserDO get(String loginId){
System.out.println("-- 获取 用户:" + loginId + " 如果没有则返回 null 也在可以在此处创建对象其后会自动放置至缓存中 --");
System.out.println("-- 生成缓存对象 --");
return new UserDO(){
{
this.setLoginId(loginId);
this.setName("用户" + loginId);
}
};
}
}
如何不同的缓存设置不同的过期时间例子如下
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory){
RedisCacheManager redisCacheManager = new RedisCacheManager(
RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory),
this.getRedisCacheConfigurationWidthTTL(Duration.ofSeconds(0L)),
new HashMap<String, RedisCacheConfiguration>(){
{
this.put("UserCache", getRedisCacheConfigurationWidthTTL(Duration.ofSeconds(60L)));
}
}
);
return redisCacheManager;
}
设置RedisCacheConfiguration使用链式操作要注意事项例子如下
private RedisCacheConfiguration getRedisCacheConfigurationWidthTTL(Duration duration){
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();
/**
* 这里一定要注意所有操作都是返回一个新的对象所以需要赋值返回或者直接返回。不然设置无效。
*/
//方法.1
// redisCacheConfiguration = redisCacheConfiguration.entryTtl(duration);
// redisCacheConfiguration = redisCacheConfiguration.serializeValuesWith(RedisSerializationContext.SerializationPair
// .fromSerializer(this.jackson2JsonRedisSerializer()));
//方法.2
// redisCacheConfiguration = redisCacheConfiguration.entryTtl(duration)
// .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(this.jackson2JsonRedisSerializer()));
// return redisCacheConfiguration;
//方法.3
return redisCacheConfiguration
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(this.jackson2JsonRedisSerializer()))
.entryTtl(duration);
}
- 修改配置为
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.lettuce.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.lettuce.pool.max-wait=-1
# 连接池中的最大空闲连接
spring.redis.lettuce.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.lettuce.pool.min-idle=0 - 需要加入common-pool2
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.6.0</version>
</dependency