一.Redis 到底有多快?
Redis是基于内存的采用单进程和单线程模型的KV数据库,官方提供的压测数据可以达到100000+的QPS,这个不比采用单进程多线程的同样基于内存的KV数据库Memcached差;
官网给出的基准程序测试:https://redis.io/topics/benchmarks
二.Redis 单线程为什么还能这么快?
- 纯内存访问,所有数据都在内存中,所有的运算都是内存级别的运算,内存响应时间的时间为纳秒级别,这是redis达到万级每秒的基础。
- 采用单线程,避免了不必要的上下文切换和竞争条件;不存在多线程导致的切换而消耗CPU,不用考虑各种锁的问题,不存在加锁和释放锁的的操作,没有因为可能出现的死锁而导致的性能消耗。(线程是需要内存开销的,1个线程可能需要2M 存放栈,1000个线程就需要2G的内存)
- redis单线程如何处理那么多并发客户端连接?回答:非阻塞IO,使用I/O多路复用技术(linux下可以使用epoll/poll/select)。多路复用是指使用一个线程来检查多个文件符FD(socket,文件,管道)的就绪状态;比如select和poll函数,传入多个文件描述符,一个文件符就绪,则返回,否则阻塞直到超时。
这样在处理1000个连接的时候,只需要1个线程监控就绪状态,对就绪的每个连接开一个线程处理就可以了,这样需要的线程数大大减少,减少了内存开销和上下文切换的CPU开销。
说明:至选择哪种多路复用技术,在ae.c里有预处理的控制,也就是说,这些文件最后只有一个能够被编译。优先选择epoll或者kqueue(FREEBSD和Mac OSX可用)可用其次是select。服务器运行时主要关注两大类型的事件:文件事件和时间事件。文件事件指的是socket文件描述符FD的读写就绪情况,
【Redis 和 I/O 多路复用】: https://draveness.me/redis-io-multiplexing
【为什redis是单线程这么快】:https://blog.csdn.net/xlgen157387/article/details/79470556