【问题标题】:Redis request handling internalRedis 请求处理内部
【发布时间】:2017-02-24 07:32:40
【问题描述】:

我对redis有些困惑。我是自学redis。

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

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

redis 是否实现了任何锁定概念,例如关系数据库?如果不是,那么 redis 如何在没有明显延迟的情况下处理数千次读/写?

任何内部结构/示例都对我的进一步研究很有帮助。

【问题讨论】:

    标签: python redis node-redis nosql


    【解决方案1】:

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

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

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

    大多数时候,限制因素不是 Redis 本身,而是网络。

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

    【讨论】:

      猜你喜欢
      • 2021-08-08
      • 2021-05-01
      • 2019-05-08
      • 2018-08-24
      • 1970-01-01
      • 1970-01-01
      • 2012-03-21
      • 2016-08-05
      • 2012-12-21
      相关资源
      最近更新 更多