JSON 性能
提示
来自deepseek解释
原文链接:https://redis.io/docs/latest/develop/data-types/json/performance/
为了初步了解 Redis JSON 的能力,您可以像测试任何其他 Redis 命令一样,使用 redis-benchmark 进行测试。然而,为了对测试进行更多控制,我们将使用一个用 Go 编写的工具,名为 ReJSONBenchmark,我们预计在不久的将来发布它。
以下数据来自一个 AWS EC2 c4.8xlarge 实例,该实例同时运行 Redis 服务器和基准测试工具。与服务器的连接通过网络栈进行。所有测试均未使用管道。
注意:以下结果是使用 Redis JSON 的预览版本测量的,该版本尚未优化。
Redis JSON 基准
小型对象
我们测试一个 JSON 值,虽然是纯合成的,但很有趣。测试对象是 /tests/files/pass-100.json, 大小为 380 字节,且是嵌套的。我们首先测试 SET 它,然后使用几个不同的路径测试 GET:


较大数组
转向更大的值,我们使用 /tests/files/pass-jsonsl-1.json 中的 1.4 kB 数组:


大型对象
更多相同的测试作为收尾,现在我们将处理一个不小于 3.5 kB 的庞然大物,由 /tests/files/pass-json-parser-0000.json 给出:


数值操作
最后但同样重要的是,一些加法和乘法操作:


基准线
为了建立基准线,我们将使用 Redis 的 PING 命令。首先,让我们看看 redis-benchmark 的报告:
~$ redis/src/redis-benchmark -n 1000000 ping
====== ping ======
1000000 requests completed in 7.11 seconds
50 parallel clients
3 bytes payload
keep alive: 1
99.99% <= 1 milliseconds
100.00% <= 1 milliseconds
140587.66 requests per secondReJSONBenchmark 的并发数是可以配置的,因此我们将测试几种设置以找到最佳值。以下结果显示,16 个工作线程产生了最佳的吞吐量:


注意,我们的基准测试工具在 PING 方面表现略差——仅产生 116K ops,而 redis-cli 为 140K。
空字符串
另一个 JSON 基准是设置和获取空字符串——一个只有两个字节长的值(即 "")。诚然,这不是很有用,但它让我们了解了模块的基本性能:


与服务器端 Lua 脚本的对比
我们将 Redis Open Source 的 JSON 性能与 Redis 嵌入式 Lua 引擎进行比较。为此,我们使用了位于 /benchmarks/lua 的 Lua 脚本。这些脚本以 JSON 或 MessagePack 格式存储的值上提供 JSON 的 GET 和 SET 功能。每个不同的操作(设置根、获取根、设置路径和获取路径)都使用每个"引擎"在不同大小的对象上执行。
设置和获取根
在此测试中,存储原始 JSON 表现最佳,但这并不令人惊讶,因为它所做的只是服务未处理的字符串。虽然您可以而且应该使用 Redis 来缓存不透明数据,而 JSON"blob"只是一个例子,但这不允许除整个值之外的任何更新。
因此,更有意义的比较是在 JSON 和 MessagePack 变体之间,因为两者在实际存储传入的 JSON 值之前都对其进行了处理。虽然这两种方法的速率和延迟行为非常相似,但绝对测量表明 Redis JSON 的性能可能还有进一步提升的空间。




设置和获取对象的部分
此测试显示了 Redis JSON 存在的原因。它不仅优于 Lua 变体,而且无论对象的整体大小如何,都保持恒定的速率和延迟。这里没有魔法——JSON 保持值处于反序列化状态,因此访问其部分内容是相对便宜的操作。与此形成鲜明对比的是原始 JSON 和 MessagePack,它们都需要在对值进行任何操作之前解码整个对象(这个过程随着对象变大而变得更加昂贵)。




更多图表
这些图表基本相同,但针对每个文件(值)独立:










