springboot redis缓存乱码问题
1、创建一个spring boot应用,添加redis依赖,还有jackson依赖

2、启用缓存,添加配置类,附加注解@EnableCaching,并且覆盖父类方法,自定义keyGenerator,代码如下
@Override
@Bean
public KeyGenerator keyGenerator() {
// TODO Auto-generated method stub
return new KeyGenerator() {
@Override
public Object generate(Object object, Method method, Object... objects) {
// TODO Auto-generated method stub
StringBuilder sb = new StringBuilder();
sb.append(object.getClass().getName());
sb.append(method.getName());
for (Object obj : objects) {
if (obj != null) {
sb.append(obj.toString());
}
}
return sb.toString();
}
};
}

3、添加一个业务类,使用缓存注解,用于测试

4、在启动类中调用业务类方法,如下图所示

5、到redis数据库中查找存入的数据,发现value为一堆乱码

6、解决办法,自定义CacheManager,在配置类中添加如下代码
private RedisSerializer<String> keySerializer() {
return new StringRedisSerializer();
}
//使用Jackson序列化器
private RedisSerializer<Object> valueSerializer() {
return new GenericJackson2JsonRedisSerializer();
}
@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
//缓存配置对象
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();
redisCacheConfiguration = redisCacheConfiguration.entryTtl(Duration.ofMinutes(30L)) //设置缓存的默认超时时间:30分钟
.disableCachingNullValues() //如果是空值,不缓存
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(keySerializer())) //设置key序列化器
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer((valueSerializer()))); //设置value序列化器
return RedisCacheManager
.builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory))
.cacheDefaults(redisCacheConfiguration).build();
}

7、重新测试,数据正常肉眼可查看,json数据

8、整个配置文件如下
package com.zuli;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
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.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import java.lang.reflect.Method;
import java.time.Duration;
@Configuration
@EnableCaching
public class CachingConfig extends CachingConfigurerSupport {
private RedisSerializer<String> keySerializer() {
return new StringRedisSerializer();
}
//使用Jackson序列化器
private RedisSerializer<Object> valueSerializer() {
return new GenericJackson2JsonRedisSerializer();
}
@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
//缓存配置对象
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();
redisCacheConfiguration = redisCacheConfiguration.entryTtl(Duration.ofMinutes(30L)) //设置缓存的默认超时时间:30分钟
.disableCachingNullValues() //如果是空值,不缓存
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(keySerializer())) //设置key序列化器
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer((valueSerializer()))); //设置value序列化器
return RedisCacheManager
.builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory))
.cacheDefaults(redisCacheConfiguration).build();
}
@Override
@Bean
public KeyGenerator keyGenerator() {
// TODO Auto-generated method stub
return new KeyGenerator() {
@Override
public Object generate(Object object, Method method, Object... objects) {
// TODO Auto-generated method stub
StringBuilder sb = new StringBuilder();
sb.append(object.getClass().getName());
sb.append(method.getName());
for (Object obj : objects) {
if (obj != null) {
sb.append(obj.toString());
}
}
return sb.toString();
}
};
}
}