Redis请求处理内部

时间:2016-10-14 19:08:48

标签: python redis node-redis nosql

我在redis中有些困惑。我是自学redis。

我必须知道redis是单线程的,它适用于事件循环的概念。所以读/写操作是用redis序列化的,没有竞争条件。

我的困惑是 - 当我天真地想到单线程架构时,我可以想象有一个缓冲区,所有读/写请求都会收集,线程会逐个调度它们。但是在现实生活中的互联网应用程序中,要处理数千或数百万个请求,redis如何处理这些请求而没有明显的延迟?如果某些写入操作需要几毫秒的时间,那么在这段时间内它是否会阻止其他读写操作?

redis是否实现了像关系数据库这样的锁定概念?如果不是,那么redis如何处理成千上万的读/写而没有明显的延迟?

任何内部/例子对我的进一步学习都很有帮助。

1 个答案:

答案 0 :(得分:1)

您对Redis内部的理解是完全正确的。没有锁定系统。所有操作都是原子操作和阻塞操作。

使用Redis时的建议是发出多个短请求,而不是长请求。如果您处理大量密钥或大型数据结构,请在编写请求时考虑Redis Commands文档中提到的时间复杂度。避免使用KEYS命令,而不喜欢SCAN系列命令。在编写将使用EVAL命令发送到Redis的Lua脚本时要特别小心。

每个请求的执行时间都非常短,在大多数用例中,客户端不会受到影响,Redis命令在执行给定期间不会响应任何其他命令之一。

大多数情况下,限制因素不是Redis本身,而是网络。

但是,在某些用例中,您可能会达到Redis限制(非常高)。在这些情况下,您可以在主从模式下使用multiple Redis instances(复制,由Redis Sentinel监控),并在实例之间进行某种加载,以便读取请求。您还可以在几个Redis实例上使用twemproxy之类的工具。