首先,您可能想阅读Redis 基准页面。它很好地总结了调整 Redis 的要点。
即使假设您不使用流水线,150 毫秒内 300 次 GET 也不是那么有效。这意味着平均延迟为 500 us。但是,它实际上取决于对象的大小。更大的对象,更多的延迟。在我非常旧的 2 GHz AMD 机器上,我可以测量小对象(几个字节)的 150 us 延迟。
要快速检查 Redis 实例的平均延迟,您可以使用:
$ redis-cli --latency
请务必使用最新的 Redis 版本(不是 2.4)来获取此选项。注意:现在 2.4 已经很老了,使用 Redis 2.6 - 如果需要,编译你自己的 Redis 版本,真的很简单。
要快速运行基准测试来研究延迟,您可以启动:
$ redis-benchmark -q -n 10000 -c 1 -d average_size_of_your_objects_in_bytes
它以独特的连接运行,没有流水线,因此可以从吞吐量中推断出延迟。尝试将这些基准测试的结果与您的应用程序测量的数据进行比较。
您可能需要检查以下几点:
- 您使用哪个 Redis 客户端库?使用哪种开发语言?对于某些脚本语言,您需要安装hiredis 模块以获得高效的客户端。
- 你的机器是虚拟机吗?在哪个操作系统上?
- 与 Redis 的连接是否持久?(即您不应该在应用服务器的每个 HTTP 请求上连接/断开连接)。
为什么使用 memcached 更好?好吧,单个 memcached 实例肯定更具可扩展性,并且可能比单个 Redis 实例响应更快,因为它可以在多个线程上运行。Redis 速度很快,但是是单线程的——所有命令的执行都是序列化的。因此,当一个命令正在进行连接时,所有其他客户端都必须等待 - 给定命令的不良延迟也会影响所有待处理的命令。通常,在低吞吐量下,性能是相当的。
在 1000 q/s(Redis 或 memcached 标准的低吞吐量),我会说您的问题更有可能出现在客户端(即客户端库的选择、连接/断开连接等......),而不是Redis 服务器本身。
最后我要提一下,如果您为每个 HTTP 请求生成多个 Redis 查询,请考虑尽可能将您发送到 Redis 的命令流水线化。开发高效的 Redis 应用程序确实是一个关键点。
如果您的应用程序服务器与 Redis 在同一个机器上,您还可以使用 unix 域套接字而不是 TCP 环回连接到 Redis。它略微提高了性能(不使用流水线时吞吐量提高了 50%)。