[Redis 캐 시 메커니즘]Java 연결 상세 설명 RedisJedis_사무.

8759 단어 자바jedisredis
사무
우 리 는 JDBC 를 사용 하여 Mysql 에 연결 할 때 sql 문 구 를 실행 하기 전에 사 무 를 시작 해 야 합 니 다.MyBatis 에서 도 openSession()을 사용 하여 session 트 랜 잭 션 대상 을 가 져 와 sql 실행,조회 등 을 해 야 합 니 다.우리 가 데이터베이스 에 대한 조작 이 끝 났 을 때,사무 대상 은 데이터베이스 연결 을 닫 는 것 을 책임 진다.
트 랜 잭 션 대상 은 각종 데이터 베 이 스 를 관리 하고 실행 하 는 동작 에 사용 된다.데이터베이스 연결 을 열 고 닫 으 며 sql 문 구 를 실행 하고 오 류 를 되 돌 릴 수 있 습 니 다.
우리 Redis 에 도 사무 관리 대상 이 있 습 니 다.redis.clients.jeis.Transaction 에 있 습 니 다.
Jedis 트 랜 잭 션 관련 코드:

package cn.com.redis; 
 
import redis.clients.jedis.Jedis; 
import redis.clients.jedis.Transaction; 
 
public class Test7 { 
  public static void main(String[] args) { 
    Jedis jedis = new Jedis("192.168.248.129",6379); 
     
    Transaction transaction=jedis.multi();//           
     
    //                 
    transaction.set("k4", "v4"); 
    transaction.set("k5", "v5"); 
     
    transaction.exec();//   
  } 
} 
redis 를 살 펴 보 겠 습 니 다.

데이터 가 들 어 갔 더 라 고요.
저 희 는 k4 의 value 와 k5 의 value 를'v44'와'v55'로 바 꾼 다음 에 transaction.exec()문 구 를 추가 합 니 다.transaction.discard()문 구 를 추가 합 니 다.

package cn.com.redis; 
 
import redis.clients.jedis.Jedis; 
import redis.clients.jedis.Transaction; 
 
public class Test7 { 
  public static void main(String[] args) { 
    Jedis jedis = new Jedis("192.168.248.129",6379); 
     
    Transaction transaction=jedis.multi();//           
     
    //                 
    transaction.set("k4", "v44"); 
    transaction.set("k5", "v55"); 
 
    transaction.discard();//   
  } 
} 
데이터 삽입 작업 이 스크롤 백 된 것 을 발견 할 수 있 습 니 다.redis 의 두 값 은 변경 되 지 않 았 습 니 다.

우 리 는 신용 카드 를 긁 는 거래 를 모 의 하고 redis 의 사 무 를 이용 하여 논 리 를 처리 합 니 다.

package cn.com.redis; 
 
import redis.clients.jedis.Jedis; 
import redis.clients.jedis.Transaction; 
 
public class TestTransaction { 
  //           
  public static void main(String[] args) { 
    TestTransaction t = new TestTransaction(); 
    boolean retValue = t.transMethod(100); 
    if(retValue){ 
      System.out.println("         !"); 
    }else{ 
      System.out.println("         !"); 
    } 
     
  } 
 
  /** 
   *     ,watch         ,        , 
   *                 ,       ,             
   *        。 
   * 
   *      balance,          ,       ,     ; 
   *     ,           。 
   *        balance      ,      (  exec)     , 
   *                     ,    。 
   * */ 
  private boolean transMethod(int amount) { 
     
    System.out.println("         "+amount+" "); 
     
    Jedis jedis = new Jedis("192.168.248.129",6379); 
     
    int balance = 1000;//     
    int debt;//   
    int amtToSubtract = amount;//     
     
    jedis.set("balance", String.valueOf(balance)); 
    jedis.watch("balance"); 
    //jedis.set("balance", "1100");//      ,                 
    balance = Integer.parseInt(jedis.get("balance")); 
    if(balance < amtToSubtract){//          ,     
      jedis.unwatch(); 
      System.out.println("      !"); 
      return false; 
    }else{//                  
      System.out.println("  transaction      ..."); 
      Transaction transaction = jedis.multi(); 
      transaction.decrBy("balance",amtToSubtract);//    amtToSubtract    
      transaction.incrBy("debt", amtToSubtract);//       amtToSubtract    
      transaction.exec();//     
      balance = Integer.parseInt(jedis.get("balance")); 
      debt = Integer.parseInt(jedis.get("debt")); 
      System.out.println("  transaction      ..."); 
       
      System.out.println("      :"+balance); 
      System.out.println("     :"+debt); 
      return true; 
    } 
  } 
   
} 
이 코드 는 사용자 가 신용카드 로 100 원 을 긁 은 것 을 모 의 한 것 으로 이때 신용카드 의 사용 가능 잔액 100 원 을 빼 고 100 원 의 빚 을 늘 려 야 한다.
실행 결과:

