TairDoc性能白皮书

TairDoc是一种文档类型的数据结构,类似RedisJSON模块,支持JSON标准。本文介绍TairDoc的性能测试方法及测试结果。

TairDoc的主要特性如下:

  • 完整地支持JSON标准。

  • 部分兼容JSONPath RFC draft-4标准。

    说明

    仅JSON.GET命令支持。

  • 完整地支持JSONPointer语法。

  • 文档作为二进制树存储,可以快速访问JSON数据的子元素。

  • 支持JSON到XML或YAML格式的转换。

更多信息请参见Doc

测试说明

数据库测试环境

测试环境信息

说明

地域和可用区

华北3(张家口)地域,可用区A。

存储介质

内存型(兼容Redis 6.0)。

实例版本

6.2.4.6

实例架构

标准版(双副本)架构,不启用集群,详情请参见标准架构

实例规格

由于测试结果受规格影响较小,本次测试以4 GB(tair.rdb.4g)规格为例。

客户端测试环境

测试环境信息

说明

部署压测工具的设备

云服务器ECS实例,规格为ecs.c6e.8xlarge,详情请参见实例规格族

地域和可用区

华北3(张家口)地域,可用区A。

操作系统

Alibaba Cloud Linux 3.2104 LTS 64位。

网络

与实例为同专有网络(VPC)的ECS实例,且与实例通过专有网络连接。

软件

已安装Python 3.7及以上版本,并已安装python-redis模块。

测试数据

本文使用GitHub公开数据update-center.json,大小为521 KB。

测试工具

使用开源Redis的redis-benchmark工具进行压测。

测试步骤与测试结果

  1. 登录ECS实例,执行如下命令,下载测试数据至本地。

    wget https://raw.githubusercontent.com/chadaustin/sajson/master/testdata/update-center.json
  2. 在同目录下,将如下脚本代码保存为insert.py。

    import redis
    import json
    
    host = "r-bp1s02ae14mr****.redis.rds.aliyuncs.com"
    port = 6379
    password = "testaccount:Rp829dlwa"
    
    r = redis.Redis(host=host, port=port, password=password)
    with open("update-center.json", "r") as f:
              content = f.read()
    json = json.loads(content)
    ret = r.json().set("key", ".", json);
    print(f"insert json to {host}, ret is {ret}")
    说明

    参数说明:

    • hostTair实例专有网络连接地址。

    • portTair实例的端口号,默认为6379,您无需修改。

    • passwordTair实例的账号与密码。如果使用通过控制台创建的账号连接Tair,连接密码格式为<user>:<password>。例如,账号名为testaccount,密码为Rp829dlwa,则连接Tair时的密码为testaccount:Rp829dlwa

  3. 执行如下命令,将update-center.json数据写入Tair实例中。

    python3 insert.py

    返回如下结果,表示成功插入。

    insert json to 127.0.0.1, ret is True
  4. 执行测试命令。

    • 查询整个JSON

      测试命令示例:

      ./src/redis-benchmark -h r-bp1s02ae14mr****.redis.rds.aliyuncs.com-p 6379 -a testaccount:Rp829dlwa-c 10 --threads 10 -n 10000 JSON.GET key

      测试结果:

      数据库CPU使用率

      QPS(次/秒)

      Average Latency(毫秒)

      99th Percentile Latency(毫秒)

      20%

      569.57

      16.951

      29.279

    • 查询JSON子元素

      测试命令示例:

      ./src/redis-benchmark -h r-bp1s02ae14mr****.redis.rds.aliyuncs.com-p 6379 -a testaccount:Rp829dlwa-c 10 --threads 10 -n 10000 JSON.GET key $.plugins.ant.developers[0].developerId

      测试结果:

      数据库CPU使用率

      QPS(次/秒)

      Average Latency(毫秒)

      99th Percentile Latency(毫秒)

      92%

      205879.94

      0.477

      0.943

    • 修改JSON子元素

      测试命令示例:

      ./src/redis-benchmark -h r-bp1s02ae14mr****.redis.rds.aliyuncs.com-p 6379 -a testaccount:Rp829dlwa-c 10 --threads 10 -n 10000 JSON.SET key .plugins.ant.developers[0].developerId '"developer_foo"'

      测试结果:

      数据库CPU使用率

      QPS(次/秒)

      Average Latency(毫秒)

      99th Percentile Latency(毫秒)

      95%

      79865.83

      1.221

      2.639

    • 复杂查询(Filter)

      测试命令示例:

      ./src/redis-benchmark -h r-bp1s02ae14mr****.redis.rds.aliyuncs.com-p 6379 -a testaccount:Rp829dlwa-c 10 --threads 10 -n 10000 JSON.GET key '$.plugins[?(@.scm=="github.com" && @.releaseTimestamp>"2013-01-01")].name'

      测试结果:

      数据库CPU使用率

      QPS(次/秒)

      Average Latency(毫秒)

      99th Percentile Latency(毫秒)

      30%

      3043.68

      32.649

      65.311

总结

本文详述了TairDoc的性能测试方法及测试示例,TairDoc通过自行设计的JSON Tree结构以及自研的JSONPath解析和执行框架,在更新和查询上均有不错的性能。