resp-benchmark is a benchmark tool for testing databases that support the RESP protocol, such as Redis, Valkey, and Tair. It offers both a command-line interface and a Python library.
Requires Python 3.8 or higher.
pip install resp-benchmarkresp-benchmark --helpfrom resp_benchmark import Benchmark
bm = Benchmark(host="127.0.0.1", port=6379)
bm.flushall()
bm.load_data(command="SET {key sequence 10000000} {value 64}", count=1000000, connections=128)
result = bm.bench("GET {key uniform 10000000}", seconds=3, connections=16)
print(result.qps, result.avg_latency_ms, result.p99_latency_ms)resp-benchmark supports custom test commands using placeholder syntax like SET {key uniform 10000000} {value 64} which means the SET command will have a key uniformly distributed in the range
0-10000000 and a value of 64 bytes.
Supported placeholders include:
{key uniform N}: Generates a random number between0andN-1. For example,{key uniform 100}might generatekey_0000000099.{key sequence N}: Sequentially generates from0toN-1, ensuring coverage during data loading. For example,{key sequence 100}generateskey_0000000000,key_0000000001, etc.{key zipfian N}: Generates according to a Zipfian distribution (exponent 1.03), simulating real-world key distribution.{value N}: Generates a random string of lengthNbytes. For example,{value 8}might generate92xsqdNg.{rand N}: Generates a random number between0andN-1. For example,{rand 100}might generate99.{range N W}: Generates a pair of random numbers within the range0toN-1, with a difference ofW, used for testing*range*commands. For example,{range 100 10}might generate89 99.
# Load data
resp-benchmark --load -P 10 -c 256 -n 10007000 "ZADD {key sequence 1000} {rand 70000} {key sequence 10007}"
# Benchmark ZSCORE
resp-benchmark -s 10 "ZSCORE {key uniform 1000} {key uniform 10007}"
# Benchmark ZRANGEBYSCORE
resp-benchmark -s 10 "ZRANGEBYSCORE {key uniform 1000} {range 70000 10}"redis-cli 'SCRIPT LOAD "return redis.call('\''SET'\'', KEYS[1], ARGV[1])"'
resp-benchmark -s 10 "EVALSHA d8f2fad9f8e86a53d2a6ebd960b33c4972cacc37 1 {key uniform 100000} {value 64}"When testing Redis with resp-benchmark and redis-benchmark, you might get different results due to:
- redis-benchmark always uses the same value when testing the set command, which does not trigger DB persistence and replication. In contrast, resp-benchmark uses
{value 64}to generate different data for each command. - redis-benchmark always uses the same primary key when testing list/set/zset/hash commands, while resp-benchmark generates different keys using placeholders like
{key uniform 10000000}. - In cluster mode, redis-benchmark sends requests to each node, but all requests target the same slot on every node.