springboot缓存@Cacheable的使用,及设置过期时间

springboot缓存@Cacheable的使用,及设置过期时间

1,在启动类Application中增加注解@EnableCaching

2,待缓存的方法上方增加@Cacheable注解

@Cacheable(cacheNames = redisContains.REDIS_SHOW_TEXT,key = "#bodyParams.getString('textCode')")这其中,key即接收参数中的某个数据,例如:

若方法的接收参数为JSONObject bodyParams 则key的值可以写为key = "#bodyParams.getString('textCode')"。

若接收参数为:SysDictData dictData 则key的值可以写为:key = "#dictData.beginTime"

若接收参数为:String id 则key的值可以写为:key="#id"

3,目前是无法设置过期时间的

期望能达到此效果,设置#30,可以设置30秒过期时间,方式如下:

3.1,创建RedisConfigCacheManager类

import lombok.extern.slf4j.Slf4j;

import org.apache.commons.lang3.StringUtils;

import org.springframework.data.redis.cache.*;

import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;

import org.springframework.data.redis.serializer.RedisSerializationContext;

import java.time.Duration;

/**

* redis 配置类

*/

@Slf4j

public class RedisConfigCacheManager extends RedisCacheManager {

public RedisConfigCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration) {

super(cacheWriter, defaultCacheConfiguration);

}

private static final RedisSerializationContext.SerializationPair DEFAULT_PAIR = RedisSerializationContext.SerializationPair

.fromSerializer(new GenericJackson2JsonRedisSerializer());

private static final CacheKeyPrefix DEFAULT_CACHE_KEY_PREFIX = cacheName -> cacheName+":";

@Override

protected RedisCache createRedisCache(String name, RedisCacheConfiguration cacheConfig) {

final int lastIndexOf = StringUtils.lastIndexOf(name, '#');

if (lastIndexOf > -1) {

final String ttl = StringUtils.substring(name, lastIndexOf + 1);

final Duration duration = Duration.ofSeconds(Long.parseLong(ttl));

cacheConfig = cacheConfig.entryTtl(duration);

//修改缓存key和value值的序列化方式

cacheConfig = cacheConfig.computePrefixWith(DEFAULT_CACHE_KEY_PREFIX)

.serializeValuesWith(DEFAULT_PAIR);

final String cacheName = StringUtils.substring(name, 0, lastIndexOf);

return super.createRedisCache(cacheName, cacheConfig);

}else{

//修改缓存key和value值的序列化方式

cacheConfig = cacheConfig.computePrefixWith(DEFAULT_CACHE_KEY_PREFIX)

.serializeValuesWith(DEFAULT_PAIR);

return super.createRedisCache(name, cacheConfig);

}

}

}

3.2,创建CacheConfig类

import com.fasterxml.jackson.annotation.JsonAutoDetect;

import com.fasterxml.jackson.annotation.PropertyAccessor;

import com.fasterxml.jackson.databind.ObjectMapper;

import org.springframework.cache.CacheManager;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.data.redis.cache.RedisCacheConfiguration;

import org.springframework.data.redis.cache.RedisCacheWriter;

import org.springframework.data.redis.connection.RedisConnectionFactory;

import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;

import org.springframework.data.redis.serializer.RedisSerializationContext;

import org.springframework.data.redis.serializer.RedisSerializer;

import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.time.Duration;

@Configuration

public class CacheConfig {

@Bean

public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {

ObjectMapper om = new ObjectMapper();

RedisSerializer redisSerializer = new StringRedisSerializer();

Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(

Object.class);

// 解决查询缓存转换异常的问题

om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);

om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

jackson2JsonRedisSerializer.setObjectMapper(om);

// 配置序列化(解决乱码的问题)

RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()

.entryTtl(Duration.ofMillis(-1))

.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))

.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))

.disableCachingNullValues();

RedisCacheWriter cacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory);

return new RedisConfigCacheManager(cacheWriter, config);

}

}

至此,即可实现,加上#30可以实现30秒缓存,不加#即-1不限时间缓存。

参考:https://www.cnblogs.com/mrsans/articles/14113591.html————————————————

原文链接:https://blog.csdn.net/lpping90/article/details/117522239

相关阅读

365提现多久能到账 为什么手机流量会卡顿?常见原因及解决方法大揭秘!

为什么手机流量会卡顿?常见原因及解决方法大揭秘!

365提现多久能到账 为什么跑车底盘要比一般车低?是为了“看门道”还是这个原因?

为什么跑车底盘要比一般车低?是为了“看门道”还是这个原因?

365提现多久能到账 魅族手机与电脑连接全攻略:多种方式及详细步骤

魅族手机与电脑连接全攻略:多种方式及详细步骤

members28365-365 45周年结婚纪念日是什么婚

45周年结婚纪念日是什么婚

members28365-365 转账转错了24小时之内能不能收回

转账转错了24小时之内能不能收回

members28365-365 仙女在古代的意思(仙子,仙姑,仙女,三者有何区别?)

仙女在古代的意思(仙子,仙姑,仙女,三者有何区别?)

members28365-365 有没有hifi一点的无源低音炮

有没有hifi一点的无源低音炮

365bater 猫咪体外驱虫多久一次?这些误区你一定要避开!

猫咪体外驱虫多久一次?这些误区你一定要避开!

members28365-365 开关面板·开关插座

开关面板·开关插座