Maison >base de données >Redis >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é :
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!