背景
Redis 作为一款纯内存的 Key-Value 存储,以其低延迟、高吞吐的特点,广泛应用于实时数据处理场景。然而,在实际使用中,Redis 存在两个主要痛点:
为了解决这些问题,市场上出现了很多持久化 Redis 的替代产品,例如 Pika、Kvrocks,云厂商也推出了类似产品,如阿里 Tair 和华为 Gemini。这些产品通常使用 RocksDB 等持久化 KV 存储作为底层存储,同时封装了与 Redis 兼容的计算引擎,来将 Redis 命令映射为 KV 接口。通过支持 SSD 存储,这类产品有效地降低了大内存的成本。但与此同时,由于持久化 Redis 需要与底层 KV 进行同步交互,受限于底层 KV 读写放大及合并压缩 (Compaction) 的影响,相比于 Redis,性能有所下降,延迟波动较大。
EloqKV 是一款全新架构的 Redis 兼容,支持事务的分布式 Key-Value 数据库,不同于 Pika 等产品,EloqKV 采用数据基层架构,实现了和底层 RocksDB 等 KV 存储的异步交互。这一方面降低了读写延时,因为数据基层是纯内存的,EloqKV 可以像 Redis 一样,直接操作内存对象。另一方面增加了灵活性,用户可以自由选择底层 KV 存储的类型:RocksDB,分布式 Cassandra 和云原生的 KV Serverless 服务。用户也可以自由控制 EloqKV 内存层和底层 KV 存储的交互频率,可以每 10 秒做一次 checkpoint,也可以每分钟做一次,所有的 checkpoint 都是增量的,只有变化的数据需要写入 KV 存储,如果同一个 Key 在 checkpoint 周期被更改了多次,只有最后一次需要写入到 KV 存储。这些优点,使得 EloqKV 在兼具热数据高性能读写的同时,支持将冷数据存储在 SSD,实现降本增效。
接下来,我们通过商品库存场景,进行 EloqKV 和 Pika 的性能评测。
实验
软硬件资源
服务器:1 台 32Core 虚机。
测试机:1 台 32Core 虚机。
操作系统:Ubuntu 24
EloqKV 版本:0.7.4
Pika 版本:3.5.4
测试工具:memtier-benchmark
参数调整
EloqKV 支持参数的自适应,用户可以基于{部署文档](https://www.eloqdata.com/EloqKV/install-from-binary),配置 EloqKV。注意,持久化 Redis 模式,需要打开`enable_data_store`选项,同时关闭 WAL(Write-Ahead Logging)。
#config.ini# set it to none to turn off persistent storage for all databasesenable_data_store=on# set it to none to turn off WAL for all databasesenable_wal=off
复制代码
基于 Pika 最佳实践调整 Pika 参数。其中,Pika 的网络通信在thread-num
对应线程中执行,而数据写入和删除操作由配置文件中thread-pool-size
控制的线程池中执行,用户可以根据自己的场景对这两个参数进行调整,如果客户端执行的是一些比较重的操作,可以适量将thread-pool-size
调大,一般情况下我们建议thread-pool-size = 2 * thread-num
。
#pike.conf# The number of threads for running Pika.# It's not recommended to set this value exceeds# the number of CPU cores on the deployment server.thread-num : 10# Size of the thread pool, The threads within this pool# are dedicated to handling user requests.thread-pool-size : 20# write_binlog [yes | no]write-binlog : no
复制代码
实验设计 I 库存增删的性能测试
首先,我们通过 Python 脚本初始化 1,000,000 条商品库存数据,包含产品描述、名称、价格和库存信息。脚本如下:
import redisimport randomimport string# ConfigurationHOST = '172.31.35.24' # Replace with your server's hostPORT = 6379 # Replace with your server's portDB = 0 # Database numberPASSWORD = None # If your server requires a passwordNUM_PRODUCTS = 1000000# Connect to Redis-compatible serverdef get_redis_connection(): return redis.Redis(host=HOST, port=PORT, db=DB, password=PASSWORD)def generate_random_string(length=10): return ''.join(random.choices(string.ascii_letters + string.digits, k=length))def initialize_products(): r = get_redis_connection() pipeline = r.pipeline() batch_size = 1000 # Adjust based on available memory for i in range(1, NUM_PRODUCTS + 1): product_key = f'product:{i}' product_data = { 'name': f'Product {i}', 'description': generate_random_string(50), 'price': f"{random.uniform(10, 1000):.2f}", 'quantity': str(random.randint(1, 100)) } pipeline.hmset(product_key, product_data) # Execute the pipeline every 'batch_size' commands if i % batch_size == 0: pipeline.execute() print(f'Inserted {i} products') # Execute any remaining commands if NUM_PRODUCTS % batch_size != 0: pipeline.execute() print(f'Inserted {NUM_PRODUCTS} products') print('Initialization complete.')if __name__ == "__main__": initialize_products()
复制代码
在 EloqKV 和 Pika 中,每个产品使用 Hash 进行存储,包含产品描述,名称,价格和库存信息。
HGETALL product:21) "description"2) "5YDbvUZAMmKKyHLyBYrQt9gOvglRdVJ5psQQKUMs0NvZn7IxqX"3) "name"4) "Product 2"5) "price"6) "211.73"7) "quantity"8) "487"
复制代码
接下来使用memtier_benchmark
对库存增删操作进行模拟,增删通过HINCRBY
实现。实验输出包括吞吐量和不同分位延时(P50、P99、P999)的对比。我们分别测试 EloqKV 和 Pika 的性能。
需要指出的是,库存增删的实际场景并不能简单使用HINCRBY
,其无法保证原子性,也无法做库存量检查,比如购买的机票只剩 3 张,但是订单一次性购买 4 张机票,是应该被拒绝的。该逻辑可以在 Redis 中使用 Lua 脚本实现,但很遗憾,Pika 并不支持加载 Lua 脚本(SCRIPT LOAD
)。EloqKV 原生支持 Lua 脚本,我们会在第二个实验基于 Lua 实现库存增删,并对比 EloqKV 和 Redis 的性能。
结果
EloqKV:在 128 并发下,QPS 达到 93 万,P999 延时为 310 微秒。
memtier_benchmark --key-minimum=1 --key-maximum=1000000 -t 16 -c 8 --test-time=10 --hide-histogram -h 172.31.35.24 --key-prefix="product:" -p 6389 --command "HINCRBY __key__ quantity 1" --command-ratio 1 --command "HINCRBY __key__ quantity -1" --command-ratio 1ALL STATS===================================================================================================Type Ops/sec Avg. Latency p50 Latency p99 Latency p99.9 Latency KB/sec---------------------------------------------------------------------------------------------------Hincrbys 466653.20 0.13709 0.13500 0.23900 0.31100 29551.92Hincrbys 466647.70 0.13717 0.13500 0.23900 0.31100 30448.13Totals 933300.90 0.13713 0.13500 0.23900 0.31100 120000.11
复制代码
Pika:在 128 并发下,QPS 为 41 万,P999 延时为 720 微秒。
memtier_benchmark --key-minimum=1 --key-maximum=1000000 -t 16 -c 8 --test-time=10 --hide-histogram -h 172.31.35.24 --key-prefix="product:" -p 9221 --command "HINCRBY __key__ quantity 1" --command-ratio 1 --command "HINCRBY __key__ quantity -1" --command-ratio 1ALL STATS===================================================================================================Type Ops/sec Avg. Latency p50 Latency p99 Latency p99.9 Latency KB/sec---------------------------------------------------------------------------------------------------Hincrbys 206581.93 0.30976 0.31100 0.43100 0.71900 13092.11Hincrbys 206576.93 0.30977 0.31100 0.43100 0.72700 13485.06Totals 413158.85 0.30977 0.31100 0.43100 0.72700 53154.33
复制代码
从结果可以看出,EloqKV 在处理大规模并发下的库存增删操作时,性能显著优于 Pika,尤其在长尾延迟 (P999) 方面,EloqKV 的表现更加稳定,在高吞吐的同时仍保持较低的延迟。
上面的实验中,Pika 和 EloqKV 均未开启 fsync,因此在极端情况下存在丢失数据的风险。笔者未能找到 Pika 开启 fsync 的相关配置参数,但 Kvrocks 支持此选项。针对需要数据零丢失的场景,感兴趣的读者可以参考: https://www.eloqdata.com/blog/2024/08/25/benchmark-txlog,其中详细介绍了 EloqKV 和 Kvrocks 在开启 fsync 参数后的性能对比。
实验设计 II 复杂业务逻辑的 Lua 脚本支持
本实验中,我们通过 Lua 脚本实现了更加复杂的库存增删逻辑。当库存量不足以满足订单请求时,拒绝该操作。
由于 Pika 不支持Lua Script Load
操作,我们选取 Redis 和 EloqKV 进行性能评测。
如下是 Lua 脚本:
-- adjust_stock.lua-- KEYS[1]: The product key (e.g., "product:1")-- ARGV[1]: The quantity to adjust (negative for decrement, positive for increment)local stock = tonumber(redis.call('HGET', KEYS[1], 'quantity'))local order_qty = tonumber(ARGV[1])if not stock then return {err = "Product not found"}endif (stock + order_qty) < 0 then return -1 -- Indicate insufficient stockelse local new_stock = redis.call('HINCRBY', KEYS[1], 'quantity', order_qty) return new_stockend
复制代码
首先,同实验 I,执行python init.py
加载数据。
接下来将adjust_stock.lua
加载到 EloqKV 和 Redis 中
redis-cli -h 172.31.35.24 -p 6379 SCRIPT LOAD "$(cat adjust_stock.lua)""760b9086bca7fe8923163f284c917f71e572c3b9"
复制代码
最后分别执行memtier_benchmark
, 使用EVALSHA
执行 LUA 脚本,分别执行增删库存。
memtier_benchmark --distinct-client-seed --randomize --key-minimum=1 --key-maximum=1000000 -t 32 -c 1 --test-time=30 --hide-histogram -h 172.31.35.24 --key-prefix="product:" -p 6379 --command "EVALSHA 760b9086bca7fe8923163f284c917f71e572c3b9 1 __key__ 1" --command-ratio 1 --command "EVALSHA 760b9086bca7fe8923163f284c917f71e572c3b9 1 __key__ -1" --command-ratio 1
复制代码
结果
EloqKV 的结果如下:32 并发下,QPS 超过 10 万,P999 延时小于 1 毫秒。
ALL STATS===================================================================================================Type Ops/sec Avg. Latency p50 Latency p99 Latency p99.9 Latency KB/sec---------------------------------------------------------------------------------------------------Evalshas 54326.68 0.24149 0.22300 0.60700 0.84700 5508.59Evalshas 54323.08 0.24102 0.22300 0.60700 0.85500 5559.17Totals 108649.75 0.24126 0.22300 0.60700 0.85500 22135.51
复制代码
Redis 的结果如下:32 并发下,吞吐量仅为 8 千 QPS,延时显著高于 EloqKV。
ALL STATS===================================================================================================Type Ops/sec Avg. Latency p50 Latency p99 Latency p99.9 Latency KB/sec---------------------------------------------------------------------------------------------------Evalshas 4060.63 3.93665 4.12700 14.27100 15.80700 411.73Evalshas 4058.03 3.94788 4.12700 14.20700 15.80700 415.28Totals 8118.66 3.94227 4.12700 14.20700 15.80700 1654.04
复制代码
从结果来看,EloqKV 的多线程架构能够在复杂业务逻辑场景下,显著提升吞吐量并减少延迟,而 Redis 的单线程模型限制了其处理复杂 Lua 脚本的能力,尤其在高并发场景中,吞吐量显著下降。
结论
通过本次评测,EloqKV 在多个核心性能指标上展现了优异的表现:
在高并发的商品库存增删场景下,EloqKV 显著优于 Pika,尤其是在长尾延迟 (P999) 方面表现稳定,适合需要低延迟的高吞吐场景。
在复杂业务逻辑支持方面,EloqKV 的多线程架构使其在执行 Lua 脚本时表现更好,而 Redis 的单线程模型在高并发环境下存在明显的性能瓶颈。(Pika 不支持 Lua Load Script)
EloqKV 凭借其灵活的架构设计和高性能表现,特别适合处理对实时性、低延迟、高吞吐量要求严格的应用场景,如电商平台、库存管理等高频业务。
如果您对 EloqKV 感兴趣,欢迎访问 EloqKV 官网 https://www.eloqdata.com/download ,了解更多详情并下载试用。您可以根据官方文档进行部署,体验其在高并发、低延迟场景中的卓越表现。
本文转载自“帅萌的杂谈铺”
评论