【问题标题】:Will Redis queue up hset commands for numerous requests?Redis 会为大量请求排队 hset 命令吗?
【发布时间】:2012-09-02 21:46:23
【问题描述】:

假设我每秒有 100 个请求,对于每个查询,需要提取一个哈希值,然后需要更新相同的哈希值,如下所示:

redis.hget 'value', 'user-123' redis.hset 'value', 'user-123', JSON.generate({:number_of_visits => 15})

如果每秒有大量的读\写会发生什么?

redis 是否会将 hget 和 hset 命令都排入队列,并且它们都会按照进入的顺序执行?输入的命令越多,它会减慢 hget 的速度吗?

【问题讨论】:

  • Redis 相当快;在正常情况下,它可以轻松地每秒处理数千个命令,除了实际的网络延迟(即,将命令发送到 redis 实例并返回所需的时间)之外没有任何问题,所以在你描述的情况下你会很好。

标签: ruby database redis


【解决方案1】:

Redis 使用单线程处理命令,因此命令会按照到达的顺序进行处理。

一些文档here

从根本上讲,Redis 是一个单线程服务器。这意味着一个 单线程使用基于事件的范例读取传入连接 比如epoll、kqueue和select。当特定事件发生在 文件描述符,它处理它们并写回响应。这个 UML 序列图显示了如何处理客户端接收到的命令 Redis 内部:

如果您以比 redis 处理速度更快的速度发送命令,命令将在 redis 中排队,并且客户端会看到延迟增加,因为他们等待命令出列和处理。这将影响 hset 和 hget 命令。

【讨论】:

  • 实际上,如果 Redis 的流量饱和,它会在套接字缓冲区中排队,而不是在 Redis 本身中排队。当套接字缓冲区已满时,TCP 流控制会减慢客户端的速度。如果 Redis 完全对传入流量进行排队,那将是一个严重的漏洞(饱和时内存爆炸)。
猜你喜欢
  • 2012-06-18
  • 2013-02-28
  • 1970-01-01
  • 2019-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-16
相关资源
最近更新 更多