我在redis中有些困惑。我是自学redis。
我必须知道redis是单线程的,它适用于事件循环的概念。所以读/写操作是用redis序列化的,没有竞争条件。
我的困惑是 - 当我天真地想到单线程架构时,我可以想象有一个缓冲区,所有读/写请求都会收集,线程会逐个调度它们。但是在现实生活中的互联网应用程序中,要处理数千或数百万个请求,redis如何处理这些请求而没有明显的延迟?如果某些写入操作需要几毫秒的时间,那么在这段时间内它是否会阻止其他读写操作?
redis是否实现了像关系数据库这样的锁定概念?如果不是,那么redis如何处理成千上万的读/写而没有明显的延迟?
任何内部/例子对我的进一步学习都很有帮助。
答案 0 :(得分:1)
您对Redis内部的理解是完全正确的。没有锁定系统。所有操作都是原子操作和阻塞操作。
使用Redis时的建议是发出多个短请求,而不是长请求。如果您处理大量密钥或大型数据结构,请在编写请求时考虑Redis Commands文档中提到的时间复杂度。避免使用KEYS命令,而不喜欢SCAN系列命令。在编写将使用EVAL命令发送到Redis的Lua脚本时要特别小心。
每个请求的执行时间都非常短,在大多数用例中,客户端不会受到影响,Redis命令在执行给定期间不会响应任何其他命令之一。
大多数情况下,限制因素不是Redis本身,而是网络。
但是,在某些用例中,您可能会达到Redis限制(非常高)。在这些情况下,您可以在主从模式下使用multiple Redis instances(复制,由Redis Sentinel监控),并在实例之间进行某种加载,以便读取请求。您还可以在几个Redis实例上使用twemproxy之类的工具。