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