跳到内容

性能

要对RedisJSON的功能有一个初步的了解,可以使用它进行测试redis-benchmark就像任何其他Redis命令。然而,为了更好地控制测试,我们将使用一个用Go编写的工具ReJSONBenchmark我们希望在不久的将来发布。

以下数据来自AWS EC2 c4.8xlarge实例,该实例同时运行Redis服务器和基准测试工具。到服务器的连接是通过网络堆栈进行的。所有测试都是非流水线的。

注意:下面的结果是使用RedisJSON的预览版本测量的,它仍然是非常未优化的。

RedisJSON基线

一个小对象

我们测试一个有趣的JSON值,尽管它是纯合成的。测试对象是/测试/文件/通过- 100. - json,重380个字节,并且是嵌套的。我们首先测试设置它,然后使用几个不同的路径获取它:

ReJSONBenchmark传递- 100. - json

ReJSONBenchmark传递- 100. - jsonpercentiles

一个更大的数组

转到更大的值,我们使用1.4 kB数组/ /文件/通过测试- jsonsl 1. - json

ReJSONBenchmark传递- jsonsl - 1. - json

ReJSONBenchmark传递- jsonsl - 1. - jsonpercentiles

一个稍大的对象

总结一下,现在我们将采用一个不少于3.5 kB的庞然大物/ /文件/通过测试- json解析器- 0000. - json

ReJSONBenchmark传递- json解析器- 0000. - json

ReJSONBenchmark传递- json解析器- 0000. - jsonpercentiles

操作数

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

ReJSONBenchmark操作数

ReJSONBenchmark数字操作百分比

基线

为了建立基线,我们将使用Redis命令。首先,让我们看看是什么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毫秒100.00% <= 1毫秒140587.66 requests per second

ReJSONBenchmark的并发性是可配置的,因此我们将测试几个设置以找到一个好的设置。以下是结果,表明16个工人产生的最佳吞吐量:

ReJSONBenchmark平

ReJSONBenchmark萍百分位数

请注意,我们的基准测试工具在ping方面的表现略差——仅产生116K的ops,与之相比redis-cli140 k。

空字符串

另一个RedisJSON基准是设置和获取一个空字符串-一个只有两个字节长的值(即。"").当然,这不是很有用,但它教会了我们一些关于模块的基本性能:

ReJSONBenchmark空字符串

ReJSONBenchmark空字符串百分比

比较服务器端Lua脚本

我们比较了RedisJSON与Redis的嵌入式Lua引擎的性能。为此目的,我们使用Lua脚本/标准/ lua.这些脚本为以JSON或MessagePack格式存储的值提供了RedisJSON的GET和SET功能。每个不同的操作(设置根、获取根、设置路径和获取路径)都是通过每个“引擎”在大小不同的对象上执行的。

设置和获取根结点

在这个测试中,存储原始JSON的性能最好,但这并不奇怪,因为它所做的只是提供未处理的字符串。虽然你可以并且应该使用Redis缓存不透明的数据,JSON“blobs”只是一个例子,这不允许任何更新,除了这些整个值。

因此,更有意义的比较是在RedisJSON和MessagePack变体之间,因为两者都在实际存储传入的JSON值之前处理它。虽然这两种方法的速率和延迟表现非常相似,但绝对测量结果表明RedisJSON的性能可能会进一步提高。

VS. Lua设置root

VS. Lua设置根延迟

VS. Lua得到根

VS. Lua得到根延迟

设置和获取对象的部分

这个测试显示了RedisJSON存在的原因。它不仅优于Lua变体,而且不管对象的总体大小,它都能保持恒定的速率和延迟。这里没有什么神奇之处——RedisJSON保持了值的反序列化,因此访问它的部分是一个相对便宜的操作。与之形成鲜明对比的是原始JSON和MessagePack,它们需要在对整个对象进行任何操作之前解码整个对象(对象越大,这个过程的开销就越大)。

VS. Lua将路径设置为标量

VS. Lua将路径设置为标量延迟

VS. Lua从路径获取标量

VS. Lua从路径延迟得到标量

更多的图表

这些图表更多是相同的,但独立于每个文件(值):

与Lua - 100。json率

与Lua - 100。json平均延迟

与Lua pass-jsonsl-1。json率

与Lua pass-jsonsl-1。json平均延迟

