我目前正在尝试了解Redis的一些基本实现。我知道Redis是单线程的,并且我已经偶然发现了以下问题:Redis是单线程的,那么它是如何进行并发I/O的?
但我还是觉得我没理解对。 AFAIK Redis 使用一个单线程的反应器模式。因此,如果我理解正确的话,有一个观察者(处理 FD/传入/传出连接)将要完成的工作委托给其注册的事件处理程序。他们做实际的工作并设置例如。他们的响应作为事件发送给观察者,观察者将响应传输回客户端。但是,如果客户端的请求 (R1) 花费大约 1 分钟,会发生什么情况。另一个客户端创建另一个(快速)请求(R2)。然后,由于 Redis 是单线程的,在 R1 完成之前,R2 无法委托给正确的处理程序,对吗?在多线程环境中,您可以在单个线程中启动每个处理程序,因此“主”线程只是接受和响应 I/O 连接,所有其他工作都在自己的线程中执行。
如果它真的只是对 io 处理和处理程序逻辑进行排队,那么它永远不会那么快。我在这里缺少什么?
除了 Redis 中的大多数操作在不到一毫秒~几微秒的时间内完成之外,您不会错过任何东西。长时间运行的操作确实会在执行期间阻塞服务器。
假设有 10,000 个用户在 hmget 上进行实时数据拉取,每个用户 10 秒,而另一边,服务器使用 hmset 进行广播,redis 只能在最后一个可用队列中发出该集合。
Redis 仅适用于排队和处理有限的处理,例如插入延迟的上次登录信息,但不适用于实时信息广播,在这种情况下,memcached 将是正确的选择。 Redis 是单线程的,就像 FIFO 一样。