Redis6版本中,使用了多线程处理网络IO,但是执行写命令仍然是单线程。本文就是对Redis5、Redis6两个版本中的不同网络模型,进行性能测试,尤其是对于大的Key和String类型的Value的测试。
根据官方介绍,对于Key和String类型的Value,最大不超过512MB,这个限制显然是没有太大参考意义的。那么究竟有没有一个合理的指标和界限,能够区分出单线程和多线程的网络IO模型的性能呢?
以下执行的都是set key value命令。
首先测试的是第一次和Redis建立连接的测试。
| Key大小 | Value大小 | 单线程 | 多线程 |
|---|---|---|---|
| 2byte | 2byte | 0.23s | 0.26s |
| 5MB | 5MB | 0.58s | 0.57s |
| 50MB | 50MB | 3.3s | 3.8s |
所有测试数据都是第一次连接Redis,由于需要进行Redis实例化,创建线程池等,看不出差别。
第二次测试。
| Key大小 | Value大小 | 单线程 | 多线程 |
|---|---|---|---|
| 2byte | 2byte | 0.0032452s | 0.0028476s |
| 5MB | 5MB | 0.2858883 | 0.2800712s |
| 50MB | 50MB | 2.8195027 | 2.9983646s |
可以看出,对于两种不同的网络模型而言,没有非常明显的性能差异。
而对于单个大的Key和String类型的Value,对Redis的性能影响是十分明显的,也就是说,我们在实际生产中,要尽可能避免会使用到大的Key和String类型的Value。如果的确遇到这样的场景,可以考虑对相应的Key和Value做分片,并配合scan命令,本质还是减少单个耗时命令对Redis的阻塞,影响整个系统的性能。
最后,再放一张byte与rt的统计图,均来自本次测试。