高并发下的数据安全

我们知道在多线程写入同一个文件的时候,会存现“线程安全”的问题(多个线程同时运行同一段代码,如果每次运行结果和单线程运行的结果是一样的,结果和预期相同,就是线程安全的)。如果是MySQL数据库,可以使用它自带的锁机制很好的解决问题,但是,在大规模并发的场景中,是不推荐使用MySQL的。秒杀和抢购的场景中,还有另外一个问题,就是“超发”,如果在这方面控制不慎,会产生发送过多的情况。我们也曾经听说过,某些电商搞抢购活动,买家成功拍下后,商家却不承认订单有效,拒绝发货。这里的问题,也许并不一定是商家奸诈,而是系统技术层面存在超发风险导致的。

1. 超发的原因

假设某个抢购场景中,我们一共只有100个商品,在最后一刻,我们已经消耗了99个商品,仅剩最后一个。这个时候,系统发来多个并发请求,这批请求读取到的商品余量都是99个,然后都通过了这一个余量判断,最终导致超发。(同文章前面说的场景)

在上面的这个图中,就导致了并发用户B也“抢购成功”,多让一个人获得了商品。这种场景,在高并发的情况下非常容易出现。

2. 悲观锁思路

解决线程安全的思路很多,可以从“悲观锁”的方向开始讨论。

悲观锁,也就是在修改数据的时候,采用锁定状态,排斥外部请求的修改。遇到加锁的状态,就必须等待。

虽然上述的方案的确解决了线程安全的问题,但是,别忘记,我们的场景是“高并发”。也就是说,会很多这样的修改请求,每个请求都需要等待“锁”,某些线程可能永远都没有机会抢到这个“锁”,这种请求就会死在那里。同时,这种请求会很多,瞬间增大系统的平均响应时间,结果是可用连接数被耗尽,系统陷入异常。

3. FIFO队列思路

那好,那么我们稍微修改一下上面的场景,我们直接将请求放入队列中的,采用FIFO(First Input First Output,先进先出),这样的话,我们就不会导致某些请求永远获取不到锁。看到这里,是不是有点强行将多线程变成单线程的感觉哈。

然后,我们现在解决了锁的问题,全部请求采用“先进先出”的队列方式来处理。那么新的问题来了,高并发的场景下,因为请求很多,很可能一瞬间将队列内存“撑爆”,然后系统又陷入到了异常状态。或者设计一个极大的内存队列,也是一种方案,但是,系统处理完一个队列内请求的速度根本无法和疯狂涌入队列中的数目相比。也就是说,队列内的请求会越积累越多,最终Web系统平均响应时候还是会大幅下降,系统还是陷入异常。

4. 乐观锁思路

这个时候,我们就可以讨论一下“乐观锁”的思路了。乐观锁,是相对于“悲观锁”采用更为宽松的加锁机制,大都是采用带版本号(Version)更新。实现就是,这个数据所有请求都有资格去修改,但会获得一个该数据的版本号,只有版本号符合的才能更新成功,其他的返回抢购失败。这样的话,我们就不需要考虑队列的问题,不过,它会增大CPU的计算开销。但是,综合来说,这是一个比较好的解决方案。

有很多软件和服务都“乐观锁”功能的支持,例如Redis中的watch就是其中之一。通过这个实现,我们保证了数据的安全。

转载于:https://www.cnblogs.com/wirr/p/8548156.html

