1

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

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

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

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

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

4

1 回答 1

2

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

SET命令描述

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

如果上述命令返回,客户端可以获取锁OK(或者如果命令返回,则在一段时间后重试Nil),并仅使用DEL.

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

于 2013-10-01T16:17:55.400 回答