文档

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位。
网络Tair实例为同专有网络(VPC)的ECS实例,且与Tair通过专有网络连接。
软件已安装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.5716.95129.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.940.4770.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.831.2212.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.6832.64965.311

总结

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