当前位置: 首页 > 面试题库 >

为什么Redis是单线程的(事件驱动)

琴俊良
2023-03-14
问题内容

我正在尝试了解Redis的基础知识。Redis是无处不在的一种,它是使事情变得原子化的单线程,但是我无法想象这在内部是如何工作的。

如果它是IO绑定的应用程序(例如Node.js),则我们不设计服务器单线程,该线程在启动IO操作后释放了另一个请求的空间,并在IO操作完成后将数据返回给客户端(提供并发性)。但是在Redis的情况下所有数据都可以在主内存中使用,我们根本就不会做IO操作。那么为什么Redis是单线程的呢?如果第一个请求花费大量时间会发生什么情况,剩下的请求将不得不保留等候?


问题答案:

TL; DR :单线程使redis更加简单,并且redis仍然受IO约束。

内存是I / O。Redis仍受I /
O约束。当redis处于高负载下并达到每秒最大请求数时,它通常会饿死于网络带宽或内存带宽,并且通常不会占用大量CPU。对于某些命令,这不是真的,但是在大多数情况下,redis将受到网络或内存的严格I
/ O约束。

除非内存和网络速度突然提高几个数量级,否则单线程通常不是问题。如果您需要扩展一个或几个线程(即master <-> slave <-> slave
setup),那么您已经在研究Redis
Cluster。在这种情况下,如果您因某种原因而CPU饿了并且想要最大化线程数,则可以为每个CPU内核设置一个群集实例。

我对Redis的源代码或内部信息不是很熟悉,但是我可以看到使用单个线程如何使实现无锁原子操作变得容易。线程会使事情变得更加复杂,并且由于redis不受CPU限制,因此似乎并没有提供很大的优势。在redis实例之上的某个级别实现并发似乎是一个不错的解决方案,这是Redis
Sentinel和Redis Cluster的帮助。

Redis需要很长时间时,其他请求会如何处理?

当redis完成长请求时,这些其他请求将被阻止。如果需要,可以使用client- pause命令进行测试



 类似资料:
  • 我正在努力了解Redis的基础知识。其中一个不断出现的地方是,Redis是单线程的,使事物原子化。但我无法想象这是如何在内部工作的。我有以下疑问。 如果是IO绑定的应用程序(如node.js),那么我们不是设计一个服务器单线程吗?线程在发起IO操作后为另一个请求提供空闲,并且在IO操作完成后将数据返回给客户机(提供并发)。但是在redis的情况下,所有的数据都在主存中可用,我们根本不做IO操作。那

  • 代码更清晰,处理逻辑更简单; 不用考虑各种锁的问题,不存在加锁和释放锁的操作,没有因为可能出现死锁而导致的性能问题; 不存在多线程切换而消耗CPU; 无法发挥多核CPU的优势,但可以采用多开几个Redis实例来完善;

  • 本文向大家介绍Redis 为什么是单线程的?相关面试题,主要包含被问及Redis 为什么是单线程的?时的应答技巧和注意事项,需要的朋友参考一下 因为 cpu 不是 Redis 的瓶颈,Redis 的瓶颈最有可能是机器内存或者网络带宽。既然单线程容易实现,而且 cpu 又不会成为瓶颈,那就顺理成章地采用单线程的方案了。 关于 Redis 的性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求。而且

  • 本文向大家介绍请问,redis为什么是单线程?相关面试题,主要包含被问及请问,redis为什么是单线程?时的应答技巧和注意事项,需要的朋友参考一下 考察点: 因为CPU不是Redis的瓶颈。Redis的瓶颈最有可能是机器内存或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。缺点:服务器其他核闲置。

  • 本文向大家介绍单线程的 Redis 为什么这么快?相关面试题,主要包含被问及单线程的 Redis 为什么这么快?时的应答技巧和注意事项,需要的朋友参考一下 Redis 有多快?官方给出的答案是读写速度 10万/秒,如果说这是在单线程情况下跑出来的成绩,你会不会惊讶?为什么单线程的 Redis 速度这么快?原因有以下几点: 纯内存操作:Redis 是完全基于内存的,所以读写效率非常的高,当然 Red

  • 问题内容: 在基于PHP(或Java / ASP.NET / Ruby)的Web服务器中,每个客户端请求都在新线程上实例化。但是在Node.js中,所有客户端都在同一线程上运行(它们甚至可以共享相同的变量!)我知道I / O操作是基于事件的,因此它们不会阻塞主线程循环。 我不明白为什么Node的作者选择了它为单线程?这使事情变得困难。例如,我无法运行CPU密集型功能,因为它阻塞了主线程(并且阻塞了