Spring @Cacheable自定义缓存过期时间的实现示例
更新时间:2024年05月27日 11:56:27 作者:路漫修远 上下求索
本文主要介绍了Spring @Cacheable自定义缓存过期时间的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
实现效果
原来的@Cacheable使用方式:
@Cacheable(value = "userinfo", key = "#dto.userId")
实现后的使用方式:
@Cacheable(value = "userinfo#30#m", key = "#dto.userId")
实现代码
创建一个自定义的缓存管理器,继承自RedisCacheManager
public class CustomRedisCacheManager extends RedisCacheManager {
public CustomRedisCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration) {
super(cacheWriter, defaultCacheConfiguration);
}
/**
* 重写createRedisCache方法
* @param name 原来的name只是作为redis存储键名
* 重写的name可通过"#"拼接过期时间:
* 1. 如果没有"#"则默认不设置过期时间
* 2. 拼接的第一个"#"后面为过期时间,第二个"#"后面为时间单位
* 3. 时间单位的表示使用: d(天)、h(小时)、m(分钟)、s(秒), 默认为h(小时)
* @param cacheConfig
* @return
*/
@Override
protected RedisCache createRedisCache(String name, RedisCacheConfiguration cacheConfig) {
// 解析name,设置过期时间
if (StringUtils.isNotEmpty(name) && name.contains("#")) {
String[] split = name.split("#");
// 缓存键名
String cacheName = split[0];
// "#"后第一位是时间
int expire = Integer.parseInt(split[1]);
// 过期时间,默认为h(小时)
Duration duration = Duration.ofHours(expire);
// 根据"#"后第二位字符判断过期时间的单位,设置相应的过期时间,默认时间单位是h(小时)
if (split.length == 3) {
switch (split[2]){
case "d":
duration = Duration.ofDays(expire);
break;
case "m":
duration = Duration.ofMinutes(expire);
break;
case "s":
duration = Duration.ofSeconds(expire);
break;
default:
duration = Duration.ofHours(expire);
}
}
return super.createRedisCache(cacheName, cacheConfig.entryTtl(duration));
}
return super.createRedisCache(name, cacheConfig);
}
}
在redis配置类中,将上面自定义的缓存管理器注册为Bean
@Configuration
@EnableCaching
public class RedisConfig {
/**
* 自定义RedisTemplate
* 设置Redis序列化方式,默认使用的是JDKSerializer的序列化方式,效率低,所以这里设置使用FastJsonRedisSerializer
* @param connectionFactory
* @return
*/
@Bean
@SuppressWarnings(value = {"unchecked", "rawtypes"})
public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory connectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
// 设置redis连接(LettuceConnectionFactory实现了RedisConnectionFactory)
redisTemplate.setConnectionFactory(connectionFactory);
FastJsonRedisSerializer serializer = new FastJsonRedisSerializer(Object.class);
// key设置StringRedisSerializer序列化
redisTemplate.setKeySerializer(new StringRedisSerializer());
// value设置FastJsonRedisSerializer序列化
redisTemplate.setValueSerializer(serializer);
// Hash key设置序列化
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
// Hash value设置序列化
redisTemplate.setHashValueSerializer(serializer);
return redisTemplate;
}
/**
* 实例化自定义的缓存管理器
* @param redisTemplate
* @return
*/
@Bean
@SuppressWarnings(value = {"unchecked", "rawtypes"})
public RedisCacheManager redisCacheManager(RedisTemplate redisTemplate) {
RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(Objects.requireNonNull(redisTemplate.getConnectionFactory()));
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer()));
return new CustomRedisCacheManager(redisCacheWriter, redisCacheConfiguration);
}
}到此这篇关于Spring @Cacheable自定义缓存过期时间的实现示例的文章就介绍到这了,更多相关Spring @Cacheable缓存过期时间内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Spring 中 PageHelper 不生效问题及解决方法
这篇文章主要介绍了Spring 中 PageHelper 不生效问题,使用这个插件时要注意版本的问题,不同的版本可能 PageHelper 不会生效,本文结合示例代码给大家介绍的非常详细,需要的朋友可以参考下2022-12-12
elasticsearch集群发现zendiscovery的Ping机制分析
这篇文章主要为大家介绍了elasticsearch集群发现zendiscovery的Ping机制分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-04-04
永久解决 Intellij idea 报错:Error :java 不支持发行版本5的问题
这篇文章主要介绍了永久解决 Intellij idea 报错:Error :java 不支持发行版本5的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2021-02-02
详解Spring Boot Oauth2缓存UserDetails到Ehcache
这篇文章主要介绍了详解Spring Boot Oauth2缓存UserDetails到Ehcache,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-08-08
Java 8中读取文件内容 Files.lines()方法使用示例
这篇文章主要介绍了Java 8中读取文件内容Files.lines()方法如何使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-07-07


最新评论