cache系统 使用array驱动 原子锁 lock无法锁定

环境:centos8+php8+lavavel8
线上环境查看日志发现有个别用户在一秒内对某一接口连续发了多条请求,正常只有一条会被处理,其余请求在lock release后会被拒绝!但是实际上这几条请求全部同一时刻处理,造成多线程问题,数据被重复加了多次!
锁的部分代码如下:
$lock = \Cache::lock(“lockbyarraydrive:” . $userID, 10);
try{
$lock->block(10)

}
finally{
optional($lock)->release();
}
由于只有一台服务器所以只是使用了array缓存驱动,锁定时间设置为10秒!但是没有被锁定!
我查看了文档这个array驱动测试的时候用,目前已经改为memcached驱动,正在观察业务运行情况,不确定是否会解决!
一直没有找到问题的原因!希望各位有遇到相同情况的指点一下

————————-问题已解决——————————–
谢谢各位的解答 应该是多进程的问题!array进程间不共享!
昨天改成 memcached 锁以后问题就没有在出现并发问题
这个问题应该是解决了!不用再回复了 再次感谢!

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 13

额,你这个 $userID 是动态的吗?这样的话锁的颗粒度就是针对用户级别了~~

要不去掉 $userID 试试看?

3年前 评论
qishi (楼主) 3年前
qishi (楼主) 3年前
lidongyoo (作者) 3年前
qishi (楼主) 3年前
qishi (楼主) 3年前

array 随请求结束而释放的吧?

3年前 评论
qishi (楼主) 3年前

你这个,,,我首先告诉你,这样肯定是锁不住的,,,

解决方法:

1:换 redis

2:换 文件

3:fpm 进程数配置成 1

4:看楼下怎么说

3年前 评论
qishi (楼主) 3年前

如果是使用php-fpm,多进程,一个请求一个进程,array 内存不共享,你这个锁就失去意义了吧,猜测哈 :see_no_evil:

3年前 评论
qishi (楼主) 3年前

用redis getset去做锁

3年前 评论

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