首頁  >  問答  >  主體

mysql - php请求卡库保存多条数据

从其他程序推送数据到php程序里, 然后对数据进行判断是否存在,存在则退出;不存在则插入数据库, 并返回处理结果到数据源
当流量大,出现卡库的情况, 返回不到结果到数据源。就会重复请求3次。最后的结果就是3次请求的数据都插入了
慢导致判断不到数据是否存在。大神们,有什么好的解决办法吗?
升级配置是一方面. 在程序上应该怎么解决这个问题呢

迷茫迷茫2772 天前368

全部回覆(6)我來回復

  • 高洛峰

    高洛峰2017-04-10 15:48:20

    我觉得你的重复这个和卡库并没有太大关系, 流量大的时候对数据库做高并发的插入处理, 这种方式本身就可能有问题, 在这种情况情况下, 是不是可以通过队列(使用redis就可以实现)来防止你的插入重复的问题会比较好一些呢.
    至于卡库, 当然是和流量有关系了, 对此, 你可以把库进行主从配置, 主库用来写, 从库用来读, 这样读的压力就不会落在主库上面了, 也就不会太卡,同时, 对于读的操作, 必要添加一些缓存, memcached, redis都很不错

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-10 15:48:20

    首先一个问题,你是如何判断这条数据是唯一的?如果必须先插入才知道,那我建议使用redis做一个锁,对你这个用户的操作加锁,然后去改数据库。

    回覆
    0
  • 高洛峰

    高洛峰2017-04-10 15:48:20

    mysql没有upsert比较遗憾
    当然自己实现一个upsert也可以 如果数据能hash的话 可以利用类似bloom filter的方法在内存里先过滤一道
    不准的再去查数据库

    回覆
    0
  • 巴扎黑

    巴扎黑2017-04-10 15:48:20

    单从mysql可以使用事务配合唯一索引来做到数据不重复

    回覆
    0
  • 高洛峰

    高洛峰2017-04-10 15:48:20

    这个问题是和卡库没关系,实际上应该是程序上的写法出错了。数据库是有队列的,不需要你自己去处理。
    查询-->返回-->插入

    你的问题应该出现在数据库返回给PHP的时候,又被查询了一样的不存在数据,因为返回还是不存在,所以PHP还是执行了插入。可以考虑用存储过程直接在数据库判断存在性然后写入。唯一索引、组合唯一也可以考虑用上。

    实际上此类的并发出现概率原则上是非常低的,你可以检查下是不是使用了多线程配置这个网站了。

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 15:48:20

    多谢几位了.

    回覆
    0
  • 取消回覆