1.问题概述:
SpringBoot2.x集成Redis后,测试案例注入RedisTemplate,使用redisTemplate.opsForValue().set();
设置一个简单的key-value,出现以下2问题:
问题一.redis-cli
中如图:
设置的key = redis:template:one:string
但是在redis-cli中出现了一堆前缀
问题二.Redis Desktop Manager
工具如图:
震惊!! 文件夹竟然一直循环下去!!
2.解决问题:
问题的根源,在于“序列化”,源码跟踪可以看这篇博客:https://blog.csdn.net/bingguang1993/article/details/87889788
笔者在这里贴上实现的序列化代码:
-
注入RedisTemplate
/** * RedisTemplate缓存 */ @Bean public RedisTemplate<String, Object> redisTemplate() { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); // 序列化配置开始 redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new JsonRedisSerializer<>(Object.class)); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setHashValueSerializer(new JsonRedisSerializer<>(Object.class)); // 序列化配置结束 redisTemplate.setConnectionFactory(redisConnectionFactory); redisTemplate.afterPropertiesSet(); return redisTemplate; }
-
序列化实现类
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.parser.ParserConfig; import com.alibaba.fastjson.serializer.SerializerFeature; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.SerializationException; import java.nio.charset.StandardCharsets; /** * Redis序列化 */ public class JsonRedisSerializer<T> implements RedisSerializer<T> { private static ParserConfig defaultRedisConfig = new ParserConfig(); static { defaultRedisConfig.setAutoTypeSupport(true); } private Class<T> type; public JsonRedisSerializer(Class<T> type) { this.type = type; } @Override public byte[] serialize(T t) throws SerializationException { if (t == null) { return new byte[0]; } return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(StandardCharsets.UTF_8); } @Override public T deserialize(byte[] bytes) throws SerializationException { if (bytes == null || bytes.length <= 0) { return null; } String str = new String(bytes, StandardCharsets.UTF_8); return JSON.parseObject(str, type, defaultRedisConfig); } }