JSON 存储指的是以 JSON(JavaScript Object Notation)格式存储数据,JSON 是一种轻量级且广泛使用的数据交换格式。JSON 是一种基于文本的格式,易于人类阅读和编写,也易于计算机解析和生成。
JSON 存储在 Web 开发中很受欢迎,因为许多 Web 应用都是使用 JavaScript 构建的,JavaScript 可以轻松操作 JSON 数据。JSON 可用于在服务器和客户端之间存储和传输数据,也可作为在数据库中存储数据的格式。
JSON 存储通常与 NoSQL 数据库结合使用,NoSQL 数据库是非关系型数据库,旨在处理大量非结构化或半结构化数据。NoSQL 数据库非常适合 JSON 数据,因为它们是无模式的,可以处理灵活和动态的数据结构。
在 Redis 中存储 JSON 有几种方法。最基本的形式是获取预先序列化的数据,然后简单地将其存储在特定的键上
> SET car "{"colour":"blue","make":"saab","model":93,"features":["powerlocks","moonroof"]}" OK > GET car "{"colour":"blue","make":"saab","model":93,"features":["powerlocks","moonroof"]}"
这种方法看似简单,但存在一些非常真实的缺点
前两点对于少量数据来说可能微不足道,但肯定会累积起来。特别是对于多兆字节的 JSON 存储。然而,第三点则更为关键。
在 Redis 4.0 之前,在 Redis 中处理 JSON 数据的唯一方法是使用通过 cjson 模块的 Lua 脚本。这部分解决了 JSON 问题,尽管它仍然是一个瓶颈,并增加了学习 Lua 的额外负担。
更糟的是,许多应用会直接 GET 整个 JSON 字符串,将其反序列化,操作后重新序列化,然后在应用端再次 SET 回去。这是一种反模式。使用这种方法存在丢失数据的真实风险。举个例子
反模式:请勿使用 | ||
应用实例 #1 | 应用实例 #2 | |
1 | > GET my-car | |
2 | [反序列化,将 colour 更改为 ‘red’,然后重新序列化] | > GET my-car |
3 | > SET my-car [来自实例 #1 的新值] | [反序列化,将 model 更改为 ‘95’,然后重新序列化] |
4 | > SET my-car [来自实例 #2 的新值] | |
5 | > GET my-car … |
第 5 行的结果将只显示来自实例 #2 的更新,而实例 #1 中设置的颜色将会丢失。
Redis 4.0+ 具备使用模块的能力。RedisJSON 是一个提供特殊数据类型和直接操作命令的模块。RedisJSON 将数据存储为二进制格式,消除了 JSON 的存储开销,并提供更快的元素访问速度,无需反序列化/重新序列化。
要使用 RedisJSON,您需要在 Redis 服务器中安装它,或者在 Redis Enterprise 数据库中启用它。
以前面的例子为例,使用 RedisJSON 代替将 JSON 存储为字符串,代码如下所示
应用实例 #1 | 应用实例 #2 | |
1 | >JSON.SET car2 . ‘{“colour”:”blue”, “make”:”saab”, “model”:93, “features” :[ “powerlocks”, “moonroof” ]}’ | |
2 | > JSON.SET car2 colour ‘”red”‘ | |
3 | > JSON.SET car2 model ’95’ | |
4 | >JSON.GET car2 . “{ “colour”:”red”, “make”:”saab”, “model”:95, “features”: [“powerlocks”, “moonroof”]}” |
RedisJSON 提供了一种通常更安全、更快、更直观的方式来在您的数据存储中操作 JSON,特别是在需要对子元素进行原子操作的情况下。