后台秒杀架构设计与实现(一)

本文只讲处理秒杀请求、减库存操作,前端的CDN加速,防作弊,防刷不在此列;本文利用redis watch实现乐观锁来处理减库存请求。
本文适用于用户量大,商品库存量少场景,若是库存量大场景,适合队列异步实现。

  • 流程图

测试入口类

package com.liushao.redislockframework;import java.util.Date;
import java.util.UUID;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;import redis.clients.jedis.Jedis;/*** 测试抢购*/
public class SecKillTest {public static void main(String[] args) {final String watchkey = "watchkey";ExecutorService executor = Executors.newFixedThreadPool(200);Jedis jedis = RedisUtils.getJedis();jedis.set(watchkey, "0");// 重置watchkey为0jedis.del("setsucc", "setfail");// 清空抢成功、失败两个setRedisUtils.returnResource(jedis);long starttime = new Date().getTime();//模拟100万人抢10个商品for (int i = 0; i < 1000000; i++) {executor.execute(new SecKillThread(UUID.randomUUID().toString(), starttime));}executor.shutdown();}
}

redis连接池

package com.liushao.redislockframework;import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;public class RedisUtils {private RedisUtils(){}private static  JedisPool jedisPool = null;//获取链接public static synchronized Jedis getJedis(){if(jedisPool==null){JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();//指定连接池中最大空闲连接数jedisPoolConfig.setMaxIdle(10);//链接池中创建的最大连接数jedisPoolConfig.setMaxTotal(100);//设置创建链接的超时时间jedisPoolConfig.setMaxWaitMillis(2000);//表示连接池在创建链接的时候会先测试一下链接是否可用,这样可以保证连接池中的链接都可用的。jedisPoolConfig.setTestOnBorrow(true);jedisPool = new JedisPool(jedisPoolConfig, "127.0.0.1", 6379);}return jedisPool.getResource();}//返回链接public static void returnResource(Jedis jedis){jedisPool.returnResourceObject(jedis);}}

具体实现类

package com.liushao.redislockframework;import java.util.Date;
import java.util.List;import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;public class SecKillThread implements Runnable {final String watchkey = "watchkey";// 监视keysfinal int sku_num = 10; //总库存private long starttime; //秒杀开始时间private String userid;  //用户idprivate static boolean flag = true; //秒杀结束标识public SecKillThread(String userid, long starttime) {this.userid = userid;this.starttime = starttime;}public void run() {if (flag) {Jedis jedis = RedisUtils.getJedis();try {jedis.watch(watchkey);// watchkeysint succ_count = Integer.valueOf(jedis.get(watchkey));if (succ_count < sku_num) {Transaction tx = jedis.multi();// 开启事务tx.incr(watchkey);List<Object> list = tx.exec();// 提交事务,如果此时watchkey被改动了,则返回nullif (list != null) {System.out.println("用户:" + userid + "抢购成功,当前抢购成功人数:"+ (succ_count + 1));//抢购成功业务逻辑jedis.sadd("setsucc", userid);//可直接入库持久化//。。。。} else {System.out.println("用户:" + userid + "抢购失败");/* 抢购失败业务逻辑 */jedis.sadd("setfail", userid);}} else {//抢购结束,拒绝后续申请flag = false;//System.out.println("抢购结束");jedis.sadd("setfail", userid);return;}} catch (Exception e) {e.printStackTrace();} finally {RedisUtils.returnResource(jedis);System.out.println("总耗时:" + (new Date().getTime() - starttime));}}}
}

后台秒杀架构设计与实现(一)相关推荐

  1. 电商扣减库存_电商系统秒杀架构设计

    作者:曹林华 https://blog.51cto.com/13527416/2085258 前言 最近在部门内部分享了原来在电商业务做秒杀活动的整体思路,大家对这次分享反馈还不错,所以我就简单整理了 ...

  2. 泥瓦匠:秒杀架构设计实践思路(一)

    2019独角兽企业重金招聘Python工程师标准>>> 企业级一站式软件研发协作平台   摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSo ...

  3. 百万级电商秒杀架构设计

    [业务背景] 你作为一个电商创业公司的架构师,负责设计 6.18 大促秒杀系统的设计,你们的业务模式如下: 1. 你们挑选选品各大电商平台上畅销和好评的商品进行销售,每个品类不超过 20 个商品,目前 ...

  4. 如何构建千万用户级别 后台数据库架构设计的思路

    关于如何构建千万级别用户的后台数据库架构话题,在ITPUB及CSDN论坛都有不少网友提问,新型问答网站知乎上也有人提问,并且顺带梳理了下思路,方便更多的技术朋友有章可循,整理一篇抛砖引玉性的文章. 一 ...

  5. zsy后台管理系统-架构设计

    Zsy框架总体架构设计 1.Mysql数据库,存储所有表的数据. 2.Zsy-基础项目(Zsy-Model,Zsy-Dao,Zsy-Service,Zsy-Web),基于SSM框架.项目功能包含基本的 ...

  6. 千万级别高并发秒杀架构设计

    每到节假日期间,一二线城市返乡.外出游玩的人们几乎都面临着一个问题:抢火车票!虽然现在大多数情况下都能订到票,但是放票瞬间即无票的场景,相信大家都深有体会.尤其是春节期间,大家不仅使用12306,还会 ...

  7. java秒杀架构设计_秒杀系统设计架构与实现

    最近https://blog.csdn.net/qq_27631217/article/details/80657271做了一个点餐的平台,其中涉及到一个很重要的问题,活动期间的秒杀系统的实现. 抢购 ...

  8. 网站后台主流架构设计参考(图文)

    整体: 解读: 模拟三种客户端访问百度(www.baidu.com)服务器,理论上我们发送的url请求(即ip地址加端口号)通过防火墙后会默认只能访问百度的一台服务器 2.但现实中为了提高并发量和访问 ...

  9. JAVA秒杀mysql层实现_一文搞懂MySQL的Join,聊一聊秒杀架构设计

    正文 MySQL的Join到底能不能用 经常听到2种观点: join性能低,尽量少用 多表join时,变为多个SQL进行多次查询 其实对于上面的观点一定程度上是正确的,但不是完全正确.但之所以流传这么 ...

最新文章

  1. linux centos7如何格式化磁盘,Linux CentOS 7 磁盘格式化mke2fs、mkfs.ext4、磁盘挂载及手动增加swap空间...
  2. linux配置oracle11G监听及本地网络服务 及 数据库建库
  3. java开发属于itsm吗_【行业】IT服务管理(ITSM):IT行业变革的思考(1)
  4. Java从零开始学十五(继承)
  5. kafka权威指南读书心得
  6. 人像美颜美妆算法入门必备
  7. 企业人脸识别智能门禁系统解决方案
  8. pytorch RuntimeError: size mismatch, m1: [16 x 86016], m2: [25088 x 512] at /opt/conda/conda-bld/pyt
  9. Ruby电子书教程、经典脚本合集
  10. Monkey测试------报错日志分析参考
  11. Windows权限维持1:账号隐藏
  12. Python+Selenium练习篇13-设置浏览器下载文件默认地址
  13. 基于感应器的智能求救系统----以android为例实现
  14. JSONObject.toBean() 把jsonobject转换成实体类
  15. NORDIC Thing:52 Android App 学习之二:手机 App 蓝牙服务发现及数据读取
  16. 用户画像——persona分析法
  17. 蓝桥杯 基础练习 数列排序 Java
  18. PAT A1062 Talent and Virtue
  19. 手机软件测试电脑,(转载)如何在电脑上测试手机网站
  20. 通栏导航栏的制作,综合使用CSS属性,代码不超过30行

热门文章

  1. 淘宝店铺运营新方向, 分销模式助力店铺腾飞!
  2. 新库上线 | CnOpenData联合国大会投票信息数据
  3. 高校严查学位论文复制比!降至10%!博士论文需打印40份!
  4. IC China2019 | 清微欧阳鹏分享可重构计算技术进展及应用
  5. Tomcat 部署war文件
  6. 7个睡前习惯 让你多活10年
  7. SuperMap的桌面软件下载,以及部分功能介绍 iDesktop
  8. 小程序、H5登录授权、分享、支付流程
  9. 三星和苹果 “欢喜冤家” 闹得好欢!!
  10. u大侠装服务器系统,教你怎么使用U大侠U盘安装XP系统