Sep
17
2024
php redis锁(上锁,setnx)防止并发
作者:
绝缘体.. 发布:
2024-09-17 12:12 分类:
未分类 阅读:
抢沙发
工作间隙写了个redis防并发的锁示例,以备以后参考,前面写过利用文件锁防并发的代码,但考虑到效率以及分布式系统,文件锁会有弊端,而这种情况下redis则没有问题。
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
// 获取搜索者的IP地址
$ip = get_real_ip();
// 防止短时间重复提交搜索,$uid 是被搜索用户的ID
//锁的粒度是针对同ip的用户,不同的ip互不影响
$lock_key = $ip . 'userSearch' . $uid;
$lock_timeout = 2; // 2秒的锁定时间
$lock_value = uniqid(); // 锁的唯一值,用于解锁时验证
// 尝试获取锁,成功返回 true,失败返回 false
$lock_acquired = $redis->set($lock_key, $lock_value, ['nx', 'ex' => $lock_timeout]);
if ($lock_acquired) {
// 锁定成功,获取数据
$data = getData(); // 获取搜索结果数据
// 删除锁,确保只有持有锁的请求才能删除锁
if ($redis->get($lock_key) == $lock_value) {
$redis->del($lock_key);
}
} else {
// 锁定失败,提示用户操作过快
echo "请不要频繁搜索,请稍后再试。";
}
微信扫一扫,打赏作者吧~