Redis性能调优

ak2*_*ak2 18 performance caching web-applications redis

我们正在运行一个Web应用程序,并从memcached切换到redis(2.4)进行缓存.现在我们对redis性能有些失望.Redis在同一台服务器上运行,我们只使用非常简单的GET和SET操作.在一些大量使用缓存值的请求中,我们对redis有多达300个GET请求,但这些请求最多需要150毫秒.我们有大约200,000个活动密钥,每秒大约有1,000个redis请求.磁盘io,ram或cpu没有问题.由于我们现有的代码,我们不能简单地将redis请求组合在一起.Memcached的速度提高了约4倍.我们对redis的看法是,我们不需要任何缓存升温,并且可以在将来使用更高级的数据存储功能.我们期望redis执行类似于memcached.所以也许我们错过了配置中的一些东西,这基本上是默认配置.

你知道redis性能调优的最佳实践吗?

Did*_*zia 26

首先,您可能需要阅读Redis基准页面.它提供了检查调整Redis的要点的一个很好的总结.

即使假设您不使用流水线操作,150毫秒内的300 GET也不是那么有效.这意味着平均延迟为500 us.但是,它实际上取决于对象的大小.更大的对象,更多的延迟.在我非常老的2 GHz AMD盒子上,我可以测量150个小物件的延迟(几个字节).

要快速检查Redis实例的平均延迟,您可以使用:

$ redis-cli --latency
Run Code Online (Sandbox Code Playgroud)

请务必使用最新的Redis版本(而非2.4)来获取此选项.注意:2.4现在已经很老了,使用Redis 2.6 - 如果需要的话编译你自己的Redis版本,它真的很简单.

要快速运行基准来研究延迟,您可以启动:

$ redis-benchmark -q -n 10000 -c 1 -d average_size_of_your_objects_in_bytes
Run Code Online (Sandbox Code Playgroud)

它以独特的连接运行,没有流水线,因此延迟可以从吞吐量中推断出来.尝试将这些基准测试的结果与您的应用程序测量的数据进行比较.

您可能需要检查以下几点:

  • 您使用哪个Redis客户端库?用哪种开发语言?对于某些脚本语言,您需要安装hiredis模块以获得高效的客户端.
  • 你的机器是VM吗?在哪个操作系统?
  • 与Redis的连接是否持久存在?(即,您不应该在应用服务器的每个HTTP请求上连接/断开连接).

为什么memcached会更好?好吧,单个memcached实例肯定更具可伸缩性,并且可能比单个Redis实例更具响应性,因为它可能在多个线程上运行.Redis很快,但是单线程 - 所有命令的执行都是序列化的.因此,当一个命令正在进行连接时,所有其他客户端都必须等待 - 给定命令的延迟时间也会影响所有挂起的命令.通常,在低吞吐量下,性能可比.

在1000 q/s(Redis或memcached标准的低吞吐量)下,我会说你的问题更可能是客户端(即选择客户端库,连接/断开等等),而不是Redis服务器本身.

最后我要提一下,如果您为每个HTTP请求生成一些Redis查询,请考虑尽可能将发送给Redis的命令流水线化.这是开发高效Redis应用程序的关键点.

如果您的应用程序服务器与Redis位于同一个框中,您还可以使用unix域套接字而不是TCP环回来连接到Redis.它略微提高了性能(不使用流水线时,吞吐量增加了50%).