原始结果
以下是以 CSV 格式呈现的基准测试原始结果。
JSON 结果
title,concurrency,rate,average latency,50.00%-tile,90.00%-tile,95.00%-tile,99.00%-tile,99.50%-tile,100.00%-tile
[ping],1,22128.12,0.04,0.04,0.04,0.05,0.05,0.05,1.83
[ping],2,54641.13,0.04,0.03,0.05,0.05,0.06,0.07,2.14
[ping],4,76000.18,0.05,0.05,0.07,0.07,0.09,0.10,2.10
[ping],8,106750.99,0.07,0.07,0.10,0.11,0.14,0.16,2.99
[ping],12,111297.33,0.11,0.10,0.15,0.16,0.20,0.22,6.81
[ping],16,116292.19,0.14,0.13,0.19,0.21,0.27,0.33,7.50
[ping],20,110622.82,0.18,0.17,0.24,0.27,0.38,0.47,12.21
[ping],24,107468.51,0.22,0.20,0.31,0.38,0.58,0.71,13.86
[ping],28,102827.35,0.27,0.25,0.38,0.44,0.66,0.79,12.87
[ping],32,105733.51,0.30,0.28,0.42,0.50,0.79,0.97,10.56
[ping],36,102046.43,0.35,0.33,0.48,0.56,0.90,1.13,14.66
... 为面向 AI 的 Markdown 截断输出 ...
JSON.GET {key} ResultSet.totalResultsAvailable,16,91202.84,0.17,0.16,0.24,0.28,0.35,0.38,5.30
JSON.SET {key} . {pass-jsonsl-yelp.json size: 40 kB},16,1624.86,9.84,9.67,9.86,9.94,15.86,19.36,31.94
JSON.GET {key} .,16,442.55,36.08,35.62,37.78,38.14,55.23,81.33,88.40
JSON.SET {key} message.code 1,16,77677.25,0.20,0.19,0.28,0.33,0.42,0.45,11.07
JSON.GET {key} message.code,16,89206.61,0.18,0.16,0.25,0.28,0.36,0.39,8.60
[JSON.SET num . 0],16,84498.21,0.19,0.17,0.26,0.30,0.39,0.43,8.08
[JSON.NUMINCRBY num . 1],16,78640.20,0.20,0.18,0.28,0.33,0.44,0.48,11.05
[JSON.NUMMULTBY num . 2],16,77170.85,0.21,0.19,0.28,0.33,0.43,0.47,6.85
使用 cjson 的 Lua
json-set-root.lua empty string,16,86817.84,0.18,0.17,0.26,0.31,0.39,0.42,9.36
json-get-root.lua,16,90795.08,0.17,0.16,0.25,0.28,0.36,0.39,8.75
json-set-root.lua pass-100.json,16,84190.26,0.19,0.17,0.27,0.30,0.38,0.41,12.00
json-get-root.lua,16,87170.45,0.18,0.17,0.26,0.29,0.38,0.45,9.81
json-get-path.lua sclr,16,54556.80,0.29,0.28,0.35,0.38,0.57,0.64,7.53
json-set-path.lua sclr 1,16,35907.30,0.44,0.42,0.53,0.67,0.93,1.00,8.57
json-get-path.lua sub_doc,16,51158.84,0.31,0.30,0.36,0.39,0.50,0.62,7.22
json-get-path.lua sub_doc sclr,16,51054.47,0.31,0.29,0.39,0.47,0.66,0.74,7.43
json-get-path.lua array_of_docs,16,39103.77,0.41,0.37,0.57,0.68,0.87,0.94,8.02
json-get-path.lua array_of_docs 1,16,45811.31,0.35,0.32,0.45,0.56,0.77,0.83,8.17
json-get-path.lua array_of_docs 1 sclr,16,47346.83,0.34,0.31,0.44,0.54,0.72,0.79,8.07
json-set-root.lua pass-jsonsl-1.json,16,82100.90,0.19,0.18,0.28,0.31,0.39,0.43,12.43
... 为面向 AI 的 Markdown 截断输出 ...
json-set-root.lua pass-jsonsl-yahoo2.json,16,47544.65,0.33,0.31,0.41,0.47,0.59,0.64,10.52
json-get-root.lua,16,25369.92,0.63,0.57,0.91,1.05,1.37,1.56,9.95
json-set-path.lua ResultSet totalResultsAvailable 1,16,5077.32,3.15,3.09,3.20,3.24,5.12,6.26,14.98
json-get-path.lua ResultSet totalResultsAvailable,16,7652.56,2.09,2.05,2.13,2.17,3.23,3.95,9.65
json-set-root.lua pass-jsonsl-yelp.json,16,29575.20,0.54,0.52,0.64,0.75,0.94,1.00,12.66
json-get-root.lua,16,18424.29,0.87,0.84,1.25,1.40,1.82,1.95,7.35
json-set-path.lua message code 1,16,2251.07,7.10,6.98,7.14,7.22,11.00,12.79,21.14
json-get-path.lua message code,16,3380.72,4.73,4.44,5.03,6.82,10.28,11.06,14.93
使用 cmsgpack 的 Lua
msgpack-set-root.lua empty string,16,82592.66,0.19,0.18,0.27,0.31,0.38,0.42,10.18
msgpack-get-root.lua,16,89561.41,0.18,0.16,0.25,0.29,0.37,0.40,9.52
msgpack-set-root.lua pass-100.json,16,44326.47,0.36,0.34,0.43,0.54,0.78,0.86,6.45
msgpack-get-root.lua,16,41036.58,0.39,0.36,0.51,0.62,0.84,0.91,7.21
msgpack-get-path.lua sclr,16,55845.56,0.28,0.26,0.36,0.44,0.64,0.70,11.29
msgpack-set-path.lua sclr 1,16,43608.26,0.37,0.34,0.47,0.58,0.78,0.85,10.27
msgpack-get-path.lua sub_doc,16,50153.07,0.32,0.29,0.41,0.50,0.69,0.75,8.56
msgpack-get-path.lua sub_doc sclr,16,54016.35,0.29,0.27,0.38,0.46,0.62,0.67,6.38
msgpack-get-path.lua array_of_docs,16,45394.79,0.35,0.32,0.45,0.56,0.78,0.85,11.88
msgpack-get-path.lua array_of_docs 1,16,48336.48,0.33,0.30,0.42,0.52,0.71,0.76,7.69
msgpack-get-path.lua array_of_docs 1 sclr,16,53689.41,0.30,0.27,0.38,0.46,0.64,0.69,11.16
msgpack-set-root.lua pass-jsonsl-1.json,16,28956.94,0.55,0.51,0.65,0.82,1.17,1.26,8.39
... 为面向 AI 的 Markdown 截断输出 ...
msgpack-set-root.lua pass-jsonsl-yahoo2.json,16,5597.60,2.85,2.81,2.89,2.94,4.57,5.59,10.19
msgpack-get-root.lua,16,6585.01,2.43,2.39,2.52,2.66,3.76,4.80,10.59
msgpack-set-path.lua ResultSet totalResultsAvailable 1,16,6666.95,2.40,2.35,2.43,2.47,3.78,4.59,12.08
msgpack-get-path.lua ResultSet totalResultsAvailable,16,10733.03,1.49,1.45,1.60,1.66,2.36,2.93,13.15
msgpack-set-root-lua pass-jsonsl-yelp.json,16,2291.53,6.97,6.87,7.01,7.12,10.54,12.89,21.75
msgpack-get-root.lua,16,2889.59,5.53,5.45,5.71,5.86,8.80,10.48,25.55
msgpack-set-path.lua message code 1,16,2847.85,5.61,5.44,5.56,6.01,10.58,11.90,16.91
msgpack-get-path.lua message code,16,5030.95,3.18,3.07,3.24,3.57,6.08,6.92,12.44