Maison  >  Article  >  base de données  >  Pourquoi Redis doit-il être sérialisé ?

Pourquoi Redis doit-il être sérialisé ?

(*-*)浩
(*-*)浩original
2019-11-22 10:33:048903parcourir

Pourquoi Redis doit-il être sérialisé ?

Le but ultime de la sérialisation est de permettre aux objets d'être stockés sur plusieurs plates-formes et transmis sur le réseau. La façon dont nous effectuons le stockage multiplateforme et la transmission réseau est IO, et le format de données pris en charge par notre IO est un tableau d'octets. (Apprentissage recommandé : Tutoriel vidéo Redis )

Grâce à ce qui précède, je pense que vous savez déjà que toutes les données qui doivent être "stockage multiplateforme" et "transmission réseau" doivent être sérialisées .

Essentiellement, le stockage et la transmission réseau nécessitent tous deux de sauvegarder l'état d'un objet dans un format d'octet reconnu multiplateforme, puis d'autres plates-formes peuvent analyser et restaurer les informations sur l'objet via les informations d'octet.

Comparaison des méthodes de sérialisation Redis :

La méthode par défaut de Redis est JdkSerializationRedisSerializer

JdkSerializationRedisSerializer : utilisez la sérialisation fournie par Fonction JDK.

L'avantage est que vous n'avez pas besoin de fournir d'informations de type (classe) lors de la désérialisation, mais l'inconvénient est que vous devez implémenter l'interface Serialisable, et le résultat sérialisé est très volumineux , au format JSON 5 Environ fois, cela consommera beaucoup de mémoire du serveur Redis.

Jackson2JsonRedisSerializer : utilisez la bibliothèque Jackson pour sérialiser des objets en chaînes JSON.

L'avantage est que c'est rapide, que la chaîne sérialisée est courte et concise, et qu'il n'est pas nécessaire d'implémenter l'interface Serialisable.

Mais l'inconvénient est également très fatal, c'est-à-dire qu'il y a un paramètre de type dans le constructeur de cette classe, et les informations de type de l'objet à sérialiser (objet .class) doivent être fournies. En examinant le code source, nous avons constaté qu'il utilise uniquement les informations de type pendant le processus de désérialisation.

Problème : en utilisant la méthode de sérialisation par défaut du JDK, des "caractères tronqués" apparaîtront lors de l'affichage de la valeur k-v dans l'outil RDM, ce qui n'est pas pratique à afficher.

Solution : personnalisez la méthode de sérialisation, utilisez Jackson2JsonRedisSerializer

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.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * Redis配置
 *
 * @author LinJie
 */
@Configuration
public class RedisConfig {

    /**
     * Redis repository redis repository.
     *
     * @param redisTemplate the redis template
     * @return the redis repository
     */
    @Bean
    public RedisRepository redisRepository(RedisTemplate redisTemplate) {
        // 使用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);
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // key采用String的序列化方式
        redisTemplate.setKeySerializer(stringRedisSerializer);
        // hash的key也采用String的序列化方式
        redisTemplate.setHashKeySerializer(stringRedisSerializer);
        // value序列化方式采用jackson
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        // hash的value序列化方式采用jackson
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.afterPropertiesSet();
        return new RedisRepository(redisTemplate);
    }
}

Pour plus d'articles techniques liés à Redis, veuillez consulter le

Tutoriel d'introduction à l'utilisation de la base de données Redis colonne Étudiez !

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:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn