为什么单线程Redis能那么快
单线程澄清
Redis的单线程,指的是Redis的键值对读写由一个线程来完成。
Redis的多线程:
- 持久化
- 异步删除
- 集群数据同步
- 网络IO (Redis6.0引入,5.0及之前都是单线程)
单线程快的原因
内存数据库
Redis完全基于内存,大部分操作都是在内存中完成的。内存操作相比于磁盘操作,速度要快很多。
没有锁的开销
Redis采用单线程模型,避免了不必要的上下文切换和竞争条件。多线程或多进程导致的切换会消耗CPU,考虑各种锁的问题也会导致性能损耗。
I/O多路复用
Redis采用了非阻塞+epoll模型,具体ET/LT待查证。
ET是Edge Triggered的缩写,它表示边缘触发。在这种模式下,只有当某个文件描述符有数据到达时,才会触发一个事件。换句话说,当客户端发送数据到服务端时,只有第一次有数据到达时,epoll_wait会返回。即使后续还有数据到达,也不会再次触发。
LT是Level Triggered的缩写,它表示水平触发。在这种模式下,只要某个文件描述符中有数据可读,每次调用epoll_wait都会得到通知。也就是说,即使应用程序在处理事件时没有读取完所有数据,epoll_wait也会继续返回,直到所有数据都被读取完。
这两种触发模式各有优缺点。边缘触发模式的优点在于它只会在数据到达时触发事件,因此不会产生空轮询,效率更高。但是,如果应用程序需要处理大量数据,并且不能一次性读取完所有数据,边缘触发模式可能会产生大量的epoll_wait调用,增加CPU负载。而水平触发模式的优点在于它可以处理任何大小的数据,并且不会产生空轮询。但是,如果应用程序只需要处理少量的数据,并且希望减少epoll_wait调用的次数,水平触发模式可能会浪费CPU资源。
高效的数据结构
Redis常用类型有string、list、hash、zset、set,对应底层实现有简单动态字符串、双向链表、压缩列表、哈希表、跳表、整数数组。
更多信息详见Redis的底层数据结构。