1、查询结果如为空报错
Cache 'pre-coupon-pay:branchInfo' does not allow 'null' values. Avoid storing null via '@Cacheable(unless=\"#result == null\")' or configure RedisCache to allow 'null' via RedisCacheConfiguration.
解决:
Spring的Redis注解添加 unless="#result == null",这样当结果为空时则不存入Redis;list时:unless="#result == null || #result.size() == 0"
2、缓存的key有双冒号
pre-coupon-pay:branchInfo::09255
解决:
修改配置
package cn.xxx.coupon.pay.config;
import java.time.Duration;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
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.RedisCacheManager;
import org.springframework.data.redis.cache.RedisCacheWriter;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
@EnableCaching //启动SpringCache缓存
public class SpringCacheRedisConfig {
@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();
redisCacheConfiguration = redisCacheConfiguration
//设置缓存的默认超时时间:60分钟
.entryTtl(Duration.ofMinutes(60L))
//变双冒号为单冒号
.computePrefixWith(name -> name +":")
//如果是空值,不缓存
.disableCachingNullValues()
//设置key序列化器
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
//设置value序列化器
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
return RedisCacheManager
.builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory))
.cacheDefaults(redisCacheConfiguration)
.build();
}
}
参考资料:
注解缓存报错:Cache 'redisCache' does not allow 'null' values_艾比利Kurtz的博客-CSDN博客
spring-data-redis:2.x版本 @Cacheable缓存解决双冒号::问题_我很幸福2016的博客-CSDN博客_redis单冒号和双冒号