Redis效率高的主要原因有下面几个:

  • 基于内存操作,速度非常快
  • 采用单线程,避免了上下文的切换导致消耗CPU
  • 采用单线程,不用去考虑各种加锁释放锁的问题
  • 使用IO多路复用模型,非阻塞IO

Redis采用的是基于内存的采用的是单进程单线程模型的 KV 数据库,由C语言编写,官方提供的数据是可以达到100000+的QPS(每秒内查询次数)。

这个数据不比采用单进程多线程的同样基于内存的 KV 数据库 Memcached 差!

redis rdb cpu redis rdb cpu高_Redis


上图是Redis官方的测试数据,横轴表示连接数,纵轴表示QPS。

如果Redis采用的是多线程,那么CPU会在多个线程之间来回切换,在如此高的QPS下,多个线程的切换时特别频繁的,十分消耗CPU。

假设我们有三个连接同时执行下面的操作:

incr count

由于Redis使用单线程来处理命令的,所以一条命令来了之后不会立即执行,而是将命令加到一个队列中,然后逐个被执行,这样就能保证在不加锁的情况下保证不会产生并发问题。

如果Redis采用多线程执行命令,那么对于三个连接同时执行incr操作的时候,就需要添加锁来保证线程的安全性了,会大大降低执行效率。

Redis采用非阻塞IO,使用epoll作为IO多路复用技术的实现,再加上Redis自身的树碱处理模型将epoll中的连接、读写、关闭都转为事件,不在网络IO上浪费过多的事件。

当然了,单线程机制也不是万能的,也会存在一个的问题:对于每个命令的执行事件是有要求的。如果某个命令执行事件过长,会导致其他命令被阻塞,对于Redis这种高性能的服务来说是致命的。

所以即使Redis性能很高,我们也要合理的去使用Redis,不合理的使用也会导致很多问题。