防止Redis值被多个客户端一次重新计算

时间:2013-10-01 16:09:05

标签: php mysql redis

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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

来自SET命令description

  

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

     

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

     

锁定将在到期时间后自动释放。