SpringDataRedis序列化的一些问题

database

SpringDataRedis的序列化的一些问题

RedisTemplate可以接收任意Object作为值写入Redis,但是如果不实现设置序列化器的化默认是采用JDK序列化,序列化后的结果可读性差并且内存占用空间大,如下图。

自定义RedisTemplate的序列化方式

key和 hashKey采用 string序列化,value和HashValue采用JSON序列化

@Configuration

public class RedisConfig {

@Bean

public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory){

//创建RedisTemplate对象

RedisTemplate<String, Object> template = new RedisTemplate<>();

//设置连接工厂

template.setConnectionFactory(connectionFactory);

//创建JSON序列化工具

GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();

//设置key和HashKey的序列化

template.setKeySerializer(RedisSerializer.string());

template.setHashKeySerializer(RedisSerializer.string());

//设置value和HashValue的序列化

template.setValueSerializer(jsonRedisSerializer);

template.setHashValueSerializer(jsonRedisSerializer);

//返回

return template;

}

}

但是JSON序列化仍存在着一些问题。为了在反序列化时知道对象的类型,JSON序列化器会将类的class类型写入json结果中,存入Redis,会带来额外的内存开销,如下图所示。

手动序列化,节省Redis内存开销

为了节省内存空间,我们不使用JSON序列化器来处理value,而使用String序列化器,要求只能存储String类型的key和value。当需要存储Java对象时,手动完成对象的序列化和反序列化。

Spring提供了StringRedisTemplate类,它的key和value的序列化方式默认就是String方式。

class RedisStringTests {

@Autowired

private StringRedisTemplate stringRedisTemplate;

@Test

void testSaveUser() throws JsonProcessingException {

//创建对象

User user = new User("虎哥", 21);

//手动序列化

String json = mapper.writeValueAsString(user);

//写入数据

stringRedisTemplate.opsForValue().set("user:200", json);

//获取数据

String jsonUser = stringRedisTemplate.opsForValue().get("user:200");

//手动反序列化

User user1 = mapper.readValue(jsonUser, User.class);

System.out.println("user1 = " + user1);

}

}

结果如下:

以上是 SpringDataRedis序列化的一些问题 的全部内容, 来源链接: utcz.com/z/536547.html

回到顶部