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