java高并发下的数据安全相关推荐

  1. java高并发下数据入库

    java高并发下数据入库 该服务利用线程池并结合缓存类来处理高并发下数据入库问题,做到实时数据存入redis和数据批量入库,使用的时候需要修改为自己的业务数据,该模块是根据下面的设置进行高并发处理. ...

  2. Java 高并发下的实践

    一.使用的技术 HashMap ConcurrentHashMap Lock ReadWriteLock synchronized 二.一百万并发下的组合 ConcurrentLockMap /** ...

  3. 高级JAVA - 高并发下接口限流 Semaphore

    Semaphore的介绍 Semaphore, 是JDK1.5的java.util.concurrent并发包中提供的一个并发工具类 Semaphore字面意思即信号量 , 个人认为比较容易理解的说法 ...

  4. java高并发如何保证数据安全

    我们在项目开发的时候经常出现线程安全的问题,那么我们面对数据库MySQL的安全,如何解决呢?大部分人会说可以使用锁,利用数据库自带的锁机制可以解决问题,但是在高并发的情况下,MySQL自带的锁已经无法 ...

  5. 玩转MySQL:了解高并发下保证数据安全的锁机制吗

    引言 锁!这个词汇在编程中出现的次数尤为频繁,几乎主流的编程语言都会具备完善的锁机制,在数据库中也并不例外,为什么呢?这里牵扯到一个关键词:高并发,由于现在的计算机领域几乎都是多核机器,因此再编写单线 ...

  6. 电商网站高并发下的数据安全

    我们知道在多线程写入同一个文件的时候,会存现"线程安全"的问题(多个线程同时运行同一段代码,如果每次运行结果和单线程运行的结果是一样的,结果和预期相同,就是线程安全的).如果是My ...

  7. java如何保证数据安全_java高并发下怎么保障数据安全?有哪些办法?

    近些年科技发展水平越来越快速了,这也促使了大家对于新兴软件的学习.尤其是对于java的渴求更是明显,这也进一步说明了java功能的强大.今天就来为大家介绍一下java高并发下怎么保障数据安全以及有哪些 ...

  8. 高并发下的秒杀系统架构设计实战!

    1.秒杀业务分析 正常电子商务流程 (1)查询商品: (2)创建订单: (3)扣减库存: (4)更新订单: (5)付款: (6)卖家发货: 秒杀业务的特性 (1)低廉价格: (2)大幅推广: (3)瞬 ...

  9. Java 高并发解决方案(电商的秒杀和抢购)

    电商的秒杀和抢购,对我们来说,都不是一个陌生的东西.然而,从技术的角度来说,这对于Web系统是一个巨大的考验.当一个Web系统,在一秒钟内收到数以万计甚至更多请求时,系统的优化和稳定至关重要.这次我们 ...

最新文章

  1. 主成分与因子分析异同_因子分析
  2. 关于解决安装pwndbg问题sys.stderr.write(f“ERROR: {exc}“) /usr/bin/python3.5: No module named ensurepip
  3. 使用Oracle LogMiner分析archived log
  4. mysql 处理文本数据_MySQL ------ 数据处理函数(文本、日期、数值)(十)
  5. API接口设计 注意问题
  6. 鸟哥linux 私房菜
  7. 边缘计算精华问答 | 为什么需要边缘计算?
  8. [论文阅读] Active Class Incremental Learning for Imbalanced Datasets
  9. android 自定义paint,Android自定义View中Paint、Rect、Canvas介绍(一)
  10. 循环神经网络系列(二) LSTM 和 GRU
  11. 华为简单静态路由配置
  12. html中响应ocx事件,JS实现OCX控件的事件响应示例
  13. Python开发——做一个简单的【表白墙】网站
  14. unicloud云开发---uniapp云开发(一)---服务空间创建以及部署一个云函数
  15. android打印机没反应了,使用蓝牙打印机在Android中打印不起作用
  16. app常见专项测试点
  17. 通过kk录像机及快剪辑软件进行视频录制并转gif动图
  18. 对数据集使用GLCM(灰度共生矩阵)进行纹理提取
  19. 联名梅赛德斯-AMG F1车队,Redmi K50电竞版首发
  20. Github上Stars最多的53个深度学习项目

热门文章

  1. 小小的吹一下集结号~
  2. Linux/UNIX网络编程之API
  3. Visual Studio Code (VScode)支持哪些编程语言
  4. C C++ 面试知识总结,包含STL,数据结构等
  5. mysql二维转一维_二维数组转为一维数组
  6. java字符串 大括号_string.format格式化字符串中转义大括号“{}”
  7. 已知旋转矩阵求角度_如何推导旋转矩阵
  8. python supper_python supper()函数
  9. 华为eNSP安装使用教程 故障解决
  10. for循环里radio多选_Max里的for循环