上一篇说到改变了RedisTemplate的默认序列化器后,在redis中存入Java对象后,在redis中的呈现是:会记录类的字节码
这也是代码中可以强制装换为对应的java对象的原因:
@Test void testStudent() { redisTemplate.opsForValue().set("student:100", new Student("小明", 22)); Student student = (Student) redisTemplate.opsForValue().get("student:100"); System.out.println("student="+student); }
存在的问题:
因为每个对象都要存入class,随着对象越来越多也会带来内存额外的开销。
所以,为了节省空间,不会使用json的序列化器来处理value,而是统一使用String序列化器,要求只能存储String类型的key和value,当需要存储java对象时,手动完成对象的序列化和反序列化。
Spring默认提供了一个StringRedisTemplate类,它的key和value的序列化方式默认就是String方式,省去了我们自己定义RedisTemplate过程:
java
@Autowired
private StringRedisTemplate stringRedisTemplate;
//json工具
ObjectMapper objectMapper = new ObjectMapper();
@Test
void testJava() throws JsonProcessingException {
//手动将java对象转成json字符串
String studentJson = objectMapper.writeValueAsString(new Student("晓东", 11));
//写入一条数据到redis
stringRedisTemplate.opsForValue().set("student:200",studentJson);
//读取数据
String studentJsonStr = stringRedisTemplate.opsForValue().get("student:200");
//手动将json数据转成java对象
Student student = objectMapper.readValue(studentJsonStr, Student.class);
System.out.println("student="+student);
}
存入单个key-value、key-java对象都是可以的。
操作Hash类型的数据
java
@Test
void testHash() {
stringRedisTemplate.opsForHash().put("user:400", "name", "张大大");
stringRedisTemplate.opsForHash().put("user:400", "age", "18");
//获取key对应所有的hash key value
Map<Object, Object> entries = stringRedisTemplate.opsForHash().entries("user:400");
entries.forEach((key, value)-> System.out.println(key+"--"+value));
}
这里注意存入hash的value需要时String类型,比如上面的18,不能写数字18,而是要写字符串18。