我目前正在尝试了解Redis的一些基本实现方法。我知道redis是单线程的,我已经偶然发现了以下问题:Redis is single-threaded, then how does it do concurrent I/O?
但我仍然认为我没有理解它。 Afaik Redis使用单个线程使用reactor模式。因此,如果我理解这一点,就会有一个观察者(处理FD /传入/传出连接)将委托工作委托给它注册的事件处理程序。他们做实际工作并设置例如。他们作为事件的响应给观察者,观察者将响应传递回客户端。但是如果客户端的请求(R1)需要大约1分钟,会发生什么。另一个客户端创建另一个(快速)请求(R2)。然后 - 因为redis是单线程的 - 在R1完成之前R2不能委托给正确的处理程序,对吗?在多线程环境中,您可以在一个线程中启动每个处理程序,因此" main"线程只接受并响应io连接,所有其他工作都在自己的线程中执行。
如果它真的只是将io处理和处理程序逻辑排队,它就永远不会那么快。我在这里缺少什么?
答案 0 :(得分:3)
你可能没有遗漏任何东西,除了Redis中的大多数操作在不到一毫秒〜几微秒内完成的事实。长时间运行的操作确实会在执行期间阻止服务器。
答案 1 :(得分:0)
让我们说,如果有10,000个用户在hmget上进行实时数据提取,每个10秒,而另一方面,服务器正在使用hmset进行广播,那么redis只能在最后一个可用队列中发布该集合。
Redis仅适合排队和处理有限的处理(例如插入延迟的上次登录信息),但不适用于实时信息广播,在这种情况下,memcached将是正确的选择。 Redis是单线程的,例如FIFO。