我需要示例化一个数据库,其中读取尽可能快,因此我想到了DragonflyDB,根据他们的Benchmarks,它声称比redis快得多。它本质上是一个内存数据库,但设计于2022年,并且与Redis(和Memcached)共享几乎完全相同的API,我需要它来写/读哈希或集。
我为这样一个基准测试编写的代码如下(我将它分成几个块),设置为N_ITER = 10_000
:
const Redis = require("ioredis")
const redis = new Redis({
host: "localhost",
port: 6380,
password: "",
})
console.time("1")
const myRedisGetKeys = () =>
Promise.all(new Array(N_ITER).fill(1).map((_, i) => redis.get(i)))
myRedisGetKeys().then(_ => {
console.timeEnd("1")
})
字符串
输出为1: 142.473ms
。
const Redis = require("ioredis")
const dragonfly = new Redis({
host: "localhost",
port: 6379,
password: "",
})
console.time("2")
const myDragonflyGetKeys = () =>
Promise.all(new Array(N_ITER).fill(1).map((_, i) => dragonfly.get(i)))
myDragonflyGetKeys().then(_ => {
console.timeEnd("2")
})
型
输出为2: 728.216ms
。
你可能已经注意到了,Redis的阅读速度是Redis的5倍,我的方法有什么问题吗?
P.S.如果需要,我可以使用Python代码提供相同的结果,其中redis执行速度更快,但只有20%的因素。
1条答案
按热度按时间kninwzqo1#
您到底要测试/基准测试什么?
Dragonfly专为高工作负载而设计,特别是在并行处理多个请求(通常来自多个客户端)时。
我相信你的基准测试在Redis / Dragonfly响应之前就发送了一堆数据,这导致了流水线,在这种情况下,Redis和Dragonfly将具有相似的性能,事实上,在我尝试运行这个代码时,我得到了相似的数字。
如果您的生产工作负载类似(单个连接发出许多
get
操作,然后断开连接),您可能不一定能享受到Dragonfly的好处。如果您的生产工作负载不同(例如,在所有小时内发送流量,在低流量和高流量之间有一些波动),那么我建议您修改您的基准测试以匹配这一点,或者仅使用现有的基准测试工具(如Redis的memtier)