重学SpringBoot. step7 高并发 秒杀
2024-10-20 18:56:18
高并发
高并发最容易出现的问题就是数据安全能不能得到保障。
你需要保证速度,又需要保证数据安全,那么速度也必然会有所下降。
所以最简单的办法就是提升硬件。或者把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;
}
}
最新文章
- MyBatis6:MyBatis集成Spring事物管理(下篇)
- 使用Red Gate Sql Compare 数据库同步工具进行SQL Server的两个数据库的结构比较、同步
- druid 配置
- Linux服务器管理: 系统的定时任务crond
- fragment切换刷新 及下拉刷新
- SVN补充
- datatable 的ajax修改参数,post可以传参处理
- ↗☻【HTML5秘籍 #BOOK#】第8章 使用CSS3
- HTTP和HTTPS详解
- JAVA的可变类与不可变类
- 在预装win8的电脑上换win7系统讲解
- HDU 1043 八数码(八境界)
- [转] spring事务管理几种方式
- iOS 之 设置横竖屏及ViewWillAppear及视图与导航控制器嵌套时的不同反应
- 结队编程-基于gui的四则运算生成器
- 图文详解AO打印(端桥模式)
- git使用.gitignore设置不生效或不起作用的问题
- spoj839Optimal Marks
- Cookie知识点总结
- Machine Learning 神器 - sklearn