36|Redis 单线程:为什么 Redis 用单线程而 Memcached 用多线程?
邓明
你好,我是大明。今天我们来探讨一下 Redis 高性能的原因。
这个问题在面试中还是很常见的,原因也很简单,除了 Redis 你基本上没有听过其他采用单线程模型的中间件,所以这就凸显了 Redis 的与众不同。
而且这个问题也很有现实意义。大部分时候对 Redis 的一些高级应用,比如前面提到的利用 Redis 实现一个分布式锁,其中有一个很重要的假设就是 Redis 是线程安全的,没有并发问题。而 Redis 是单线程的这一点就保证了线程安全的特性。
那么今天我就带你来看一下,Redis 的高性能究竟是怎样做到的。
Redis 是单线程的含义
你在学习 Redis 的时候,肯定听过一句话,Redis 是单线程的。而实际上,Redis 并不是单线程的。业界说 Redis 是单线程的,是指它在处理命令的时候,是单线程的。在 Redis 6.0 之前,Redis 的 IO 也是单线程的,但是在 6.0 之后也改成了多线程。
但是其他部分,比如说持久化、数据同步之类的功能,都是由别的线程来完成的。因此严格来说,Redis 其实是多线程的。
面试准备
这一部分的面试内容基本上都是纯理论的,所以你需要做几件事情。
了解你使用的其他中间件,在 IO 上是否使用了 epoll,以及是否使用了 Reactor 模式。
了解你们公司有没有使用 Redis 的多线程,如果用了,那么弄清楚最开始的决策理由以及相比单线程性能究竟提升了多少。
了解清楚你使用的 Redis 的性能瓶颈。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
Redis的高性能源自于其采用的单线程模型和高效的IO模型,尤其是在Redis 6.0之后,引入了基于epoll的多线程模型,进一步发挥了多核CPU的优势。文章介绍了Reactor模式和epoll的基本结构,以及Redis在多线程模型下的运作方式。同时,对比了Redis和Memcache的单线程和多线程模型选择的优缺点,以及Redis引入多线程模型的原因。总的来说,Redis在多线程模型下能够更有效地利用多核性能,但大部分情况下仍不推荐使用多线程模式。读者可以从中了解到Redis高性能的原理和多线程模型的优劣势,以及在实际应用中的选择考量。文章还提到了面试中可能会涉及的问题,以及对Memcache和Redis在性能瓶颈时的应对策略进行了讨论。值得注意的是,Redis的Reactor模式和多线程模型的运作方式是关键内容,而在面试中可能需要重点准备。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《后端工程师的高阶面经》,新⼈⾸单¥59
《后端工程师的高阶面经》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(3)
- 最新
- 精选
- Johar我在 Memcache 里面吐槽说为什么它用多线程而 Redis 用单线程,可能就是设计者的偏好问题,你是如何看待这个问题的? redis虽然是单线程,但也只是网络io+内存操作是单线程,其他涉及文件io,数据同步等耗时操作都是多线程。当然涉及耗时读写操作,redis会造成阻塞。另外缓存本来就是读多写少的操作。从上述两点个人倾向于多线程模型。 你认为在 Redis 遇到性能瓶颈的时候,是应该优先考虑使用多线程模式还是应该考虑 Redis Cluster 增加新节点来解决? 大部分的情况新增节点提升高,除非是单个热key或crc相同的热key,在不改动代码的情况下,新增节点无用,需要开启多线程
作者回复: 赞!第二个点考虑一语中的!
2023-09-11归属地:重庆2 - peter请教老师几个问题: Q1:线程可以绑定到CPU的某个核上吗? Q2:Redis在windows下的IO模型也是epoll+Reactor吗? 文中有“另外一方面,在 Linux 系统上 Redis 采用了 epoll 和 Reactor 结合的 IO 模型”,那么,Redis在windows下也是这样的IO模型吗? Q3:普通的文件描述符也叫“套接字”吗? 我把“套接字”理解成socket了,用于网络通信的了。文中说的“套接字”好像范围很广,即包括socket,也包括其他类型的文件描述符了。 Q4:Redis用的epoll是借用Linux的epoll吗? Epoll_create是一个系统调用,从这里看,应该是借用Linux本身的epoll特性。 Q5:Memcache是内存数据库吗? Q6:Redis多线程模式下,主线程收到请求后,哪个IO线程来处理是怎么决定的?随机选一个吗?还是事先绑定好了?
作者回复: 1. 不能,我记得 linux 没这种系统调用,但是有点不太确定 2. 不是,但是是类似的机制,不需要了解,因为很少用到 3. 不,套接字是文件描述符,但是文件描述符不是套接字 4. Redis 调用的就是 Linux 的,除非你的 redis 都没部署在 linux 上 5. 可以这么说 6. 命令肯定是主线程来执行
2023-09-11归属地:北京21 - 文敦复牛逼。。。2023-09-26归属地:四川1
收起评论