redis 결과:

우리 의 조작 이 성공 적 이라는 것 을 증명 하 다.
워 치 명령 을 추가 하 는 것 은 업무 수행 과정 에서 다른 작업 이 사 무 를 중단 하거나 업무 의 계산 결과 에 영향 을 주어'환 독','더러 운 데이터'등 이상 상황 이 발생 하 는 것 을 방지 하기 위해 서 입 니 다.watch 명령 은 키 를 만 들 었 습 니 다.실행 과정 에서 이 키 가 다른 사람 이 수정 한 것 을 발견 하면 실 패 했 습 니 다.프로그램 에 서 는 이러한 오 류 를 포착 하고 다시 실행 할 수 있 습 니 다.성공 할 때 까지.그래서 watch 명령 은 데이터 의 동기 화 안전 을 보장 할 수 있 습 니 다.
watch 명령 의 용 도 를 증명 하기 위해 서,우 리 는 위의 코드 안의 jedis.set("balance","1100")를 사용 합 니 다.주석 을 풀 고 transMethod 방법 으로 중단 이상 을 던 집 니 다:throws Interrupted Exception,main 방법 으로 중단 이상 을 포착 한 후 해당 경고 상 자 를 팝 업 합 니 다.

package cn.com.redis; 
 
import java.util.List; 
 
import redis.clients.jedis.Jedis; 
import redis.clients.jedis.Transaction; 
 
public class TestTransaction { 
  //           
  public static void main(String[] args) { 
    TestTransaction t = new TestTransaction(); 
    boolean retValue=false; 
    boolean Interrupted = false; 
     
    try { 
      retValue = t.transMethod(100); 
    } catch (InterruptedException e) { 
      Interrupted = true; 
      System.out.println("     ,     !"); 
    }finally{ 
      if(retValue){ 
        System.out.println("         !"); 
      }else{ 
        if(!Interrupted){ 
          System.out.println("         !    !"); 
        } 
      } 
    } 
  } 
 
  /** 
   *     ,watch         ,        , 
   *                 ,       ,             
   *        。 
   * 
   *      balance,          ,       ,     ; 
   *     ,           。 
   *        balance      ,      (  exec)     , 
   *                     ,    。 
   * */ 
  private boolean transMethod(int amount) throws InterruptedException{ 
     
    System.out.println("         "+amount+" "); 
     
    Jedis jedis = new Jedis("192.168.248.129",6379); 
     
    int balance = 1000;//     
    int debt;//   
    int amtToSubtract = amount;//     
     
    jedis.set("balance", String.valueOf(balance)); 
    jedis.watch("balance"); 
    jedis.set("balance", "1100");//      ,                 
    balance = Integer.parseInt(jedis.get("balance")); 
    if(balance < amtToSubtract){//          ,     
      jedis.unwatch(); 
      System.out.println("      !"); 
      return false; 
    }else{//                  
      System.out.println("  transaction      ..."); 
      Transaction transaction = jedis.multi(); 
      transaction.decrBy("balance",amtToSubtract);//    amtToSubtract    
      transaction.incrBy("debt", amtToSubtract);//       amtToSubtract    
      List<Object> result = transaction.exec();//     
       
      if(result==null){//      ,              
         
        System.out.println("  transaction      ..."); 
        throw new InterruptedException(); 
         
      }else{//       
        balance = Integer.parseInt(jedis.get("balance")); 
        debt = Integer.parseInt(jedis.get("debt")); 
        System.out.println("  transaction      ..."); 
         
        System.out.println("      :"+balance); 
        System.out.println("     :"+debt); 
         
        return true; 
      } 
    } 
  } 
   
} 
다시 실행 하고 효과 보기:

워 치 명령 이 실 행 된 후 트 랜 잭 션 이 제출 되 기 전에 데이터 가 수정 되 었 을 경우 트 랜 잭 션 이 성공 하지 못 하고 데이터 의 안전성 을 확보 한 다 는 뜻 이다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기