Php 防止多个客户端同时重新计算Redis值

Php 防止多个客户端同时重新计算Redis值,php,mysql,redis,Php,Mysql,Redis,假设我们的所有页面上都有一些重要的计数器,并且我们的网站负载很重。我们将它们存储在一组Redis密钥中,这些密钥将在一小时左右自动过期 在我们的代码中,我们检查一个包含计数器的键是否存在,如果不存在,我们将执行一些重操作(比如说它是一个计数(*),在MySQL中有多个where)来重新计算它的值,然后用新重新计算的值设置键的值 <?php $counter = $redis->get('My:Heavy_Counter'); if ($counter === null) {

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

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

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

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


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

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

SET
命令:

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

如果上述命令返回
OK
(或 如果命令返回
Nil
),请在一段时间后重试,并移除锁 只需使用
DEL

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