这篇文章主要介绍SpringBoot如何配置Redis自定义过期时间操作,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
<version>1.4.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.8.1.RELEASE</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
package com.regs.tms.common.redis;
@Configuration
@EnableCaching// 启用缓存,这个注解很重要
@ConfigurationProperties(prefix = "spring.redis")
@Data
public class RedisCacheConfig extends CachingConfigurerSupport {
private String host;
private Integer port;
private Integer database;
private String password;
@Bean("redisTemplate")
public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(factory);
//使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值
Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
serializer.setObjectMapper(mapper);
template.setValueSerializer(serializer);
template.setHashValueSerializer(serializer);
// 设置键(key)的序列化采用StringRedisSerializer。
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
//打开事务支持
template.setEnableTransactionSupport(true);
template.afterPropertiesSet();
return template;
}
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) throws SQLException {
//配置事务管理器
return new DataSourceTransactionManager(dataSource);
}
@Bean("stringRedisTemplate")
public StringRedisTemplate stringRedisTemplate() {
Integer port = this.port == null ? 6379 : this.port;
JedisConnectionFactory jedis = new JedisConnectionFactory();
jedis.setHostName(host);
jedis.setPort(port);
if (StringUtils.isNotEmpty(password)) {
jedis.setPassword(password);
}
if (database != null) {
jedis.setDatabase(database);
} else {
jedis.setDatabase(0);
}
// 初始化连接pool
jedis.afterPropertiesSet();
// 获取连接template
StringRedisTemplate temple = new StringRedisTemplate();
temple.setConnectionFactory(jedis);
return temple;
}
}
package com.regs.tms.common.redis.annotation;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface CacheDuration {
//Sets the expire time (in seconds).
public long duration() default 60;
}
package com.regs.tms.common.redis.annotation;
/**
* ExpireCacheManager,继承自RedisCacheManager,
* 用于对@CacheExpire解析及有效期的设置
*/
public class RedisExpireCacheManager extends RedisCacheManager implements ApplicationContextAware, InitializingBean {
private ApplicationContext applicationContext;
public RedisExpireCacheManager(RedisTemplate redisTemplate) {
super(redisTemplate);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
@Override
public void afterPropertiesSet() {
parseCacheExpire(applicationContext);
}
private void parseCacheExpire(ApplicationContext applicationContext) {
final Map<String, Long> cacheExpires = new HashMap<>(16);
//扫描有注解
String[] beanNames = applicationContext.getBeanNamesForAnnotation(Cacheable.class);
for (String beanName : beanNames) {
final Class clazz = applicationContext.getType(beanName);
addCacheExpires(clazz, cacheExpires);
}
//设置有效期
super.setExpires(cacheExpires);
}
private void addCacheExpires(final Class clazz, final Map<String, Long> cacheExpires) {
ReflectionUtils.doWithMethods(clazz, new ReflectionUtils.MethodCallback() {
@Override
public void doWith(Method method) throws IllegalArgumentException, IllegalAccessException {
ReflectionUtils.makeAccessible(method);
//根据CacheExpire注解获取时间
CacheExpire cacheExpire = findCacheExpire(clazz, method);
if (cacheExpire != null) {
Cacheable cacheable = findAnnotation(method, Cacheable.class);
String[] cacheNames = isEmpty(cacheable.value()) ? new String[]{} : cacheable.value();
for (String cacheName : cacheNames) {
cacheExpires.put(cacheName, cacheExpire.expire());
}
}
}
}, new ReflectionUtils.MethodFilter() {
@Override
public boolean matches(Method method) {
return null != findAnnotation(method, Cacheable.class);
}
});
}
/**
* CacheExpire标注的有效期,优先使用方法上标注的有效期
*
* @param clazz
* @param method
* @return
*/
private CacheExpire findCacheExpire(Class clazz, Method method) {
CacheExpire methodCache = findAnnotation(method, CacheExpire.class);
if (null != methodCache) {
return methodCache;
}
CacheExpire classCache = findAnnotation(clazz, CacheExpire.class);
if (null != classCache) {
return classCache;
}
return null;
}
}
如果要计算每24小时的下单量,
通常的做法是,取出旧值,进行加一在设置回去,
第二次设置值的时候,把超时时间重新设置成个24小时
这样无疑的记录24小时的数量是不准确的
并且spring boot 中,默认使用了spring 来操作redis ,使存在每个redis中的值,都会加前面加入一些东西
1) "\xac\xed\x00\x05t\x00\x0bREDISUALIST"
我们在查找每个值的时候,并不知道在key前面需要加点什么.
所以我们必须要用keys 这个命令 ,来匹配 我们需要查找的key,来取第一个
然后我们用 ttl 命令 返回指定key的剩余时间 ,重新设置回去,而不是设置24小时,这样就实现了24小时累加一次
/**
* 获取指定key的剩余超时时间,key最好是唯一的,有特点的,最好不要匹配出多个 例子 *111 取出 "\xac\xed\x00\x05t\x00\x0b111"
* 返回剩余秒数
* @param key
* @return
* create by jcd
*/
public Long ttlByKey(@NotNull String key){
Set<byte[]> keys = redisTemplate.getConnectionFactory().getConnection().keys(key.getBytes());
byte[] bytes = keys.stream().findFirst().get();
Long ttl = redisTemplate.getConnectionFactory().getConnection().ttl(bytes);
return ttl;
}
以上是“SpringBoot如何配置Redis自定义过期时间操作”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。