1. 为什么要替换redis默认的序列化方式?
答:原有的redis默认使用的是jdk的序列化方式,它序列化出来是乱码,没有可读性。
2. 如何替换redis默认的序列化方式?
项目中集成redis后,编写配置类,代码如下:
@Configuration public class RedisConfig { /** * 配置RedisTemplate序列化规则 * 使用String序列化器处理key和value,确保Redis中存储的键值对都是可读的字符串格式 * * @param redisConnectionFactory Redis连接工厂,由Spring Boot自动配置提供 * @return 配置好序列化规则的RedisTemplate实例 */ @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate redisTemplate = new RedisTemplate<>(); RedisSerializer< String> redisSerializer = new StringRedisSerializer(); redisTemplate.setConnectionFactory(redisConnectionFactory); // 设置key的序列化方式为String,保证key在Redis中以明文形式存储 redisTemplate.setKeySerializer(redisSerializer); // 设置hash结构field的序列化方式为String redisTemplate.setHashKeySerializer(redisSerializer); // 设置value的序列化方式为Jackson2 JSON,将Java对象序列化为JSON格式存储 redisTemplate.setValueSerializer(jackson2JsonRedisSerializer()); // 配置hash结构value的序列化方式 redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer()); return redisTemplate; } /** * 创建Jackson2 JSON序列化器 * 用于将Java对象序列化为JSON格式存储到Redis,支持对象的反序列化 * @return 配置好ObjectMapper的Jackson2JsonRedisSerializer实例 */ private Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer() { Jackson2JsonRedisSerializer<Object> jsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class); ObjectMapper objectMapper = new ObjectMapper(); // 设置所有属性的访问权限,允许序列化private字段 objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); // 禁用遇到未知属性时抛出异常,提高兼容性 objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false); // 启用默认类型信息,在JSON中包含类名以便反序列化时能还原为正确的对象类型 objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY); jsonRedisSerializer.setObjectMapper(objectMapper); return jsonRedisSerializer; } }