2018.10.24 今天研究了下抢购秒杀的功能实现

网上查了一大堆 用redis的最多。

主要是通过redis的 watch multi 事务来控制秒杀数量 不超卖。

这里说下自己的感受:

不超卖的话 那就要一个个的来减库存 这样的话 效率上会有点问题 这里上下代码 基本上是再网上抄的 。

我用的是 springboot jedis

我就直接上代码了

Controller层

package com.bicon.basedemo.controller;

import java.util.Arrays;

import java.util.List;

import java.util.Random;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import javax.annotation.Resource;

import org.omg.CORBA.PRIVATE_MEMBER;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import redis.clients.jedis.Jedis;

import redis.clients.jedis.JedisPool;

@RestController

@RequestMapping("/test")public classtest {//@Resource//RedisOperation redisOps;

@ResourceprivateJedisPool jedisPool;@RequestMapping("/redis")public voidredisTest() {

Jedis jedis=jedisPool.getResource();

final String watchkeys= "watchkeys";

ExecutorService executor= Executors.newFixedThreadPool(20); //20个线程池并发数

jedis.set(watchkeys, "10");//设置起始的抢购数//jedis.del("setsucc", "setfail");

jedis.close();for (int i = 0; i < 101; i++) {//设置101个人来发起抢购 模拟101个人抢购

executor.execute(newMyRunnable(jedisPool));

}

executor.shutdown();

}public static String getRandomString(int length) { //length是随机字符串长度

String base = "abcdefghijklmnopqrstuvwxyz0123456789";

Random random= newRandom();

StringBuffer sb= newStringBuffer();for (int i = 0; i < length; i++) {int number = random.nextInt(base.length());

sb.append(base.charAt(number));

}returnsb.toString();

}

}

MyRunnable 代码

package com.bicon.basedemo.controller;

import java.util.List;

import redis.clients.jedis.Jedis;

import redis.clients.jedis.JedisPool;

import redis.clients.jedis.Transaction;public classMyRunnable implements Runnable{privateJedisPool jedisPool;

String userinfo;

String watchkeys= "watchkeys";publicMyRunnable(JedisPool jedisPoo){

jedisPool=jedisPoo;

};public voidrun() {

Jedis jedis=jedisPool.getResource();try{

jedis.watch(watchkeys);//watchkeys

String val= jedis.get(watchkeys);int valint =Integer.valueOf(val);if (valint <= 100 && valint>=1) {

Transaction tx= jedis.multi();//开启事务//tx.incr("watchkeys");

tx.incrBy("watchkeys", -1);

List list = tx.exec();//提交事务,如果此时watchkeys被改动了,则返回null

if (list == null ||list.size()==0) {

System.out.println("重新抢购");this.run();return;

}else{for(Object succ : list){

String succuserifo="succ"+succ.toString() +userinfo ;

String succinfo="用户:" + succuserifo + "抢购成功,当前抢购成功人数:"

+ (1-(valint-10));

System.out.println(succinfo);/*抢购成功业务逻辑*/jedis.setnx(succuserifo, succinfo);

}

}

}else{

String failuserifo="kcfail" +userinfo;

String failinfo1="用户:" + failuserifo + "商品被抢购完毕,抢购失败";

System.out.println(failinfo1);

jedis.setnx(failuserifo, failinfo1);return;

}

}catch(Exception e) {

e.printStackTrace();

}finally{

jedis.close();

}

}

}

最后是效果

这段代码问题其实还是有的:就是没有按照顺来来抢购

其实我觉得有种方法。就是将请求 存入 kafka中

然后取kafka中前面的数据 一直取到抢购的数量(用户不重复)

这样不就可以了吗,不需要考虑超卖问题啥的。纯属自己的感想。

后来看了一个用rabbitMQ 做的 抢购

把请求插入rabbitMQ队列。然后 消费端订阅数据 来实现抢购。

2018-11-21 今天在github上看到一个秒杀的项目 还不错 分享给大家

这个里面有两个 分支,第二个分支是支持rabbitmq的。我觉得 做的还不完美。不过很有借鉴意义。

