我的脚本有时会同时从外部系统接收到2个相同的请求(以毫秒为单位)。该脚本在收到请求时向外部系统发出请求,检查是否存在条目,如果不存在,则创建该条目。问题是,对于同时请求,唯一性检查失败,结果创建了2个记录。我尝试进行随机休眠,但没有成功。$sleep = rand(1,5); sleep($sleep);
$sleep = rand(1,5); sleep($sleep);
zyfwsgd61#
我建议使用快速缓存系统,比如memcached或redis。检查一下系统是否忙碌如果不忙碌,则通过在缓存中添加标志使系统忙处理请求。取消标记忙碌标志。在处理过程中,如果有另一个请求到来,检查memcache/redis是否忙碌。如果系统忙,什么也不做。我将在这里尝试一些伪代码:
function processData($requestData) { $isSystemBusy = Cache::get('systemBusy'); if $isSystemBusy == true { exit(); } Cache::set('systemBusy', true); //do your logic here Cache::set('systemBusy', false); }
agxfikkp2#
解决方案是使用以下ID写入锁定文件:
$tmp_file = __DIR__.'/tmp/'.$origDealId.'.lock'; if (file_exists($tmp_file)) { // duplicate request return null; } else { // do something }
2条答案
按热度按时间zyfwsgd61#
我建议使用快速缓存系统,比如memcached或redis。
检查一下系统是否忙碌
如果不忙碌,则通过在缓存中添加标志使系统忙
处理请求。
取消标记忙碌标志。
在处理过程中,如果有另一个请求到来,检查memcache/redis是否忙碌。如果系统忙,什么也不做。
我将在这里尝试一些伪代码:
agxfikkp2#
解决方案是使用以下ID写入锁定文件: