当前位置:首页>排行榜>Redis‑OM 两大模型怎么选?HashModel 与 JsonModel 字段、校验完整实战指南

Redis‑OM 两大模型怎么选?HashModel 与 JsonModel 字段、校验完整实战指南

  • 更新时间 2026-09-21 16:57:18
Redis‑OM 两大模型怎么选?HashModel 与 JsonModel 字段、校验完整实战指南

在使用 Redis‑OM 做对象映射开发时,很多同学都会卡在第一道选择题:到底该用 HashModel 还是 JsonModel

同样是 Redis‑OM 的核心模型,二者 API 看似接近,但底层存储结构差异巨大。选错模型,后续会遇到无法嵌套对象、不能使用列表字典、索引失效等各种棘手问题,后期重构成本很高。

本文就从实际开发角度,带你理清 HashModel 和 JsonModel 的适用场景、字段定义方式、默认值配置以及数据校验规则,帮你避开选型踩坑,快速上手 Redis‑OM 的模型开发工作。

一、HashModel 与 JsonModel 选型

  1. JsonModel支持嵌套模型、列表、字典等容器类型,可对列表、内嵌模型建立索引;底层通过 Pydantic 做 JSON 序列化存入 Redis。如果业务需要内嵌子模型(比如客户模型嵌套订单列表),优先选它。
  2. HashModel存储在 Redis Hash 扁平结构,不支持列表、集合、字典、其他模型这类容器类型;未来版本可能把容器字段序列化为 JSON 字符串,但无法建立索引。没有嵌套需求时优先选用。

二、模型与字段基础用法

  1. 创建模型
    通过继承HashModelJsonModel定义模型,使用 Python 类型注解声明字段,语法和 Pydantic 保持一致。
  2. 默认值
    字段可以直接赋值设置默认值。实例化对象不传该字段,会自动读取默认值,调用save()会把默认值持久化到 Redis。
  3. 可选字段
    使用Optional[类型]标记可选字段;没有设置默认值的字段属于必填字段。

三、数据校验能力(底层依赖 Pydantic)

  1. Redis‑OM 模型同时也是 Pydantic 模型,会在运行时依据类型注解自动校验数据。
  2. 基础校验
    基础类型str/int/date等自动校验类型,保证存入数据类型合规。
  3. 复杂校验
    可直接使用 Pydantic 校验器,例如EmailStr校验邮箱格式。
    • 实例化传入非法数据,直接抛出ValidationError
    • 修改实例字段为非法值,调用save()保存的时候同样触发校验报错。
  4. 值约束
    复用 Pydantic 的约束注解,可以实现小写字符串、正则匹配、数值区间、倍数限制等更多字段约束。

简短一句话概括

HashModel 适合简单扁平对象;JsonModel 支持嵌套和容器。依托 Pydantic,用类型注解完成字段定义、默认值、可选配置以及丰富的数据校验,自动在实例创建和保存时拦截非法数据。

今天我们对于OM中主要的几个内容做深度讲解,这一期我们来讲解一下OM中最重要的models(模型)。

模型与字段:

Redis OM 的对象映射、数据校验和持久化功能的核心是两种声明式模型:HashModel 和 JsonModel。两者提供的 API 大体相同,但在 Redis 中存储数据的方式不一样。

1.HashModel 与 JsonModel 的对比

首先,该如何选择?

选择逻辑比较简单:如果你想在一个模型中嵌套另一个模型(例如给 Customer(客户)模型增加一个 Order(订单)模型列表),那就要用 JsonModel。只有 JsonModel 支持内嵌模型。

除此之外的场景,使用 HashModel

2.创建模型

创建 Redis OM 模型的方式是继承 HashModel 或者 JsonModel,示例:

3.字段

Redis OM 模型中,使用 Python 类型注解来定义字段。如果你不熟悉类型注解,可以看这份教程。它的用法和 Pydantic 完全一致。

4.使用HashModel

HashModel 将数据存储在 Redis 的哈希结构里,哈希是扁平结构。这意味着 Redis Hash 不能包含 Redis 的集合、列表或者其他哈希。

受这个限制,HashModel 不支持容器类型,包括:

l集合(Sets

l列表(Lists

l字典以及其他映射类型

l其他 Redis OM 模型

lPydantic 模型

注:未来版本可能会把这类值序列化为 JSON 字符串,和 JsonModel 的实现类似。区别在于:HashModel 无法对这些字段建立索引,只能随模型存取;而 JsonModel 可以对列表字段和内嵌的 JsonModel 创建索引。

简单总结:如果你需要使用容器类型,就选用 JsonModel

5.使用JsonModel

好消息!JsonModel 支持容器类型。底层会使用 Pydantic 的 JSON 序列化

与编码能力,把你的 JsonModel 序列化后存入 Redis

6.默认值

字段可以设置默认值,直接给字段赋值即可。

现在,如果创建 Customer 对象时不传 bio 字段,会自动使用默认值。

之后调用 save() 时,模型会把这个默认值保存到 Redis

7.可选字段

没有设置默认值的字段是必填字段。想要让字段变成可选,请使用 Optional

8.数据校验

Redis OM 在底层依靠 Pydantic,根据模型的类型注解在运行时校验数据。

每一个 Redis OM 模型同时也是 Pydantic 模型,所以你可以使用 Pydantic 的校验器,例如 EmailStrPattern 等,实现复杂校验逻辑。

9.基础类型校验

基础类型注解(例如 str)会自动开启校验:

Redis OM 会保证 first_name 永远是字符串,age 永远是整数,以此类推。

10.复杂校验

我们看下:尝试创建一个 Customer 对象,但传入非法邮箱时会发生什么:

如果你修改模型实例的字段为非法值,然后尝试保存,同样会触发校验错误:

11.约束值

Pydantic 提供了大量类型注解,可以为模型字段增加值约束:

l始终小写的字符串

l必须匹配正则表达式的字符串

l在指定区间内的整数

l必须是某个数字倍数的整数

所有这些约束类型都可以在 Redis OM 模型中使用

持续更新精彩内容中,欢迎点关注哟!

随机文章