Maison  >  Article  >  base de données  >  Comment résoudre le code tronqué de la sérialisation Redis sous SpringBoot

Comment résoudre le code tronqué de la sérialisation Redis sous SpringBoot

王林
王林avant
2023-05-27 11:34:061868parcourir

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;
    }

Attention au problème#🎜🎜 ##🎜🎜 #Lors de l'utilisation du sérialiseur ci-dessus, il est nécessaire de s'assurer que toutes les méthodes get de la classe d'entité ont des champs d'attribut, sinon des problèmes surviendront lors de la désérialisation. S'il n'est pas nécessaire d'ajouter l'annotation @JsonIgnore, ce sera le cas. ignoré lors de la sérialisation.

SpringBoot configure les règles de sérialisation Redis pour éviter les caractères tronqués

SpringBoot est très simple à introduire Redis, ajoutez l'annotation suivante :

#🎜🎜 #

Ensuite, ajoutez la configuration Redis dans application.yml : Comment résoudre le code tronqué de la sérialisation Redis sous SpringBoot

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. Comment résoudre le code tronqué de la sérialisation Redis sous SpringBoot

Maintenant, nous pouvons écrire la classe de test

Après le test, nous avons trouvé un problème, la clé comme test:1 était brouillé. Par exemple, lorsque j'ai utilisé l'outil Comment résoudre le code tronqué de la sérialisation Redis sous SpringBoot

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étails

Comment résoudre le code tronqué de la sérialisation Redis sous SpringBoot

Nous avons besoin pour le faire ConfigurationComment résoudre le code tronqué de la sérialisation Redis sous SpringBoot

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer