在插入

时间:2016-12-15 15:53:52

标签: performance postgresql redis benchmarking

我目前正在开发一个项目,我们考虑将Redis作为数据库切换。我们数据的性质非常简单,似乎适合Redis。 没有Redis的经验,我做了一个非常小的基准测试,在插入性能方面将它与PostgreSQL进行比较(这对我们很重要)。

我在一个简单的模式(address [key], timestamp, value)中创建了一个带有200000个INSERT语句的.sql文件。插入花了大约6秒钟。

对于Redis,每个200000条记录都插入:

HSET data:address timestamp <VALUE>
HSET data:address value <VALUE>

使用time redis-cli < insert_data.redis将所有内容转储到Redis中需要16秒。 我意识到这个'基准'是非常基本的,但是我错过了一些能让PostgreSQL脱颖而出的东西吗?我无法想象Redis实际上插入速度较慢。

1 个答案:

答案 0 :(得分:3)

这个结果是合乎逻辑的。要了解基准测试的结果,了解系统触发的操作非常重要。

Redis和PostgreSQL客户端都与其各自的服务器同步工作。对于每个语句,它们在处理下一个语句之前发送查询并等待回复。

在这样的音量上,很多东西都会在内存中发生(即使使用PostgreSQL)。此外,这里没有并发性。因此,操作的成本不是由I / O或索引控制,而是由客户端和服务器之间交换的往返。

现在,每次测试会产生多少次往返?

使用PostgreSQL,每个记录只有一个语句,导致200000次往返。使用Redis,每条记录有两个语句,导致40万次往返。此外,Redis往返系统地包含您的架构的关键字(数据,时间戳,值),并且每个记录发送两次地址。因此,Redis测试可以交换更多数据。

客户端软件解析输入文件的方式也可能有所不同。

要使用redis-cli改善你的结果,你可以使用命令HMSET每个记录只发送一个语句。

HSET data:address timestamp <VALUE>
HSET data:address value <VALUE>

变为:

HMSET data:address timestamp <VALUE> value <VALUE>

但这里真正的好处是使用pipelining。不幸的是,你不能使用redis-cli,除非依赖--pipe选项。对于此选项,您必须生成实际的Redis协议而不是文本命令。这就是为什么用“cat data.txt | redis-cli --pipe”进行测试无法正常工作的原因。从简单的shell命令生成Redis protocol并不方便。

对于这样的基准测试,我强烈建议您使用自己的客户端程序而不是redis-cli。即使是用Python,Ruby或Javascript编写的东西,也会在使用流水线时产生有趣的性能。