[Redis 캐 시 메커니즘]Java 연결 상세 설명 RedisJedis_사무.
우 리 는 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;
}
}
}
}
다시 실행 하고 효과 보기:워 치 명령 이 실 행 된 후 트 랜 잭 션 이 제출 되 기 전에 데이터 가 수정 되 었 을 경우 트 랜 잭 션 이 성공 하지 못 하고 데이터 의 안전성 을 확보 한 다 는 뜻 이다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.