1.环境准备
eclipse + redis
2.具体实现
需求:某公司实现秒杀环节,100部手机(具体东西,自己设置)
2.1启动redis服务端
1.启动redis服务端(后台运行)
进入 DOS窗口
在进入redis的安装目录
输入:redis-server --service-install redis.windows.conf --loglevel verbose ( 安装redis服务 )
输入:redis-server --service-start ( 启动服务 )
输入:redis-server --service-stop
2.2做代码具体实现
入口类
public class MainController {
public static void main(String[] args) {
String key="shouji";
int num=100;
Jedis jedis = new Jedis("localhost");
jedis.set(key, num+"");
jedis.close();
//创建一个线程池
ExecutorService threadPool = Executors.newFixedThreadPool(20);
//模拟一千个人同时访问
for (int i =0; i < 1000; i++) {
// new Run("user"+i,key,num)
threadPool.execute(new Run("user"+i,key,num));
}
threadPool.shutdown();
}
}
具体业务逻辑
public class Run implements Runnable{
private String key;
private String name;
private int num;
public Run(String name,String key,int num) {
this.name = name;
this.key = key;
this.num = num;
}
Jedis jedis = new Jedis("localhost");
@Override
public void run() {
//redis 监视一个key,当这个key的值发生改变时候,事务提交失败
jedis.watch(key);
String string = jedis.get(key);
//得到商品的数量
int currentnum = Integer.parseInt(string);
if (currentnum <= num && currentnum >= 1) {
//进行秒杀环节
//开启事务
Transaction multi = jedis.multi();
//让商品减少一个
multi.incrBy(key,-1);
//提交事务.如果事务提交失败,返回值为空
List<Object> exec = multi.exec();
if (exec == null || exec.size()==0) {
System.out.println(name+"----抢购失败!");
}else {
for (Object object : exec) {
System.out.println(name+"("+object.toString()+")"+"抢购商品成功,当前抢购成功人数为:"+(1-(currentnum-100)));
}
}
}else {
System.out.println("商品一已经被抢购完");
}
}
}
模拟一千个人同时抢购100部手机,使用redis做,redis是单线程操作,当事务被破坏时候,当前事务被破坏,达到多人抢购的效果
具体代码:码云https://gitee.com/zhangqiye/redis_second_kill/tree/master/Redis
也可加群共同探讨:552113611
欢迎各位指正
fd