java抢购_java redis 实现抢购秒杀相关推荐

  1. redis java应用_Java+Redis应用(第一章)

    hello: 大家好 我是1987 今天我给大家带来Java + Redis 应用,这些都是我平时的总结),希望对大家有用. 首先: 我带大家简单的了解一下Redis Redis常用数据类型(最为常用 ...

  2. 基于秒杀系统解决超卖、限流、Redis限时抢购等问题

    完整项目请见:https://gitee.com/JiaBin1 一.什么是秒杀 秒杀最直观的定义:在高并发场景下而下单某一个商品,这个过程就叫秒杀 [秒杀场景] 火车票抢票 双十一限购商品 热度高的 ...

  3. java redis实现抢购_【抢购/秒杀】redis实现高并发下的抢购/秒杀功能

    问题: 抢购/秒杀是如今很常见的一个应用场景,那么高并发竞争下如何解决超抢(或超卖库存不足为负数的问题)呢? 常规写法: 查询出对应商品的库存,看是否大于0,然后执行生成订单等操作,但是在判断库存是否 ...

  4. 简单秒杀系统中的redis限时抢购

    为什么要限时? 上一篇文章介绍了如何在大数据量用户的请求下对请求数量做限制,也就是接口限流.在实际的秒杀中,除了要考虑接口限流外,还要考虑即使用户通过了令牌桶算法的限流,但是也可能在要秒杀商品的时候( ...

  5. Redis两种秒杀抢购思路

    方式一:使用DECR减库存 /** * 外卡进入减库存 * @param competitionQuarterInDTO * @return */@Overridepublic int otherCa ...

  6. redis使用watch秒杀抢购思路

    1.使用watch,采用乐观锁  2.不使用悲观锁,因为等待时间非常长,响应慢  3.不使用队列,因为并发量会让队列内存瞬间升高 package com.javartisan.concurrent;i ...

  7. JAVA很多人在线抢单怎么解决_java redis做app后台 怎么实现多人抢单

    java jfinal和redis作为后台.具体流程是: app端:app有信息展示,用户选择一条信息进入详细,然后点击抢单按钮,这时携带2个id参数发送给后台 后台:根据2个id,修改订单表的状态和 ...

  8. Spring Boot + redis解决商品秒杀库存超卖,看这篇文章就够了

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:涛哥谈篮球 来源:toutiao.com/i68366119 ...

  9. Redis轻松实现秒杀系统

    点击关注公众号,实用技术文章及时了解 什么是秒杀 秒杀场景一般会在电商网站举行一些活动或者节假日在12306网站上抢票时遇到.对于电商网站中一些稀缺或者特价商品,电商网站一般会在约定时间点对其进行限量 ...

最新文章

  1. javascript功能_功能性JavaScript简介
  2. 刷了几千道算法题,我私藏的刷题网站都在这里了
  3. 编程面试中的十个常见错误
  4. JPA2.0回调函数的使用
  5. 大连理工计算机专业等级,大连理工计算机专业全国排第几呀
  6. 2.1 《数据库系统概论》关系数据结构及形式化定义(关系、关系模式、关系数据库)
  7. 24.内存操作Copy-Move-Clone.rs
  8. Spring Boot 内嵌容器 Tomcat / Undertow / Jetty 优雅停机实现
  9. 拳王虚拟项目公社:2020主流的虚拟资源项目,最新最全自动化系统玩法
  10. NextPermutation,寻找下一个全排列
  11. 这就是艺术「GitHub 热点速览 v.22.25」
  12. Java中的命名规范总结
  13. 对两个等长升序的序列查找中位数
  14. 输入框事件监听(三):blur与change的差异
  15. 高德搜索POI:以获取小区数据为例
  16. Python(Tuirtle库)简单动画--升旗
  17. Python语言在地球科学领域中的应用
  18. ABOV单片机外部引脚中断EINT实现讲解及示例代码-[MC96F6332D]
  19. 《Head First 设计模式》:代理模式
  20. FS-LDM第一讲-----金融业务逻辑数据模型

热门文章

  1. 问道术业:Google软件测试
  2. html清除左侧,CSS清除浮动
  3. html首页我的待办,我的待办.html
  4. 计算机二级Java考试笔记
  5. 【x与y的非线性关系】回归,自变量,自变量的平方项,自变量的二次项
  6. python自动化测试学习路线(从入门到精通)
  7. 2021年六级翻译:海南岛
  8. 灰色马尔科夫链matlab,基于灰色-马尔科夫模型的电力功率预测
  9. AngularJS + RequireJS
  10. js json字符串 转为json数组