redisトランザクションの制限

9184 ワード

文書ディレクトリ
  • redisトランザクション
  • 1. 記録ゲーム回数
  • 2. 在庫控除
  • redisトランザクション
    redisにはトランザクションがありますが、トランザクション内で実行されるコマンドには実際に実行される戻り値がなく、コマンドは延期実行であり、ロールバック操作はコマンド実行前にのみ発生します.これにより、redisトランザクションはコマンド戻り値を必要としない場合にのみ使用できます.
    1.ゲーム回数を記録する
    ゲームの回数は1つの記録をするだけで、正確性の要求も高くなく、戻り値の判断も必要ありません.このようなシーンはredisトランザクションでロールバック操作を行うことができます.
    @Test
        public void testMutli(){
            redisTran(false);
            System.out.println("==============");
            redisTran(true);
        }
    
        public void redisTran(boolean success){
            //     
            Jedis jedis = getResource();
            Transaction multi = jedis.multi();
            //   redis  :      
            multi.incr("gameTime");
            //           redis  ,     
            if (success){
                System.out.println("       ,redis      ");
                multi.exec();
            }else {
                System.out.println("       ,  redis    ");
                multi.discard();
            }
            System.out.println(redisOperateUtil.get("gameTime"));
        }
    

    2.在庫控除
    在庫の減額は、戻り値が残っているかどうかを判断する必要があり、redisトランザクションブロック内では満たされないため、このような在庫シーンには適用されません.
    @Test
        public void testMutli(){
            redisTran(false);
            System.out.println("==============");
            redisTran(true);
        }
    
        public void redisTran(boolean success){
            //     
            Jedis jedis = getResource();
            Transaction multi = jedis.multi();
            //   redis  :    ,     ,          ,redis                  ,        
            multi.decr("stock");
            //           redis  ,     
            if (success){
                System.out.println("       ,redis      ");
                multi.exec();
            }else {
                System.out.println("       ,  redis    ");
                multi.discard();
            }
            System.out.println(redisOperateUtil.get("stock"));
        }