对于laravel自带原子锁处理接口幂等性的可行性讨论!

场景

有很多接口用户可能手抖快速点击两次,比如下单接口。我能用laravel8自带的缓存原子锁处理

代码

使用文件缓存(file)

//第一步:获取缓存key,接口地址+用户ID
$lock_id = request()->url() . '-' . auth()->id();
$lock = Cache::lock($lock_id, 5);
if ($lock->get()) {
    # 业务逻辑
    $lock->release();
}

# 用户重复点击,无响应

请问这么处理在高并发下会不会出现问题?目前只考虑单服务器!

让PHP再次伟大
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

单独服务器 一般情况这样就够了

1年前 评论
讨论数量: 31

存在潜在问题 因为实际源码 不是走的原子操作,是先setnx + expire 一般情况下不会有问题

1年前 评论
勇敢的心 (楼主) 1年前
Smilephp (作者) 1年前
勇敢的心 (楼主) 1年前
ncccc1 1年前
Tangqy 1年前
勇敢的心 (楼主) 1年前

这跟我用session差不多。 :smirk:

1年前 评论
勇敢的心 (楼主) 1年前
bigdaxin (作者) 1年前

应该没啥问题吧,我平时是这样处理的,前端最后也加个防抖

1年前 评论

单独服务器 一般情况这样就够了

1年前 评论

推一下我写的幂等包

github.com/lidongyooo/Laravel-Idem...

1年前 评论
pangxianfei 1年前

开启 csrf 就可以了

1年前 评论
勇敢的心 (楼主) 1年前
Where (作者) 1年前
勇敢的心 (楼主) 1年前
Where (作者) 1年前
Where (作者) 1年前

【原子锁】这个概念,就【必须】【绝对】要引入其他系统。即便你单机,也要在这个单机上装个redis、memcached或者数据库为驱动。

实在不行你可以用数据库实现锁,防止同一个资源在同一时间被多次操作,而且要在另一个connection中,否则会造成与业务事务阻塞。

1年前 评论
勇敢的心 (楼主) 1年前
cevin (作者) 1年前

缓存必须是redis驱动,是可以实现并发处理的,因为底层是执行lua代码实现redis操作,redis又是单进程的,所以没问题

1年前 评论
勇敢的心 (楼主) 1年前
Asuna (作者) 1年前
勇敢的心 (楼主) 1年前
Asuna (作者) 1年前
Asuna (作者) 1年前
pangxianfei

我也遇到这类的问题,ajax重复提交的。怎么解决了。

1年前 评论
勇敢的心 (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!