zoukankan      html  css  js  c++  java
  • 秒杀系统分析

    一、秒杀核心业务分析

    应用:商品抢购、优惠券的领取

    技术难点:

    • 短时高并发、负载压力大
    • 读多写少
    • 竞争资源有限,不能多买,不能少买,不能重买

    重要点:修改库存

    二、关于锁的那些事:


    1、悲观锁:在数据处理过程中,将数据处于锁定状态【依靠数据库提供的锁机制】
    使用场景:写多读少,保证数据安全

    2、乐观锁:在数据提交更新是,才会正式对数据的冲突与否进行检测。如果发现冲突,让用户决定如何去做或者程序自动重试。
    使用场景:读多写少,提高系统吞吐量
    乐观锁只是在更新表的那一刻锁表,其他时间不锁表,所以相对于悲观锁,吞吐量更高。

    三、秒杀核心服务实战:

    1、基于mysql通过版本号实现
    update t_goods_info
    set amount = amount - #{buys} , version = version+1
    where code = #{code} and version = #{version}

    缺点:需要加version字段

    2、基于mysql通过状态实现
    update t_goods_info
    set amount = amount - #{buys}
    where code = #{code} and amount - #{buys} >=0


    3、使用缓存:
    基于redis实现:利用watch指令在redis事务中提供CAS的能力

    基于memcached的cas机制实现:
    读取数据-〉比较版本 -〉更新数据

    • 通过gets命令获取数据库版本号
    • 检查库存是否大于购买数量
    • 使用cas更新商品库存(带版本号),如果更新失败,当前线程休眠重试,并错峰执行,避免请求同一时间并发。

    数据库乐观锁实现的优点:简单高效、稳定可靠,缺点:并发能力低,数据库并发瓶颈值300-700

    四、秒杀系统架构设计

  • 相关阅读:
    精简菜单和完整菜单之间进行切换
    QBC运算符含义
    STL源代码剖析——STL算法stl_algo.h
    TI_DSP_corePac_带宽管理
    scrapy-redis源代码分析
    SVG 贝塞尔曲线控制【方便设置】:贝塞尔曲线
    Zoj 2100 Seeding
    快慢指针和链表原地反转
    Gradle 编译多个project(包括多Library库project依赖)指导
    供应商地点信息更新
  • 原文地址:https://www.cnblogs.com/wjh123/p/11530720.html
Copyright © 2011-2022 走看看