1. 测试目的
对比 Redis 不同插入方法(插入同时能设置过期时间)的性能区别。
2. 测试数据
key:SMGP_
value:JSON数据
json
{
"spName":"100003",
"protocol":"SMGP",
"remoteAddress":"192.192.192.192:44192",
"host":"192.192.192.192:44192",
"port":44192,
"msgIds":"192192192192192192192"
}
数据量:10万
redis:采用蓝鲸云上的 redis,模拟真实生产环境的网络影响。
3. 待测试方法
单线程
- 遍历数据列表,单条插入
- 使用管道分批插入,分为 3 批,每批 3万,最后一批 4万
- 使用管道一次性插入 10 万条
多线程
- 10 个线程分批插入,每批 1万条数据,遍历数据列表,单条插入
- 10 个线程分批插入,每批 1万条数据,使用管道一次性插入 1 万条
4. 测试结果
单线程
遍历单条插入
- 耗时:11.22698333 分钟
- JVM 堆内存使用情况:最高 572.2540665 MB
使用管道分批插入
- 耗时:两次平均 36.8785 秒
- JVM 堆内存使用情况:两次最高平均 614.52574155 MB
使用管道一次性插入
- 耗时:两次平均 34.2025 秒
- JVM 堆内存使用情况:两次最高平均 482.4296875 MB
多线程
遍历单条插入
- 耗时:两次平均 114.9095 秒
- JVM 堆内存使用情况:两次最高平均 429.8007813 MB
管道一次性插入
- 耗时:两次平均 52.51 秒
- JVM 堆内存使用情况:两次最高平均 513 MB
5. 测试结果分析
- 对于 redis 的写入操作,应尽量避免遍历单条插入,由于频繁连接和释放连接,性能太低。
- 使用管道能显著提高 redis 的写入性能。
- 使用多线程能显著提高遍历单条数据写入 redis 的性能
- 对于不同的插入方式,消耗的资源大小基本差不多。
6. 不足之处
- 由于存在网络波动,不同方法测试时,网络差异较大,可能导致结果不太准确。因此对于细微的差别无法很好判断,比如:单线程的管道和多线程的管道哪个性能更优?
- 堆内存的消耗由于使用的 jconsole 进行监控的,凭肉眼观察,不是很准确。