假设我们所有页面都有一些重要的计数器,而且我们的网站负载很重。我们将它们存储在一组Redis键中,这些键在一小时左右自动EXPIRE。
在我们的代码中,我们检查是否存在包含计数器的密钥,如果没有,我们执行一些繁重的操作(假设它是一个在MySQL中有多个WHERE的COUNT(*))来重新计算它的值,那么我们用我们新重新计算的值设置键的值。
<?php
$counter = $redis->get('My:Heavy_Counter');
if ($counter === null) {
$counter = $counter->recalculate();
$redis->set('My:Heavy_Counter', $counter);
}
?>
问题是每个网页客户端都要进行上述操作。
是否有一种优雅的方法只需要第一个客户的请求重新计算这些密钥,同时让其他数千个客户端等待?
答案 0 :(得分:2)
您可以使用Redis SET
命令实现简单的锁定系统:
来自SET
命令description:
命令
SET resource-name anystring NX EX max-lock-time
是一个 使用Redis实现锁定系统的简单方法。如果上述命令返回
OK
(或者),客户端可以获取锁定 如果命令返回Nil
),则在一段时间后重试,并删除锁定 只使用DEL
。锁定将在到期时间后自动释放。