java抢购_java redis 实现抢购秒杀
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 实现抢购秒杀相关推荐
- redis java应用_Java+Redis应用(第一章)
hello: 大家好 我是1987 今天我给大家带来Java + Redis 应用,这些都是我平时的总结),希望对大家有用. 首先: 我带大家简单的了解一下Redis Redis常用数据类型(最为常用 ...
- 基于秒杀系统解决超卖、限流、Redis限时抢购等问题
完整项目请见:https://gitee.com/JiaBin1 一.什么是秒杀 秒杀最直观的定义:在高并发场景下而下单某一个商品,这个过程就叫秒杀 [秒杀场景] 火车票抢票 双十一限购商品 热度高的 ...
- java redis实现抢购_【抢购/秒杀】redis实现高并发下的抢购/秒杀功能
问题: 抢购/秒杀是如今很常见的一个应用场景,那么高并发竞争下如何解决超抢(或超卖库存不足为负数的问题)呢? 常规写法: 查询出对应商品的库存,看是否大于0,然后执行生成订单等操作,但是在判断库存是否 ...
- 简单秒杀系统中的redis限时抢购
为什么要限时? 上一篇文章介绍了如何在大数据量用户的请求下对请求数量做限制,也就是接口限流.在实际的秒杀中,除了要考虑接口限流外,还要考虑即使用户通过了令牌桶算法的限流,但是也可能在要秒杀商品的时候( ...
- Redis两种秒杀抢购思路
方式一:使用DECR减库存 /** * 外卡进入减库存 * @param competitionQuarterInDTO * @return */@Overridepublic int otherCa ...
- redis使用watch秒杀抢购思路
1.使用watch,采用乐观锁 2.不使用悲观锁,因为等待时间非常长,响应慢 3.不使用队列,因为并发量会让队列内存瞬间升高 package com.javartisan.concurrent;i ...
- JAVA很多人在线抢单怎么解决_java redis做app后台 怎么实现多人抢单
java jfinal和redis作为后台.具体流程是: app端:app有信息展示,用户选择一条信息进入详细,然后点击抢单按钮,这时携带2个id参数发送给后台 后台:根据2个id,修改订单表的状态和 ...
- Spring Boot + redis解决商品秒杀库存超卖,看这篇文章就够了
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:涛哥谈篮球 来源:toutiao.com/i68366119 ...
- Redis轻松实现秒杀系统
点击关注公众号,实用技术文章及时了解 什么是秒杀 秒杀场景一般会在电商网站举行一些活动或者节假日在12306网站上抢票时遇到.对于电商网站中一些稀缺或者特价商品,电商网站一般会在约定时间点对其进行限量 ...
最新文章
- javascript功能_功能性JavaScript简介
- 刷了几千道算法题,我私藏的刷题网站都在这里了
- 编程面试中的十个常见错误
- JPA2.0回调函数的使用
- 大连理工计算机专业等级,大连理工计算机专业全国排第几呀
- 2.1 《数据库系统概论》关系数据结构及形式化定义(关系、关系模式、关系数据库)
- 24.内存操作Copy-Move-Clone.rs
- Spring Boot 内嵌容器 Tomcat / Undertow / Jetty 优雅停机实现
- 拳王虚拟项目公社:2020主流的虚拟资源项目,最新最全自动化系统玩法
- NextPermutation,寻找下一个全排列
- 这就是艺术「GitHub 热点速览 v.22.25」
- Java中的命名规范总结
- 对两个等长升序的序列查找中位数
- 输入框事件监听(三):blur与change的差异
- 高德搜索POI:以获取小区数据为例
- Python(Tuirtle库)简单动画--升旗
- Python语言在地球科学领域中的应用
- ABOV单片机外部引脚中断EINT实现讲解及示例代码-[MC96F6332D]
- 《Head First 设计模式》:代理模式
- FS-LDM第一讲-----金融业务逻辑数据模型