Redis 是普及率最高的技术之一,同时也是面试中必问的一个技术模块,所以从今天开始我们将从最热门的 Redis 面试题入手,更加深入的学习和了解一下 Redis。
我们本文的面试题是 Redis 属于单线程还是多线程?
典型回答
本文的问题在不同的 Redis 版本下答案是不同的,在 Redis 4.0 之前,Redis 是单线程运行的,但单线程并不意味着性能低,类似单线程的程序还有 Nginx 和 NodeJs 他们都是单线程程序,但是效率并不低。 Redis 的 FAQ(Frequently Asked Questions,常见问题)也回到过这个问题,具体内容如下:
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.
详情请见:https://redis.io/topics/faq
他的大体意思是说 Redis 是基于内存操作的,因此他的瓶颈可能是机器的内存或者网络带宽而并非 CPU,既然 CPU 不是瓶颈,那么自然就采用单线程的解决方案了,况且使用多线程比较麻烦。但是在 Redis 4.0 中开始支持多线程了,例如后台删除等功能。
简单来说 Redis 之所以在 4.0 之前一直采用单线程的模式是因为以下三个原因:
- 使用单线程模型是 Redis 的开发和维护更简单,因为单线程模型方便开发和调试;
- 即使使用单线程模型也并发的处理多客户端的请求,主要使用的是多路复用(详见本文下半部分);
- 对于 Redis 系统来说,主要的性能瓶颈是内存或者网络带宽而并非 CPU。
Redis 在 4.0 中引入了惰性删除(也可以叫异步删除),意思就是说我们可以使用异步的方式对 Redis 中的数据进行删除操作了,例如 unlink key
/ flushdb async
/ flushall async
等命令,他们的执行示例如下:
> unlink key # 后台删除某个 key
> OK # 执行成功
> flushall async # 清空所有数据
> OK # 执行成功
这样处理的好处是不会导致 Redis 主线程卡顿,会把这些删除操作交给后台线程来执行。
小贴士:通常情况下使用 del 指令可以很快的删除数据,而当被删除的 key 是一个非常大的对象时,例如时包含了成千上万个元素的 hash 集合时,那么 del 指令就会造成 Redis 主线程卡顿,因此使用惰性删除可以有效的避免 Redis 卡顿的问题。
考点分析
关于 Redis 线程模型的问题(单线程或多线程)几乎是 Redis 必问的问题之一,但能回答好的人却寥寥无几,大部分的人只能回到上来 Redis 是单线程的以及说出来单线程的众多好处,但对于 Redis 4.0 和 Redis 6.0 中,尤其是 Redis 6.0 中的多线程能回答上来的人少之又少,和这个知识点相关的面试题还有以下这些。
- Redis 主线程既然是单线程的,为什么还这么快?
- 介绍一下 Redis 中的多路复用?
- 介绍一下 Redis 6.0 中的多线程?
网友评论