未使用分布式锁
Cache::set($request->param('sn'),100);
//bad
if(Cache::get($request->param('sn'))>0){
//处理业务 这里并发能绕过检测,进行不必要的业务处理流程
sleep(1);
if(Cache::get($request->param('sn'))>0){
Cache::dec($request->param('sn'),1);
}
}
使用分布式锁
if (!Cache::has($request->param('sn'))) {
if (app('redis')->setnx($request->param('sn') . 'lock', 1)) {
//处理业务
sleep(1);
Cache::inc($request->param('sn'), 1);
//解锁
app('redis')->del($request->param('sn') . 'lock');
}
}
这里需要注意的是为setnx设置过期时间,防止出现死锁