业务场景
有个查询系统,用户查询的时候,如果数据库没有数据,就需要调用第三方查询接口获取数据,然后把数据插入到数据库,再从数据库查出数据返回给用户。【系统基于PHP开发】
问题描述
如果多个用户查询的时候,就会存在多个请求同时去第三方接口查询,就出现了数据重复插入的问题了。
请问这种问题如何解决呢?
是调用第三方接口的时候,用Redis
来保证只有一个请求到第三方,从而避免数据的重复查询和插入,还是有其他什么好的方法呢?具体要怎么实现呢?
谢谢!
有个查询系统,用户查询的时候,如果数据库没有数据,就需要调用第三方查询接口获取数据,然后把数据插入到数据库,再从数据库查出数据返回给用户。【系统基于PHP开发】
如果多个用户查询的时候,就会存在多个请求同时去第三方接口查询,就出现了数据重复插入的问题了。
请问这种问题如何解决呢?
是调用第三方接口的时候,用Redis
来保证只有一个请求到第三方,从而避免数据的重复查询和插入,还是有其他什么好的方法呢?具体要怎么实现呢?
谢谢!
//定义锁的时间秒数
$lockSecond = 5;
//获取锁定状态
$lockKey="xxx";
$lockStatus = $redis->get($lockKey);
if ($lockStatus == 0 || empty($lockStatus)) {//无锁
//1.上锁
$redis->set($lockKey, 1, ['nx', 'ex' => $lockSecond]);
//2.业务操作
//3.解锁
$redis->del($lockKey);
} else {
sleep($lockSecond);
//恢复业务操作
}
if (true == $redis_handle->set($lock_key, 1, array('nx', 'ex' => 6))) {
//插入
//清理
$redis_handle->del($lock_key);
}
5 回答3.2k 阅读✓ 已解决
3 回答3.6k 阅读✓ 已解决
1 回答4k 阅读✓ 已解决
3 回答1.8k 阅读✓ 已解决
2 回答2.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
2 回答3.1k 阅读
加锁机制。代码进入操作前检查操作是否上锁,如果锁上,中断操作。否则进行下一操作,第一步将操作上锁,然后执行代码,最后执行完代码别忘将操作锁打开。不然你下次执行就没有办法进行了。
上锁代码非常多,楼上给出的就是其中一种。redis、memcache、cache文件都可以,如果操作并发比较高的话,建议用楼上这种用redis。(其实就是使用string数据类型,给锁key赋个值{加锁},开锁就将这个key的值清空或者或赋0值 )