redis为什么这么快?

redis为什么这么快?

Scroll Down

    最近在看复习一些关于redis的知识点,以前只知道它是一个非关系型数据库,适合用来做缓存,并且查询速度很快,但是它为什么这么快呢?

1 redis是单线程的

    Redis的数据结构并不全是简单的Key-Value,还有list,hash等复杂的结构,比如在很长的列表后面添加一个元素,在hash当中添加或者删除一个对象的时候,这些操作可能就需要加非常多的锁,导致的结果是同步开销大大增加。而单线程,就不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗。
    不过这里又引申了一个问题,理论上来说多线程能更好的提高程序的运行效率,那为什么redis单线程还这么快呢?
    因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈。
    并且redis是将所有的数据放在内存中的,所以说使用单线程去操作效率就是最高的,多线程(CPU上下文会切换:耗时的操作!),对于内存系统来说,如果没有上下文切换效率就是最高的,多次读写都是在一个CPU上的,在内存存储数据情况下,单线程就是最佳的方案。

2 使用IO多路复用,非阻塞IO

2.1为什么要使用I/O多路复用技术

    当 Redis 监听到一个客户端有连接请求,但一直未能成功建立起连接时,就会阻塞在 accept() 函数,这导致其他客户端无法和 Redis 建立连接。
    类似的,当 Redis 通过 recv() 从一个客户端读取数据时,如果数据一直没有到达,Redis 也会一直阻塞在 recv()。这就导致 Redis 整个线程阻塞,无法处理。

2.2 什么是IO多路复用技术

Linux 中的 IO 多路复用机制是指一个线程处理多个 IO 流。简单来说,在 Redis 只运行单线程的情况下,该机制允许内核中,内核会一直监听这些套接字上的连接请求或数据请求。一旦有请求到达,就会交给 Redis 线程处理,这就实现了一个 Redis 线程处理多个 IO 流的效果。下图是IO多路复用的一个大致的模型图。
image.png