重学SpringBoot. step7 高并发 秒杀

该博客探讨了在高并发环境下如何确保数据安全,同时处理大量请求。提出使用Redis作为缓存来提高处理速度,并通过凌晨处理数据来避免高峰期压力。还讨论了秒杀抢购场景下的库存管理策略,利用版本号进行并发控制。此外,建议采用集群和硬件升级以增强服务器处理能力。

高并发

高并发最容易出现的问题就是数据安全能不能得到保障。

你需要保证速度,又需要保证数据安全,那么速度也必然会有所下降。

所以最简单的办法就是提升硬件。或者把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;
    }

}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值