秒杀系统-高并发的优化(代码片段)

懵懂的菜鸟 懵懂的菜鸟     2022-11-09     410

关键词:

秒杀系统面临着如下问题:
(1)无法使用cdn缓存,因为系统逻辑不可能放在cdn中。
(2)后端缓存困难:库存问题,因为运用到了mysql事务操作(设置联合主键)。
(3)一行数据竞争:热点商品,因为多个用户同时对数据库某条数据进行操作。
秒杀系统的优化方案:
(1)前端控制:暴露接口,按钮防重复提交。
(2)动静态数据分离:cdn缓存,后端Redis缓存。
(3)事务竞争优化:减少事务锁时间,把客户端逻辑放在mysql服务端,避免网络延迟和GC的影响。 GC(Garbage Collection)垃圾回收机制
使用Redis优化地址暴露接口,在dao包下新建一个cache包,然后创建一个RedisDao.java函数,在spring-dao.xml中配置redisdao构造器。
RedisDao.java:
public class RedisDao 
    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    private final JedisPool jedisPool;
    public RedisDao(String ip, int port) 
        jedisPool = new JedisPool(ip, port);
    
private RuntimeSchema<Seckill> schema = RuntimeSchema.createFrom(Seckill.class);
    public Seckill getSeckill(long seckillId) 
        try 
            Jedis jedis = jedisPool.getResource();
            try 
                String key = "seckill:" + seckillId;
                byte[] bytes = jedis.get(key.getBytes());
                if (bytes != null) 
                    Seckill seckill = schema.newMessage();
                    ProtostuffIOUtil.mergeFrom(bytes, seckill, schema);
                    return seckill;
                
             finally 
                jedis.close();
            
         catch (Exception e) 
            logger.error(e.getMessage(), e);
        
        return null;
    
    public String putSeckill(Seckill seckill) 
        try 
            Jedis jedis = jedisPool.getResource();
            try 
                String key = "seckill:" + seckill.getSeckillId();
                byte[] bytes = ProtostuffIOUtil.toByteArray(seckill, schema,
                    LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE));
                int timeout = 60 * 60; 
                String result = jedis.setex(key.getBytes(), timeout, bytes);
                return result;
             finally 
                jedis.close();
            
         catch (Exception e) 
            logger.error(e.getMessage(), e);
        
        return null;
    

针对网络延迟和GC导致的并发问题,使用存储过程,将整个事务放在mysql端完成,秒杀存储过程实现如下。
DELIMITER $$ 
CREATE PROCEDURE `seckill`.`execute_seckill`
  (in v_seckill_id bigint,in v_phone bigint,
    in v_kill_time timestamp,out r_result int)
  BEGIN
    DECLARE insert_count int DEFAULT 0;
    START TRANSACTION;
    insert ignore into success_killed
      (seckill_id,user_phone,create_time)
      values (v_seckill_id,v_phone,v_kill_time);
    select row_count() into insert_count;
    IF (insert_count = 0) THEN
      ROLLBACK;
      set r_result = -1;
    ELSEIF(insert_count < 0) THEN
      ROLLBACK;
      SET R_RESULT = -2;
    ELSE
      update seckill
      set number = number-1
      where seckill_id = v_seckill_id
        and end_time > v_kill_time
        and start_time < v_kill_time
        and number > 0;
      select row_count() into insert_count;
      IF (insert_count = 0) THEN
        ROLLBACK;
        set r_result = 0;
      ELSEIF (insert_count < 0) THEN
        ROLLBACK;
        set r_result = -2;
      ELSE
        COMMIT;
        set r_result = 1;
      END IF;
    END IF;
  END;
$$
DELIMITER ;
最后,在ServiceService.java中建立存储执行秒杀操作的函数,在SeckillDao.java实现该接口,在SeckillDao.xml中使用mybatis调用存储过程,在服务端的SeckillServiceImpl.java完成配置即可。

 

一个基于ssm框架开发的高并发电商秒杀web系统(代码片段)

0前言一个基于SSM框架的高并发秒杀系统采用IDEA+Maven+SSM+Mysql+Redis+Jetty、Bootstrap/Jquery开发。通过这个小项目,理清了基于SSM框架开发Web应用的流程以及常见的避坑方法,并在最后简单采用了Redis缓存以及MysqlProcedure对项目进行了高... 查看详情

高并发秒杀系统方案(代码片段)

1.集成Mybatis2.安装redis:redis的配置文件:这个表明任何服务器都能访问:允许后台执行:然后: 现在我们需要访问之前需要输入密码: 生成redis服务: 查看详情

谈如何设计一个秒杀系统(重点)(代码片段)

概述并发读写秒杀要解决的主要问题是:并发读与并发写。并发读的优化理念是尽量减少用户到服务端来读数据,或者让他们读更少的数据;并发写的处理原则一样,要求我们在数据库层面独立出一个库,做特殊的处理。其次,... 查看详情

ssm实战——秒杀系统之高并发优化

一:高并发点高并发出现在秒杀详情页,主要可能出现高并发问题的地方有:秒杀地址暴露、执行秒杀操作。 二:静态资源(页面)访问优化——CDNCDN,内容分发网络。我们把静态的资源(html/css/js)放在CDN上,以加快用户... 查看详情

