使用背景
项目中需要使用单redis实例存储千万级别的数据,当时认为开多线程存储能够提高执行速度,开了10个线程不停的存储每一条数据。结果运行速度龟速,加大线程数还是无果。
redis 单线程
官方FAQ表示,因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了(毕竟采用多线程会有很多麻烦!)。
看到这里应该就能够理解为什么不断增加处理线程数,也不能加快运行速度了。
- redis本身就是单线程,client再多,最终也只能单线程执行
- redis主要瓶颈在于IO操作
解决方案
- 单线程的方式是无法发挥多核CPU性能,可以通过在单机开多个Redis实例来完善
- 使用 pipline
重点说一下pipline
pipline的原理也比较简单,就是将一大堆的命令打包成一个原子操作,一次性传递给redis让其顺序执行,只会存在命令全部成功,或者全部失败。
为什么pipline会比拆成每一条小命令执行要快呢?
原因就是IO操作,每一条小命令执行时client与redis都要进行网络连接,传输命令,等待执行,传输结果,释放连接这样的过程.redis执行速度是很快的,大部份时间都耗在网络上了。
而pipline是一次性传输一个命令集,减少了大量的网络操作。
最终项目使用pipline解决该性能问题