需要面试文档可S我
Redis是单线程还是多线程?这个问题,把一个5年开发经验的程序员给问懵了。可能很多小伙伴平时都听说过,Redis就是单线程的。但是我们学习Redis命令的时候,有经常有设置异步,比如bgsave命令,它的作用是在后台异步持久化数据到磁盘,那既然是异步,肯定需要由线程来完成。
另外,往期面试题解析中配套的文档我已经准备好,想获得的可以在我的煮叶简介中找到。
接下来,我们来介绍,Redis到底是单线程还是多线程?。
1、官方解释
其实,Redis 确实是单线程的。通常说的单线程,主要是指 Redis 对外提供的键值存储服务的主要流程是单线程,也就是网络IO和数据读写是由单个线程来完成的。除此外 Redis 的其他功能,比如持久化、 异步删除、集群数据同步等,是由额外的线程来执行的。这样做的好处是可以 。因此,严格地说 Redis 并不是全面单线程。
在Redis官网页做出了解释,它是这样描述的:
Redis is single threaded. How can I exploit multiple CPU / cores?It’s not very frequent that CPU becomes your bottleneck with Redis, as usually Redis is either memory or network bound. For instance, using pipelining Redis running on an average Linux system can deliver even 1 million requests per second, so if your application mainly uses O(N) or O(log(N)) commands, it is hardly going to use too much CPU.However, to maximize CPU usage you can start multiple instances of Redis in the same box and treat them as different servers. At some point a single box may not be enough anyway, so if you want to use multiple CPUs you can start thinking of some way to shard earlier.You can find more information about using multiple Redis instances in the Partitioning page.However with Redis 4.0 we started to make Redis more threaded. For now this is limited to deleting objects in the background, and to blocking commands implemented via Redis modules. For future releases, the plan is to make Redis more and more threaded.
大致意思是:
由于Redis是基于内存的操作,查找和操作的时间复杂度都是O(1),因此CPU并不是Redis的瓶颈。 Redis的瓶颈很可能是机器内存或网络带宽的大小。 既然单线程易于实现并且CPU不会成为瓶颈,那采用单线程解决方案是合乎逻辑的了。
2、高性能原因
既然Redis设计为单线程,为什么效率这个么高呢?我总结以下三个原因:
1、完全基于内存操作
Redis中绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap的数据结构,对数据操作也简单。
2、降低了CPU的消耗
采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗。
3、采用了更高效的非阻塞I/O
Redis采用epoll做为I/O多路复用技术的实现,再加上Redis自身的事件处理模型将epoll中的连接,读写,关闭都转换为了事件,不在I/O上浪费过多的时间,使得Redis在网络 IO 操作中能并发处理大量的客户端请求,实现了高吞吐率。
以上,就是我对Redis单线程设计以及Redis为什么这么高效的分析。在目前最新的Redis版本中,IO 多线程处理模式默认是不开启的,需要去配置文件中开启并配置线程数。
我是被编程耽误的文艺Tom,如果你还有其他不懂,可以关注我的主页介绍。如果我的面试解析对你有帮助,请分享给更多的人。关注我,面试不再难!