redis性能拾遗

因为考虑用redis做秒杀业务,所以对redis做了一次性能压测,特把重要数据记录下来备忘。

压测工具

官方自带的redis-benchmark,可以满足各式各样的压测需求。

环境准备

在3套环境分别实施压测,

  • 云虚拟机:E3处理器,主频2.4
  • 物理服务器:E5处理器,主频2.5
  • 高性能笔记本:7代i7处理器,睿频4.2

压测参数

  • k-v整体大小20字节
  • 长连接

普通GET/SET

命令(随机set,长连接,非Pipeline):

redis-benchmark  -t set -r 100000 -n 1000000

  • 虚拟机:13万/s
  • 物理机:16万/s
  • 笔记本:22万/s

基本延迟均在2毫秒左右。

以虚拟机为例,特别追加测试用例:

  • 开启pipeline后,性能为30万/s
  • 关闭pipeline,使用短连接,性能为3万/s

redis单线程,主要CPU除了操作内存数据结构,主要花费在网络IO。

短连接需要大量accept消耗(包括内核CPU时间),非pipeline需要大量小包read消耗。

执行lua脚本

命令(4次SET+1次GET,长连接,非pipeline):

./redis-benchmark -n 1000000 EVALSHA “a5f4fc27664473ff224232cf7ec01bd172640e26” 0

  • 虚拟机:5万/s
  • 物理机:9万/s
  • 笔记本:17万/s

基本延迟均在40毫秒左右。

以虚拟机为例,特别追加测试用例:

  • 开启pipeline后,性能达到8万/s
  • 关闭pipeline,使用短连接,性能为2万/s

总结

  • 优先使用高主频的CPU部署redis
  • 尽量使用长连接,尽量使用pipeline

其他知识点

  • lua脚本应提前通过script load命令上传到redis,因为直接通过eval执行脚本非常耗网络IO,从而加重了CPU负担
  • 使用redis cluster或者codis集群方案,可以通过hash tags机制实现多个key路由到相同槽位的能力,具体参考:《Redis Cluster Specification》的Keys hash tags章节,也就是说解决lua原子性并不一定非得用主从redis。

 

 

 

 

 

 

如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~