redisは秒殺を実現

2555 ワード

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 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("         ");
            }
            
        }
    
    }
    

    1000人が同時に100台の携帯電話を買い占めることをシミュレートして、redisを使ってして、redisは単一のスレッドの操作で、事務が破壊される時、現在の事務は破壊されて、多くの人が買い取る効果を達成します
    具体コード:コードクラウドhttps://gitee.com/zhangqiye/redis_second_kill/tree/master/Redis
    群を加えて共同で検討することもできる:552113611
    ようこそfd