1.加锁
缺点:降低性能
优点:减少代码逻辑复杂度(题主现在这样超过1w条就删数据的逻辑,感觉看起来就点糟糕啊,如果整个系统一复杂,这样的来回写数据,你确定你的逻辑还维护得下去?建议题主梳理一下代码的逻辑流)

2.队列(redis/各类mq等)
缺点:引入其他组件,增加系统复杂度,降低稳定性。
优点:能够将web的并行逻辑串行,其实和加锁差不多,不过更优雅,并且性能上面也更可控。如果题主的系统的逻辑复杂,推荐采用这种。

建议:php写多你会发现,它的逻辑就是一波流的。在它的逻辑层实现过多的重试,等待,以及回写,会导致php很臃肿。建议要么在数据库层上锁,要么引入队列等待,要么就直接报错,让用户F5重试,如果用ajax重试,几乎没有用户体验上的问题。那么来说一下直接报错的方案。

3.建一个计数器表
举例:
create table store_count (total int(11) NOT NULL) ENGINE=InnoDB
抢计数器:
如果我查出来现在总数是2,那么我 update store_count set total = 3 where total = 2
如果更新成功,说明现在的总行数是3,可以去插表,如果未更新,说明这时已经有其他用户插入了,直接给用户报错,让他下次请求再来过。

缺点:这种方式其实比前两个更粗暴,前2种方式还是等待的,这种方式直接丢弃了部分用户流量,带来的是一个有缓存特性的计数器来实现题主提的逻辑。
这个计数器在内存中效果更佳。

建议题主根据自身的系统状况,和代码逻辑,进行性能、开发效率、逻辑成本、维护成本上的取舍。

 
 
===================================================================================
 
用一个计数器
我最近在做一个项目 高并发选课系统
每次insert之前先计数器+1然后判断他的值是否大于max
如果大于max计数器自减1 类似回滚
如果小于max 执行insert语句

ps:计数器自增和自减需要保证其原子性
推荐Redis来做计数器 max也可以用redis来存.

 
====================================================================================
用队列
====================================================================================
加锁就行,要么锁表,要么锁程序,加了锁就相当于变成队列执行,一次只能一个人拿到锁,只能一个人通过,去插入数据。
php里可以使用文件锁,或memcached锁也行,文件锁会导致阻塞。
可以搜索:php锁,php文件锁

php 高并发下数据同步的问题的更多相关文章

  1. 高可用的并行MySQL数据同步及分布式

    首先聊聊MySQL的数据分布式,目前最为常用的就是Replication(复制)技术.基于此技术外延开来有很多中架构,分类归结为如下:      1.树状结构(Master,Backup-Master ...

  2. C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 VC中进程与进程之间共享内存 .net环境下跨进程、高频率读写数据 使用C#开发Android应用之WebApp 分布式事务之消息补偿解决方案

    C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing). ...

  3. JAVA跨域、RestTemplate高并发下异常与配置、JSON数据Long转String

    ## 跨域支持 import org.springframework.context.annotation.Bean; import org.springframework.context.annot ...

  4. 20、高可用数据同步工具drbd介绍

    20.1.什么是drbd: 20.2.drbd的工作原理: 20.3.drbd的同步模式: 1.实时同步模式: 2.异步同步模式: 20.4.drbd生产应用场景: 1.生产场景中drbd常用于基于高 ...

  5. Redis 高可用篇:你管这叫主从架构数据同步原理?

    在<Redis 核心篇:唯快不破的秘密>中,「码哥」揭秘了 Redis 五大数据类型底层的数据结构.IO 模型.线程模型.渐进式 rehash 掌握了 Redis 快的本质原因. 接着,在 ...

  6. 高可用数据同步方案-SqlServer迁移Mysql实战

    简介 随着业务量的上升,以前的架构已经不满足业务的发展,数据作为业务中最重要的一环,需要有更好的架构作为支撑.目前我司有sql server转mysql的需求,所以结合当前业务,我挑选了阿里云开源的一 ...

  7. 高并发下的Java数据结构(List、Set、Map、Queue)

    由于并行程序与串行程序的不同特点,适用于串行程序的一些数据结构可能无法直接在并发环境下正常工作,这是因为这些数据结构不是线程安全的.本节将着重介绍一些可以用于多线程环境的数据结构,如并发List.并发 ...

  8. [Redis] - 高并发下Redis缓存穿透解决

    高并发情况下,可能都要访问数据库,因为同时访问的方法,这时需要加入同步锁,当其中一个缓存获取后,其它的就要通过缓存获取数据. 方法一: 在方法上加上同步锁 synchronized //加同步锁,解决 ...

  9. 转载:MySQL和Redis 数据同步解决方案整理

    from: http://blog.csdn.net/langzi7758521/article/details/52611910 最近在做一个Redis箱格信息数据同步到数据库Mysql的功能. 自 ...

随机推荐

  1. WebSocket的原理,以及和Http的关系

    一.WebSocket是HTML5中的协议,支持持久连接:而Http协议不支持持久连接. 首先HTMl5指的是一系列新的API,或者说新规范,新技术.WebSocket是HTML5中新协议.新API. ...

  2. java实现UDP聊天---转载

    import java.io.*; import java.net.*; class Send implements Runnable { private DatagramSocket ds; pub ...

  3. redis的适应场景

    redis应用场景: 1.对数据高并发读写 2.对海量数据的高效存储和访问 3.对数据的高可扩展性和高可用性 做分布式扩展很简单,因为没有固定的表结构 redis介绍: redis是一个key-val ...

  4. 水电pd建表

    drop table ADMINSTER cascade constraints; /========================================================= ...

  5. 6.编写一个Java应用程序,该应用程序包括2个类:Print类和主类E。Print 类里有一个方法output()功能是输出100 ~ 999之间的所有水仙花数(各位数字的 立方和等于这个三位数本身,如: 371 = 33 + 73 + 13。)在主类E的main方法中来 测试类Print。

    Print类: package com.bao; public class Print { int g,s,b; void outPut() { for(int i=100;i<1000;i++ ...

  6. 创建mysql数据表成功

    create table picindex(id int NOT NULL AUTO_INCREMENT,userName varchar(255) NOT NULL,cur int(11) NOT ...

  7. zendstudio 安装 手册

    安装 http://jingyan.baidu.com/article/b907e627b14fbb46e6891c65.html 选择baidu官方32bit安装 补丁破解网址 http://dwt ...

  8. Oracle Day05 集合与数据处理

    1.集合 --集合操作: 并集.交集.差. select deptno,job,sum(sal) from emp group by deptno,job union select deptno,to ...

  9. android开发注意点

    一.Android编码规范 1.java代码中不出现中文,最多注释中可以出现中文 2.局部变量命名.静态成员变量命名 只能包含字母,单词首字母出第一个外,都为大写,其他字母都为小写 3.常量命名 只能 ...

  10. 怎么破解Wifi密码

    破解无络网络Wifi密码,让手机上Wifi不再受限. 方法/步骤 1 上网搜索并下载“Wfi万能钥匙”APK程序,然后将其安装到手机内存中.可以借助手机类管理软件将APK应用安装到手机中. 步骤阅读 ...