首页 > 自考资讯 > 高考百科

阿里二面:Redis是单线程还是多线程?为什么这么设计?(redis是线程安全的吗)

小条 2024-10-01

cd4497fe75e246e395008d2b7b1690a0~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1728320188&x-signature=3DQx5aI9bJePKXIK2TQO8Fp56M8%3D Redis是单线程还是多线程?这是大公司面试的常见话题。实际上它包括两者。 @麦克陈

本文收录于mikechen的30万+字原文《阿里架构师进阶专题合集》。

9144ecfdc3b7498ca15879732aa9eb1e~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1728320188&x-signature=tIHNKhxlgqd3IV7gXldkI0PXm%2Bo%3D

Redis单线程

在Redis 4.0之前,它在处理网络I/O和键值存储操作时使用单线程模式。

Redis 4.0之前为什么采用单线程模式?

单线程效率

我们都知道Redis使用内存访问。这就是Redis速度快的主要原因。

例如:大多数Redis操作(GET、SET等)和其他数据结构操作都是非常简单高效的动作。

比如b2524b79e52f4d22b3aea87c64f92004~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1728320188&x-signature=J66YJ6YUUdnewFjSf6VsDxt%2FMOM%3D在内存中的性能就很高,大部分是: 算法复杂度为O(1)。

因此,性能非常快,不需要多线程加速,单线程即可。

如果你需要使用多线程,你肯定需要: 多线程在线文档切换。

当上下文切换频繁发生时,多线程会降低系统性能。

Redis单线程模式完全避免了线程切换的开销,让CPU更集中地处理客户端请求。

此外,多线程编程需要处理复杂的并发问题,例如锁和死锁。

43f9ae36daec481cbca06c3dd40355bb~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1728320188&x-signature=ZrPBktYsMwm2AMCf5W%2FLVwkA3oE%3D 因此,在两者之间进行选择并使用单线程模型不仅可以确保高效的操作性能,还可以避免这些问题并保持简单性和性能。

这就是为什么使用单线程的本质。

IO复用

我还得谈谈另外一个非常重要的观点。那就是“IO复用”。

IO多路复用技术允许单个线程高效地处理大量并发连接,而不需要多个线程来处理不同的请求。

示例:Redis 使用I/O 多路复用(select/epoll/kqueue.等)来处理多个客户端连接。

efabc1012dfd4cb294922ed21dcb97e2~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1728320188&x-signature=IaGbemqZoD4c57sfnUezigobiL0%3Dselect是较旧的I/O复用机制,几乎所有操作系统都支持,但在高并发场景下性能较差。

因此,后续升级将是“epoll”,Redis在Linux系统上将默认使用epoll。

epoll是Linux系统上高效的I/O复用系统调用,适合处理大量并发连接。

I/O 多路复用允许您同时管理大量并发连接,尤其是在epoll 和kqueue 等事件驱动模型中。

这允许您仅处理大量具有事件的连接中的那些连接,从而提高了系统的并发性。

Redis多线程

很多同学肯定会有这样的疑问:单线程就能解决问题,为什么还需要“多线程”呢?

这是因为网络I/O 瓶颈仍然存在。从Redis 6.0开始,Redis引入了多线程,主要用于优化高并发场景下的网络I/O。

引入多线程可以让Redis在高并发环境下更高效地处理客户端请求,特别是减少网络I/O瓶颈。

如下图:

680c67aae23d4e5d8f8b098b5d12814b~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1728320188&x-signature=I8TMWZB5ktYOZ1qxYQfI%2BtkkYeQ%3DRedis需要处理大量的网络请求,尤其是高并发的情况。

由于单线程处理顺序,网络I/O和实际命令处理都在同一个线程上执行,造成网络I/O处理的性能瓶颈。

因此,从Redis 6.0开始,Redis可以使用多线程来处理网络请求的读写操作。

通过并行化网络I/O,网络I/O成为高并发场景下的主要瓶颈之一。

Redis 允许多个线程同时处理来自多个客户端连接的读写数据,从而显着提高系统吞吐量。

本文收录于mikechen的30万+字原文《阿里架构师进阶专题合集》。

6718d1fbb8be4e3582c4844204a1e11e~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1728320188&x-signature=HSI%2F95SMyOcJA3guPmp5ggaTuyI%3D

版权声明:本文转载于网络,版权归作者所有。如有侵权,请联系本站编辑删除。

猜你喜欢