赞
踩
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+":";
-
- @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<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不限时间缓存。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。