【问题标题】:Prevent Redis values from being recalculated by many clients at once防止多个客户端同时重新计算 Redis 值
【发布时间】:2013-10-07 21:30:11
【问题描述】:

假设我们的所有页面上都有一些重要的计数器,并且我们的网站负载很重。我们将它们存储在一组 Redis 密钥中,这些密钥会在一小时左右自动过期。

在我们的代码中,我们检查是否存在包含计数器的键,如果不存在,我们执行一些繁重的操作(假设它是 MySQL 中具有多个 WHERE 的 COUNT(*))来重新计算它的值,然后我们使用我们新重新计算的值设置键的值。

<?php
  $counter = $redis->get('My:Heavy_Counter');
  if ($counter === null) {
    $counter = $counter->recalculate();
    $redis->set('My:Heavy_Counter', $counter);
  }
?>

问题是每个网页客户端都要做上述操作。

有没有一种优雅的方法可以仅通过第一个客户端的请求重新计算这些密钥,同时让其他数千个客户端等待?

【问题讨论】:

    标签: php mysql redis


    【解决方案1】:

    您可以使用 Redis SET 命令实现简单的锁定系统:

    来自SET 命令description

    命令SET resource-name anystring NX EX max-lock-time 是 使用 Redis 实现锁定系统的简单方法。

    如果上述命令返回OK(或 如果命令返回Nil,则在一段时间后重试),然后解除锁定 只使用DEL

    到了过期时间,锁会自动释放。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-08
      • 1970-01-01
      • 2019-01-31
      • 1970-01-01
      • 2015-12-16
      • 2020-12-26
      • 2014-01-24
      • 1970-01-01
      相关资源
      最近更新 更多