数据可以通过 Redis 中的各种数据结构来存储。Jackson2JsonRedisSerializer 可以将对象转换为 JSON 格式。理想情况下,JSON 可以作为值使用普通键来存储。通过使用 Redis 哈希,可以实现更复杂的结构化对象映射。Spring Data Redis 提供了多种将数据映射到哈希的策略(具体取决于使用场景):

  • 直接映射,通过使用 HashOperations 和序列化器。
  • 使用 Redis 仓库
  • **使用 HashMapperHashOperations**。

一、Hash 映射器

哈希映射器是将映射对象转换为 Map<K, V> 及其反向转换的工具。HashMapper 旨在与 Redis 哈希一起使用。

有多种实现可供选择:

  • BeanUtilsHashMapper:使用 Spring 的 BeanUtils
  • ObjectHashMapper:使用对象到哈希的映射。
  • Jackson2HashMapper:使用 FasterXML Jackson。

以下示例显示了实现哈希映射的一种方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Person {
String firstname;
String lastname;

// …
}

public class HashMapping {

@Resource(name = "redisTemplate")
HashOperations<String, byte[], byte[]> hashOperations;

HashMapper<Object, byte[], byte[]> mapper = new ObjectHashMapper();

public void writeHash(String key, Person person) {

Map<byte[], byte[]> mappedHash = mapper.toHash(person);
hashOperations.putAll(key, mappedHash);
}

public Person loadHash(String key) {
Map<byte[], byte[]> loadedHash = hashOperations.entries(key);
return (Person) mapper.fromHash(loadedHash);
}
}

Jackson2HashMapper

Jackson2HashMapper 通过使用 FasterXML Jackson 为域对象提供 Redis 哈希映射。Jackson2HashMapper 可以将顶级属性映射为哈希字段名称,并且可以选择性地展平结构。简单类型映射为简单值。复杂类型(嵌套对象、集合、映射等)表示为嵌套的 JSON。

展平会为所有嵌套属性创建单独的哈希条目,并尽可能将复杂类型解析为简单类型。

考虑以下类及其包含的数据结构:

1
2
3
4
5
6
7
8
9
10
11
12
public class Person {
String firstname;
String lastname;
Address address;
Date date;
LocalDateTime localDateTime;
}

public class Address {
String city;
String country;
}

下表显示了前一类中的数据在正常映射中的显示方式:

Hash Field Value
firstname Jon
lastname Snow
address { "city" : "Castle Black", "country" : "The North" }
date 1561543964015
localDateTime 2018-01-02T12:13:14

下表显示了前一类中的数据在展平映射中的显示方式:

Hash Field Value
firstname Jon
lastname Snow
address.city Castle Black
address.country The North
date 1561543964015
localDateTime 2018-01-02T12:13:14

展平要求所有属性名称不能与 JSON 路径冲突。在使用展平时,不支持在映射键或属性名称中使用点或括号。展平后的哈希无法再映射回对象。

java.util.Datejava.util.Calendar 以毫秒表示。如果类路径中包含 jackson-datatype-jsr310,则 JSR-310 日期/时间类型将序列化为其 toString 形式。

相关链接

Hash Mapping :: Spring Data Redis

OB tags

#Redis #Spring