问答 / 0 / 31 / 创建于 2年前
有很多接口用户可能手抖快速点击两次,比如下单接口。我能用laravel8自带的缓存原子锁处理
使用文件缓存(file)
//第一步:获取缓存key,接口地址+用户ID $lock_id = request()->url() . '-' . auth()->id(); $lock = Cache::lock($lock_id, 5); if ($lock->get()) { # 业务逻辑 $lock->release(); } # 用户重复点击,无响应
单独服务器 一般情况这样就够了
存在潜在问题 因为实际源码 不是走的原子操作,是先setnx + expire 一般情况下不会有问题
@Smilephp 我文章中提过了,我只考虑单服务器应用,如果加redis,会增加复杂性,万一redis崩了怎么办?单服务器应用没有必要
这跟我用session差不多。 :smirk:
应该没啥问题吧,我平时是这样处理的,前端最后也加个防抖
推一下我写的幂等包
github.com/lidongyooo/Laravel-Idem...
开启 csrf 就可以了
【原子锁】这个概念,就【必须】【绝对】要引入其他系统。即便你单机,也要在这个单机上装个redis、memcached或者数据库为驱动。
实在不行你可以用数据库实现锁,防止同一个资源在同一时间被多次操作,而且要在另一个connection中,否则会造成与业务事务阻塞。
缓存必须是redis驱动,是可以实现并发处理的,因为底层是执行lua代码实现redis操作,redis又是单进程的,所以没问题
我也遇到这类的问题,ajax重复提交的。怎么解决了。
我要举报该,理由是:
单独服务器 一般情况这样就够了