JSON 存储是指以 JSON(JavaScript 对象表示法)格式存储数据,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 的额外负担。
更糟糕的是,许多应用程序只是获取整个 JSON 字符串,对其进行反序列化,对其进行操作,重新序列化,然后再次将其设置为应用程序。这是一种反模式。使用这种方法存在丢失数据的风险。例如:
反模式:不要使用 | ||
应用程序实例 #1 | 应用程序实例 #2 | |
1 | > GET my-car | |
2 | [反序列化,将颜色更改为“红色”,然后重新序列化] | > GET my-car |
3 | > SET my-car [实例 #1 的新值] | [反序列化,将型号更改为“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 的方法,尤其是在需要子元素原子操作时。