简介:在java中redis只有string和hash两种类型的序列化器,在底层默认调用string类型的序列化器然后将序列化之后的数据转换为byte数组。这样可能会造成同一个string类型的可key序列化为不同的key:value,并且这样的存储的数据的可读性差。因此需要对于key和value使用不同的序列化器进行序列化。
package com.atheima.redis.config; 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.GenericJackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializer; @Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> getRedisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory); // 声明jackson的序列化器 GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer(); // 对于key进行序列化 redisTemplate.setKeySerializer(RedisSerializer.string()); redisTemplate.setHashKeySerializer(RedisSerializer.string()); // 对应value进行序列化 redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer); redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer); return redisTemplate; } }使用上面redisTemplate存储完成一个对象时,在redis存储的时候会将对象类型的地址数据存储为为json中的一个key:value类似于"@class":"xxx.xxx.user",因此在进行反序列化的时候可以直接将获取到对象。
但是这又出现了存储@class对应的key和value需要的存储空间过大的问题,因此不建议使用jackson进行序列化和反序列化,为了节省存储空间一般使用的key和value的序列化器都是string类型的,通过手动将对象转换为json格式的string格式进行存储,在手动的反序列化将string类型的数据进行解析为一个对象。其中的objectmapper是json类型的序列化器可以将对象转换为json类型的string以及对于json类型的string反序列化为一个对象。
@Test public void testStringGetUser() throws JsonProcessingException { User user = new User("libai", 18); // 手动的序列化 String json = objectMapper.writeValueAsString(user); // 存储 stringRedisTemplate.opsForValue().set("user:100", json); // 获取 String jsonFromRedis = stringRedisTemplate.opsForValue().get("user:100"); System.out.println(jsonFromRedis); // 反序列化 User userFromRedis = objectMapper.readValue(jsonFromRedis, User.class); System.out.println(userFromRedis); }