很多项目开发中会涉及到并发插入的问题,最近看到一种比较简单的解决办法,也谈不上好坏,原理是差不多的。
主要是利用redis存在一个key唯一的固定值称为锁,每次插入操作前检查锁是否存在,如果存在就等待一会在来执行。如果不存在,开启锁,执行插入操作,操作成功后在释放锁。
一般常用的这种方法的项目,肯定会封装成全局的方法。如: Redis::lock(),Redis::unlock()。
实例如下:
//设置一个唯一的redis存储key
$key = 'xxx';
//设置lock如果成功true,如果已经存在返回false
//第一个参数key,第二个参数过期时间S
$lock = Redis::lock($key, 10);
if (!$lock) {
throw new ErrorException('当前其他操作正在执行插入,请勿重复操作');
}
//具体的插入操作逻辑
//插入成功,释放锁
Redis:unlock();
前提:要保证代码的插入操作是在同一个地方,service,repository中。不然就需要在不同的地方加锁。
如果你也喜欢旅行可以看下这里,自己的旅行网站,记录我们的一些旅行经历和大家分享,希望你可以喜欢:https://www.lanlianhua.org/