如何进行Redis性能优化?这一篇就够了

redis 是一款高性能的内存数据存储系统,它被广泛应用于各种实时数据处理场景 , 如缓存、消息队列、实时统计等 。为了最大化 Redis 的性能,我们应该针对具体应用场景,对其配置参数进行优化 。在本文中,我们将介绍一些优化 Redis 配置的技巧 , 以提高其性能 。
 
Redis慢在哪里?
  • 对 Redis 进行基准性能测试
例如 , 我的机器配置比较低,当延迟为 2ms 时,我就认为 Redis 变慢了 , 但是如果你的硬件配置比较高,那么在你的运行环境下 , 可能延迟是 0.5ms 时就可以认为 Redis 变慢了 。所以,你只有了解了你的 Redis 在生产环境服务器上的基准性能,才能进一步评估,当其延迟达到什么程度时,才认为 Redis 确实变慢了 。
为了避免业务服务器到 Redis 服务器之间的网络延迟,你需要直接在 Redis 服务器上测试实例的响应延迟情况 。执行以下命令,就可以测试出这个实例 60 秒内的最大响应延迟:
./redis-cli --intrinsic-latency 120Max latency so far: 17 microseconds.Max latency so far: 44 microseconds.Max latency so far: 94 microseconds.Max latency so far: 110 microseconds.Max latency so far: 119 microseconds.36481658 total runs (avg latency: 3.2893 microseconds / 3289.32 nanoseconds per run).Worst run took 36x longer than the average latency.从输出结果可以看到 , 这 60 秒内的最大响应延迟为 119 微秒(0.119毫秒) 。你还可以使用以下命令,查看一段时间内 Redis 的最小、最大、平均访问延迟 。
$ redis-cli -h 127.0.0.1 -p 6379 --latency-history -i 1min: 0, max: 1, avg: 0.13 (100 samples) -- 1.01 seconds rangemin: 0, max: 1, avg: 0.12 (99 samples) -- 1.01 seconds rangemin: 0, max: 1, avg: 0.13 (99 samples) -- 1.01 seconds rangemin: 0, max: 1, avg: 0.10 (99 samples) -- 1.01 seconds rangemin: 0, max: 1, avg: 0.13 (98 samples) -- 1.00 seconds rangemin: 0, max: 1, avg: 0.08 (99 samples) -- 1.01 seconds range如果你观察到的 Redis 运行时延迟是其基线性能的 2 倍及以上,就可以认定 Redis 变慢了 。?网络对 Redis 性能的影响,一个简单的方法是用 iPerf 这样的工具测试网络极限带宽 。
服务器端# iperf -s -p 12345 -i 1 -Miperf: option requires an argument -- M------------------------------------------------------------Server listening on TCP port 12345TCP window size: 4.00 MByte (default)------------------------------------------------------------[4] local 172.20.0.113 port 12345 connected with 172.20.0.114 port 56796[ ID] IntervalTransferBandwidth[4]0.0- 1.0 sec614 MBytes5.15 Gbits/sec[4]1.0- 2.0 sec622 MBytes5.21 Gbits/sec[4]2.0- 3.0 sec647 MBytes5.42 Gbits/sec[4]3.0- 4.0 sec644 MBytes5.40 Gbits/sec[4]4.0- 5.0 sec651 MBytes5.46 Gbits/sec[4]5.0- 6.0 sec652 MBytes5.47 Gbits/sec[4]6.0- 7.0 sec669 MBytes5.61 Gbits/sec[4]7.0- 8.0 sec670 MBytes5.62 Gbits/sec[4]8.0- 9.0 sec667 MBytes5.59 Gbits/sec[4]9.0-10.0 sec667 MBytes5.60 Gbits/sec[4]0.0-10.0 sec6.35 GBytes5.45 Gbits/sec客户端# iperf -c 服务器端IP -p 12345 -i 1 -t 10 -w 20K------------------------------------------------------------Client connecting to 172.20.0.113, TCP port 12345TCP window size: 40.0 KByte (WARNING: requested 20.0 KByte)------------------------------------------------------------[3] local 172.20.0.114 port 56796 connected with 172.20.0.113 port 12345[ ID] IntervalTransferBandwidth[3]0.0- 1.0 sec614 MBytes5.15 Gbits/sec[3]1.0- 2.0 sec622 MBytes5.21 Gbits/sec[3]2.0- 3.0 sec646 MBytes5.42 Gbits/sec[3]3.0- 4.0 sec644 MBytes5.40 Gbits/sec[3]4.0- 5.0 sec651 MBytes5.46 Gbits/sec[3]5.0- 6.0 sec652 MBytes5.47 Gbits/sec[3]6.0- 7.0 sec669 MBytes5.61 Gbits/sec[3]7.0- 8.0 sec670 MBytes5.62 Gbits/sec[3]8.0- 9.0 sec667 MBytes5.59 Gbits/sec[3]9.0-10.0 sec668 MBytes5.60 Gbits/sec[3]0.0-10.0 sec6.35 GBytes5.45 Gbits/sec 
2.使用复杂度过高的命令
首先 , 第一步,你需要去查看一下 Redis 的慢日志(slowlog) 。
Redis 提供了慢日志命令的统计功能 , 它记录了有哪些命令在执行时耗时比较久 。
查看 Redis 慢日志之前,你需要设置慢日志的阈值 。例如,设置慢日志的阈值为 5 毫秒,并且保留最近 500 条慢日志记录:
# 命令执行耗时超过 5 毫秒,记录慢日志CONFIG SET slowlog-log-slower-than 5000# 只保留最近 500 条慢日志CONFIG SET slowlog-max-len 500 
1)经常使用 O(N) 以上复杂度的命令,例如 SORT、SUNION、ZUNIONSTORE 聚合类命令 。
2)使用 O(N) 复杂度的命令,但 N 的值非常大 。
第一种情况导致变慢的原因在于,Redis 在操作内存数据时,时间复杂度过高,要花费更多的 CPU 资源 。
第二种情况导致变慢的原因在于 , Redis 一次需要返回给客户端的数据过多,更多时间花费在数据协议的组装和网络传输过程中 。


推荐阅读