搜索

首页  >  问答  >  正文

php - 如何用Redis解决并发导致数据重复插入MySQL的问题?

业务场景

有个查询系统,用户查询的时候,如果数据库没有数据,就需要调用第三方查询接口获取数据,然后把数据插入到数据库,再从数据库查出数据返回给用户。【系统基于PHP开发】

问题描述

如果多个用户查询的时候,就会存在多个请求同时去第三方接口查询,就出现了数据重复插入的问题了。

请问这种问题如何解决呢?
是调用第三方接口的时候,用Redis来保证只有一个请求到第三方,从而避免数据的重复查询和插入,还是有其他什么好的方法呢?具体要怎么实现呢?
谢谢!

淡淡烟草味淡淡烟草味2826 天前747

全部回复(4)我来回复

  • 伊谢尔伦

    伊谢尔伦2017-05-16 13:03:48

    加锁机制。代码进入操作前检查操作是否上锁,如果锁上,中断操作。否则进行下一操作,第一步将操作上锁,然后执行代码,最后执行完代码别忘将操作锁打开。不然你下去执行就没有办法进行了。

    上锁代码非常多,楼上给出的就是其中一种。redismemcachecache文件都可以,如果操作并发比较高的话,建议用楼上这种用redis。(其实就是使用string数据类型,给锁key赋个值{加锁},开锁就将这个key的值清空或者或赋0值 )

    $lock_status = $redis->get('lock_state');
    if ($lock_status == 0 || empty($lock_status)) {
        $redis->set('lock_state', 3600, 1); #操作上锁
        #操作代码
        $redis->set('lock_state', 3600, 0); #操作解锁
    } else {
        #上锁后的操作
    }

    回复
    0
  • 为情所困

    为情所困2017-05-16 13:03:48

    雷雷

    回复
    0
  • 高洛峰

    高洛峰2017-05-16 13:03:48

    雷雷

    回复
    0
  • 迷茫

    迷茫2017-05-16 13:03:48

    楼主说的redis"锁"当然可行
    另外,查询出来的数据是否可以设置唯一ID?这样就是双重验证了

    回复
    0
  • 取消回复