高并发秒杀系统方案(代码片段)

项目框架搭建: DemoController:packagecom.imooc.miaosha.controller;importorg.springframework.stereotype.Controller;importorg.springframework.ui.Model;importorg.springframework.web.bind.annotation.Request 查看详情

解密秒杀系统架构:不是所有的秒杀都是秒杀(代码片段)

...#xff1f;今天,我们就一起解密高并发业务场景下典型的秒杀系统的架构。本文分享自华为云社区《【高并发】秒杀系统架构解密,不是所有的秒杀都是秒杀(升级版)!!》,作者:冰河。究竟什么... 查看详情

解密秒杀系统架构:不是所有的秒杀都是秒杀(代码片段)

...#xff1f;今天,我们就一起解密高并发业务场景下典型的秒杀系统的架构。本文分享自华为云社区《【高并发】秒杀系统架构解密,不是所有的秒杀都是秒杀(升级版)!!》,作者:冰河。究竟什么... 查看详情

ssm框架学习之高并发秒杀业务--笔记5--并发优化

前几节终于实现了这个高并发秒杀业务,现在问题是如何优化这个业务使其能扛住一定程度的并发量。一.优化分析  对于整个业务来说,首先是分析哪些地方会出现高并发,以及哪些地方会影响到了业务的性能。可能会出现... 查看详情

ssm框架学习之高并发秒杀业务--笔记5--并发优化

前几节终于实现了这个高并发秒杀业务,现在问题是如何优化这个业务使其能扛住一定程度的并发量。一.优化分析  对于整个业务来说,首先是分析哪些地方会出现高并发,以及哪些地方会影响到了业务的性能。可能会出现... 查看详情

十万级低成本超详细的秒杀高并发设计,快收藏起来(代码片段)

秒杀系统相信很多人见过,比如京东或者淘宝的秒杀,小米手机的秒杀,那么秒杀系统的后台是如何实现的呢?我们如何设计一个秒杀系统呢?对于秒杀系统应该考虑哪些问题?如何设计出健壮的秒杀系统... 查看详情

秒杀系统优化方案(下)吐血整理(代码片段)

接上篇秒杀系统优化方案(上)吐血整理3.深入优化设计3.1  初始方案问题分析在前面针对数据库的优化中,由于数据库行级锁存在竞争造成大量的串行阻塞,我们使用了存储过程(或者触发器)等技术绑定操作,整个事... 查看详情

秒杀系统设计优化(代码片段)

...相同的库存,读写冲突,锁非常严重;小米手机每周二的秒杀,可能手机只有1万部,但瞬时进入的流量可能是几百几千万;这是秒杀业务难的地方。那我们怎么优化秒杀系统呢?一、难点(1)高并发用户在秒杀开始前,通过不... 查看详情

《java——帮你解决高并发秒杀》(代码片段)

【准备】首先我们要考虑的是为什么要解决高并发,高并发瓶颈出现在哪里,有了解过的朋友肯定知道是在数据库,因为在大量请求去操作数据库时会出现数据的错乱,超卖,系统崩溃,mysql死锁等现象。【思路】(一)、页面... 查看详情

电商网站秒杀和抢购的高并发技术实现和优化

一、如何防止多个用户同时抢购同一商品,防止高并发同时订购同一商品?​最近双十一抢购系统应用频繁,销量火爆的同时,让人头疼是却是多用户高并发情况下出现的库存问题。据调查,多个用户同时下单,导致查询和插入... 查看详情

哎呀,你对高并发与多线程的解决思路了解的还挺深!(代码片段)

...挑战在过去的工作中,我曾经面对过5w每秒的高并发秒杀功能,在这个过程中,整个Web系统遇到了很多的问题和挑战。如果Web系统不做针对性的优化,会轻而易举地陷入到异常状态。我们现在一起来讨论下,优... 查看详情

实践出真知:全网最强秒杀系统架构解密,不是所有的秒杀都是秒杀!!(代码片段)

大家好,我是冰河~~很多小伙伴反馈说,高并发专题学了那么久,但是,在真正做项目时,仍然不知道如何下手处理高并发业务场景!甚至很多小伙伴仍然停留在只是简单的提供接口(CRUD)阶段ÿ... 查看详情

实践出真知:全网最强秒杀系统架构解密,不是所有的秒杀都是秒杀!!(代码片段)

大家好,我是冰河~~很多小伙伴反馈说,高并发专题学了那么久,但是,在真正做项目时,仍然不知道如何下手处理高并发业务场景!甚至很多小伙伴仍然停留在只是简单的提供接口(CRUD)阶段ÿ... 查看详情

高并发之商品秒杀系统(代码片段)

基于redis利用redis的乐观锁,实现秒杀系统的数据同步(基于watch实现)用户一:importredisconn=redis.Redis(host=‘127.0.0.1‘,port=6379)#conn.set(‘count‘,1000)withconn.pipeline()aspipe:#先监视,自己的值没有被修改过conn.watch(‘count‘)#事务开始pipe... 查看详情