1.環(huán)境準備
eclipse + redis
2.具體實現(xiàn)
需求:某公司實現(xiàn)秒殺環(huán)節(jié),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做代碼具體實現(xiàn)
入口類
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();
//創(chuàng)建一個線程池
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();
}
}
具體業(yè)務邏輯
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 監(jiān)視一個key议薪,當這個key的值發(fā)生改變時候,事務提交失敗
jedis.watch(key);
String string = jedis.get(key);
//得到商品的數(shù)量
int currentnum = Integer.parseInt(string);
if (currentnum <= num && currentnum >= 1) {
//進行秒殺環(huán)節(jié)
//開啟事務
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()+")"+"搶購商品成功醇锚,當前搶購成功人數(shù)為:"+(1-(currentnum-100)));
}
}
}else {
System.out.println("商品一已經(jīng)被搶購完");
}
}
}
模擬一千個人同時搶購100部手機捅位,使用redis做,redis是單線程操作搂抒,當事務被破壞時候艇搀,當前事務被破壞,達到多人搶購的效果
具體代碼:碼云https://gitee.com/zhangqiye/redis_second_kill/tree/master/Redis
也可加群共同探討:552113611
歡迎各位指正
fd