Redis单线程为什么还快

Redis 核心就是如果我的数据全都在内存里,我单线程的去操作就是效率最高的。

因为多线程的本质就是 CPU 模拟出来多个进程的情况,这种模拟出来的情况就有一个代价,就是上下文的切换。对于一个内存的系统来说,它没有上下文的切换就是效率最高的。Redis 用单个CPU 绑定一块内存的数据,然后针对这块内存的数据进行多次读写的时候,都是在一个CPU上完成的,所以它是单线程处理这个事。在内存的情况下,这个方案就是最佳方案 —— 阿里 沈询 的解释。

具体时间计算:

一次CPU上下文的切换大概在 1500ns 左右。

从内存中读取 1MB 的连续数据,耗时大约为 250us,假设1MB的数据由多个线程读取了1000次,那么就有1000次时间上下文的切换,

那么就有1500ns * 1000 = 1500us ,单线程读完1MB数据才250us ,而切换上下文就用了1500us了,还没算每次读一点数据的时间。

需要注意的的是,Redis 6 开始就不是单线程了。

在 Redis 中,单线程的性能瓶颈主要在网络IO操作上。也就是在读写网络的read/write系统调用执行期间会占用大部分CPU时间。如果要对一些大的键值对进行删除操作的话,在短时间内是删不完的,那么对于单线程来说就会阻塞后边的操作。

Redis6.0的多线程是指,将网络数据读写和协议解析通过多线程的方式来处理,对于命令执行来说,仍然使用单线程操作。也就是说,Redis6.0的多线程是为了解决其网络IO的瓶颈。

如果觉得写的还行,赞助瓶脉动~
0%