php redis锁(上锁,setnx)防止并发

 
更多

工作间隙写了个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 "请不要频繁搜索,请稍后再试。";
}
打赏

本文固定链接: https://www.cxy163.net/archives/2926 | 绝缘体

该日志由 绝缘体.. 于 2024年09月17日 发表在 未分类 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: php redis锁(上锁,setnx)防止并发 | 绝缘体
关键字: , , , ,

php redis锁(上锁,setnx)防止并发:等您坐沙发呢!

发表评论


快捷键:Ctrl+Enter