use*_*009 2 postgresql performance benchmarking redis
我目前正在开展一个项目,我们考虑切换到 Redis 作为数据库。我们的数据性质非常简单,似乎适合 Redis。由于没有使用 Redis 的经验,我做了一个非常小的基准测试,将其与 PostgreSQL 的插入性能进行比较(这对我们来说很重要)。
我创建了一个 .sql 文件,其中包含 200000 个 INSERT 语句到一个简单的模式中(address [key], timestamp, value)。插入大约需要 6 秒。
对于 Redis,200000 条记录中的每条记录都是通过以下方式插入的:
HSET data:address timestamp <VALUE>
HSET data:address value <VALUE>
Run Code Online (Sandbox Code Playgroud)
将所有内容转储到 Redistime redis-cli < insert_data.redis需要 16 秒。我意识到这个“基准”是非常基本的,但是我是否缺少一些让 PostgreSQL 脱颖而出的东西?我真的无法想象 Redis 在插入方面实际上更慢。
这个结果是符合逻辑的。要了解基准测试的结果,了解系统上触发的操作非常重要。
Redis 和 PostgreSQL 客户端都与各自的服务器同步工作。对于每个语句,它们发送一个查询并等待回复,然后再处理下一个语句。
在这样的卷上,很多事情都发生在内存中(即使是 PostgreSQL)。此外,这里没有并发性。因此,操作的成本不是由 I/O 或索引决定的,而是由客户端和服务器之间交换的往返决定的。
现在,每个测试生成多少次往返?
使用 PostgreSQL,每条记录有一个语句,从而导致 200000 次往返。使用 Redis,每条记录有两个语句,从而产生 400000 次往返。此外,Redis 往返系统地包括架构的关键字(数据、时间戳、值),并且每个记录的地址发送两次。所以Redis测试交换了很多数据。
客户端软件解析输入文件的方式也可能存在差异。
为了改善 redis-cli 的结果,您可以使用命令HMSET每条记录仅发送一个语句。
HSET data:address timestamp <VALUE>
HSET data:address value <VALUE>
Run Code Online (Sandbox Code Playgroud)
变成:
HMSET data:address timestamp <VALUE> value <VALUE>
Run Code Online (Sandbox Code Playgroud)
但这里真正的好处是使用管道。不幸的是,你不能从 redis-cli 使用它,除非依赖 --pipe 选项。对于此选项,您必须生成实际的 Redis 协议而不是文本命令。这就是为什么您使用“cat data.txt | redis-cli --pipe”进行的测试无法工作。从简单的 shell 命令生成Redis 协议并不方便。
对于这样的基准测试,我强烈建议使用您自己的客户端程序而不是 redis-cli。如果使用管道技术,即使是用 Python、Ruby 或 Javascript 编写的东西也会产生有趣的性能。