Maison > Article > base de données > Comment résoudre le code tronqué de la sérialisation Redis sous SpringBoot
La solution de sérialisation originale du projet utilisait la classe de sérialisation JDK, mais l'enregistrer sur Redis produira un code tronqué, ce qui n'est pas pratique à afficher et à gérer.
public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) { redisTemplate.setKeySerializer(new JdkSerializationRedisSerializer(Object.class.getClassLoader())); redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer(Object.class.getClassLoader())); redisTemplate.setHashKeySerializer(new JdkSerializationRedisSerializer(Object.class.getClassLoader())); redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer(Object.class.getClassLoader())); this.redisTemplate = redisTemplate; }
Après vérification en ligne, cela est dû au problème de la classe de sérialisation Nous n'utilisons pas la méthode de sérialisation de jdk et utilisons le format json
public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) { redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); this.redisTemplate = redisTemplate; }
SpringBoot configure les règles de sérialisation Redis pour éviter les caractères tronqués
Ensuite, ajoutez la configuration Redis dans application.yml :
Remarque : il y a quelques configurations supplémentaires ici, telles que le mot de passe , etc., je ne l'écrirai pas ici pour éviter des ennuis.
Maintenant, nous pouvons écrire la classe de testAprès le test, nous avons trouvé un problème, la clé comme test:1 était brouillé. Par exemple, lorsque j'ai utilisé l'outil
Another.Redis.Desktop.Manager pour l'afficher, j'ai découvert qu'il se transformait en une série de chaînes étranges. est tronqué. Cela est dû aux règles de sérialisation par défaut de Redis. Toutes les règles de sérialisation par défaut de RedisTemplate sont JDKSerializer et les règles de sérialisation par défaut de StringRedisTemplate sont StringRedisSerializer. Vous pouvez voir l'image ci-dessous pour plus de détailsNous avons besoin pour le faire Configuration
package com.eknown.config; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; /** * redis配置 * 主要是配置Redis的序列化规则,用Jackson2JsonRedisSerializer替换默认的jdkSerializer * @author zhangfanghao * @version 1.0 * @date 2019-07-21 21:04 */ @Configuration public class RedisConfig { @Bean public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) { RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(connectionFactory); // 使用Jackson2JsonRedisSerialize替换默认序列化 Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(objectMapper); // 设置key和value的序列化规则 redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.afterPropertiesSet(); return redisTemplate; } }Remarque : seules les règles de sérialisation de Key et Value sont réinitialisées ici. Les règles de sérialisation de hash-key et de hash-value peuvent être définies comme référence.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!