【Spring连载】使用Spring Data访问Redis(七)----Hash Mapping

【Spring连载】使用Spring Data访问Redis(七)----Hash Mapping

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

  • 使用HashOperations和序列化程序进行直接映射
  • 使用Redis Repositories
  • 使用HashMapper和HashOperations

一、Hash Mappers

哈希映射器是将对象和Map<K, V>来回映射的转换器。HashMapper用于Redis Hashes。

有多种实施方式可供选择:

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

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

java 复制代码
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为域对象(domain objects)提供Redis Hash映射。Jackson2HashMapper可以将顶级属性映射为哈希字段名,还可以选择展平(flatten)结构。简单类型映射到简单值。复杂类型(嵌套对象、集合、映射等)表示为嵌套JSON。

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

举例,有以下类及其包含的数据结构:

java 复制代码
public class Person {
  String firstname;
  String lastname;
  Address address;
  Date date;
  LocalDateTime localDateTime;
}

public class Address {
  String city;
  String country;
}

下表展示了前面类中的数据如何在一般映射中显示:
表 1. 一般映射

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

下表展示了上述类中的数据在扁平(flat)映射中的显示方式:
表 2. Flat映射

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

扁平化要求所有属性名称不干扰JSON路径。使用展平(flattening)时,不支持在映射key中使用点或括号,也不支持将其用作property名称。生成的哈希无法映射回对象。

java.util.Date 和 java.util.Calendar用毫秒表示。如果jackson-datatype-jsr310在类路径上,JSR-310日期/时间类型将序列化为它们的toString形式。

相关推荐
java1234_小锋1 小时前
REDIS集群会有写操作丢失吗?为什么
数据库·redis·缓存
程序定小飞1 小时前
基于springboot的学院班级回忆录的设计与实现
java·vue.js·spring boot·后端·spring
郝开3 小时前
Spring Boot 2.7.18(最终 2.x 系列版本)1 - 技术选型:连接池技术选型对比;接口文档技术选型对比
java·spring boot·spring
阿里花盘3 小时前
教育培训机构如何搭建自己的在线教育小程序?
小程序·哈希算法·剪枝·霍夫曼树
知兀3 小时前
【Spring/SpringBoot】SSM(Spring+Spring MVC+Mybatis)方案、各部分职责、与Springboot关系
java·spring boot·spring
向阳而生,一路生花3 小时前
redis离线安装
java·数据库·redis
hzk的学习笔记4 小时前
Redisson 的 Watchdog 机制
数据库·redis·分布式·缓存
伊布拉西莫5 小时前
Spring 6.x HTTP interface 使用说明
spring·restclient
hzk的学习笔记7 小时前
Redisson解锁失败,watchdog会不会一直续期下去?
数据库·redis·缓存
YDS8297 小时前
苍穹外卖 —— Spring Cache和购物车功能开发
java·spring boot·后端·spring·mybatis