与Lua - json解析器- 0000。json率

与Lua - json解析器- 0000。json延迟

与Lua pass-jsonsl-yahoo2。json率

与Lua pass-jsonsl-yahoo2。json延迟

与Lua pass-jsonsl-yelp。json率

与Lua pass-jsonsl-yelp。json延迟

生的结果

以下是CSV格式的基准测试的原始结果。

RedisJSON结果

标题、并发率,平均延迟,50.00%的瓷砖,瓷砖的90.00%,95.00%的瓷砖,瓷砖的99.00%,99.50%的瓷砖,瓷砖100.00%(平),1,22128.12,0.04,0.04,0.04,0.05,0.05,0.05,1.83(平),2,54641.13,0.04,0.03,0.05,0.05,0.06,0.07,2.14(平),4,76000.18,0.05,0.05,0.07,0.07,0.09,0.10,2.10(平),8,106750.99,0.07,0.07,0.10,0.11,0.14,0.16,2.99(平),12日,111297.33,0.11,0.10,0.15,0.16,0.20,0.22,6.81(平),16日,116292.19,0.14,0.13,0.19,0.21,0.27,0.33,7.50(平),20日,110622.82,0.18,0.17,0.24,0.27,0.38,0.47,12.21(平),24日,107468.51,0.22,0.20,0.31,0.38,0.58,0.71,13.86(平),28日,102827.35,0.27,0.25,0.38,0.44,0.66,0.79,12.87(平),32岁,105733.51,0.30,0.28,0.42,0.50,0.79,0.97,10.56(平),36岁,102046.43,0.35,0.33,0.48,0.56,0.90,1.13,14.66 JSON。{关键}。{空字符串大小:2 B},16,80276.63,0.20,0.18,0.28,0.32,0.41,0.45,6.48 JSON。}{关键。,16日,92191.23,0.17,0.16,0.24,0.27,0.34,0.38,9.80 JSON。{关键}。{- 100。json大小:380 B},16,41512.77,0.38,0.35,0.50,0.62,0.81,0.86,9.56 json。}{关键。,16日,48374.10,0.33,0.29,0.47,0.56,0.72,0.79,9.36 JSON。GET {key} sclr,16,94801.23,0.17,0.15,0.24,0.27,0.35,0.39,13.21 JSON。SET {key} sclr 1,16,82032.08,0.19,0.18,0.27,0.31,0.40,0.44,8.97 JSON。{关键}sub_doc, 16日,81633.51,0.19,0.18,0.27,0.32,0.43,0.49,9.88 JSON。GET {key} sub_doc.sclr,16,95052.35,0.17,0.15,0.24,0.27,0.35,0.39,7.39 JSON。GET {key} array_of_docs,16,68223.05,0.23,0.22,0.29,0.31,0.44,0.50,8.84 JSON.GET {key} array_of_docs[1],16,76390.57,0.21,0.19,0.30,0.34,0.44,0.49,9.99 JSON.GET {key} array_of_docs[1].sclr,16,90202.13,0.18,0.16,0.25,0.29,0.36,0.39,7.87 JSON.SET {key} . {pass-jsonsl-1.json size: 1.4 kB},16,16117.11,0.99,0.91,1.22,1.55,2.17,2.35,9.27 JSON.GET {key} .,16,15193.51,1.05,0.94,1.41,1.75,2.33,2.42,7.19 JSON.GET {key} [0],16,78198.90,0.20,0.19,0.29,0.33,0.42,0.47,10.87 "JSON.SET {key} [0] ""foo""",16,80156.90,0.20,0.18,0.28,0.32,0.40,0.44,12.03 JSON.GET {key} [7],16,99013.98,0.16,0.15,0.23,0.26,0.34,0.38,7.67 JSON.GET {key} [8].zero,16,90562.19,0.17,0.16,0.25,0.28,0.35,0.38,7.03 JSON.SET {key} . {pass-json-parser-0000.json size: 3.5 kB},16,14239.25,1.12,1.06,1.21,1.48,2.35,2.59,11.91 JSON.GET {key} .,16,8366.31,1.91,1.86,2.00,2.04,2.92,3.51,12.92 "JSON.GET {key} [""web-app""].servlet",16,9339.90,1.71,1.68,1.74,1.78,2.68,3.26,10.47 "JSON.GET {key} [""web-app""].servlet[0]",16,13374.88,1.19,1.07,1.54,1.95,2.69,2.82,12.15 "JSON.GET {key} [""web-app""].servlet[0][""servlet-name""]",16,81267.36,0.20,0.18,0.28,0.31,0.38,0.42,9.67 "JSON.SET {key} [""web-app""].servlet[0][""servlet-name""] ""bar""",16,79955.04,0.20,0.18,0.27,0.33,0.42,0.46,6.72 JSON.SET {key} . {pass-jsonsl.yahoo2-json size: 18 kB},16,3394.07,4.71,4.62,4.72,4.79,7.35,9.03,17.78 JSON.GET {key} .,16,891.46,17.92,17.33,17.56,20.12,31.77,42.87,66.64 JSON.SET {key} ResultSet.totalResultsAvailable 1,16,75513.03,0.21,0.19,0.30,0.34,0.42,0.46,9.21 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

Lua使用cjson

json-set-root。Lua空字符串,16,86817.84,0.18,0.17,0.26,0.31,0.39,0.42,9.36 json-set-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 json-get-root.lua,16,77922.14,0.20,0.18,0.30,0.34,0.66,0.86,8.71 json-get-path。lua 0, 16日,38162.83,0.42,0.40,0.49,0.59,0.88,0.96,6.16”json-set-path。lua 0 ""foo""",16,21205.52,0.75,0.70,0.84,1.07,1.60,1.74,5.77 json-get-path.lua 7,16,37254.89,0.43,0.39,0.55,0.69,0.92,0.98,10.24 json-get-path.lua 8 zero,16,33772.43,0.47,0.43,0.63,0.77,1.01,1.09,7.89 json-set-root.lua pass-json-parser-0000.json,16,76314.18,0.21,0.19,0.29,0.33,0.41,0.44,8.16 json-get-root.lua,16,65177.87,0.24,0.21,0.35,0.42,0.89,1.01,9.02 json-get-path.lua web-app servlet,16,15938.62,1.00,0.88,1.45,1.71,2.11,2.20,8.07 json-get-path.lua web-app servlet 0,16,19469.27,0.82,0.78,0.90,1.07,1.67,1.84,7.59 json-get-path.lua web-app servlet 0 servlet-name,16,24694.26,0.65,0.63,0.71,0.74,1.07,1.31,8.60 "json-set-path.lua web-app servlet 0 servlet-name ""bar""",16,16555.74,0.96,0.92,1.05,1.25,1.98,2.20,9.08 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

Lua使用cmsgpack

msgpack-set-root。msgpack-set-root. Lua空字符串,16,82592.66,0.19,0.18,0.27,0.31,0.38,0.42,10.18 msgpack-set-root. Luamsgpack-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 msgpack-get-root.lua,16,26045.44,0.61,0.58,0.68,0.83,1.28,1.42,8.56 "msgpack-set-path。lua 0”“foo”“”,16日,29813.56,0.53,0.49,0.67,0.83,1.15,1.22,6.82 msgpack-get-path。lua 0, 16日,44827.58,0.36,0.32,0.48,0.58,0.76,0.81,9.19 msgpack-get-path。lua 7日,16日,47529.14,0.33,0.31,0.42,0.53,0.73,0.79,7.47 msgpack-get-path。Lua 8 0,16,44442.72,0.36,0.33,0.45,0.56,0.77,0.85,8.11 msgpack-set-root。Lua pass-json-parser-0000.json,16,19585.82,0.81,0.78,0.85,1.05,1.66,1.86,4.33 msgpack-get-root.lua,16,19014.08,0.84,0.73,1.23,1.45,1.76,1.84,13.52 msgpack-get-path。Lua web-app servlet,16,18992.61,0.84,0.73,1.23,1.45,1.75,1.82,8.19 msgpack-get-path。lua web-app servlet 0,16,24328.78,0.66,0.64,0.73,0.77,1.15,1.34,8.81 msgpack-get-path.lua web-app servlet 0 servlet-name,16,31012.81,0.51,0.49,0.57,0.65,1.02,1.13,8.11 "msgpack-set-path.lua web-app servlet 0 servlet-name ""bar""",16,20388.54,0.78,0.73,0.88,1.08,1.63,1.78,7.22 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
Baidu