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<Object> DEFAULT_PAIR = RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer());private static final CacheKeyPrefix DEFAULT_CACHE_KEY_PREFIX = cacheName -> cacheName+":";@Overrideprotected 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 {@Beanpublic CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {ObjectMapper om = new ObjectMapper();RedisSerializer<String> redisSerializer = new StringRedisSerializer();Jackson2JsonRedisSerializer<Object> 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
總結
以上是生活随笔為你收集整理的springboot缓存@Cacheable的使用,及设置过期时间的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gps-sdr-sim c语言程序,用S
- 下一篇: KING_C#学习之QRCode二维码(