1. 程式人生 > 實用技巧 >Redis 模擬秒殺

Redis 模擬秒殺

建立執行緒池,準備好庫存資訊


public class Applicaiton {
    public static ThreadPoolExecutor pool = new ThreadPoolExecutor(
            10,
            100,
            10,
            TimeUnit.SECONDS,new LinkedBlockingDeque<Runnable>()
    );
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost", 6379);
        //jedis.auth()
        jedis.select(1); // 選擇庫1
        jedis.set("kill_num","50");
        jedis.del("kill_list");
        jedis.close();
        for(int i=0; i < 1000; i++) {
            pool.execute(new KillTask()); // 建立秒殺執行緒
        }
    }
}



建立執行緒任務類,實現秒殺商品任務執行緒


public class KillTask implements Runnable {

    @Override
    public void run() {
        Jedis jedis = new Jedis("localhost", 6379);
        jedis.select(1); // 選擇庫1
        jedis.watch("kill_num","kill_list");
        int num = Integer.parseInt(jedis.get("kill_num"));


        if(num >  0) {
            Transaction transaction = jedis.multi(); // 開啟事務
            transaction.decr("kill_num");
            transaction.rpush("kill_list","9483");
            transaction.exec(); // 關閉事務
        } else {
            Applicaiton.pool.shutdown();
        }
        jedis.close();
    }
}