redis 학습 노트-데이터 만 액세스 하 는 것 이 아 닙 니 다.
1.JedisPool.returnSource(Jedis jeids)
이 방법 은 redis 의 풀 에서 redis 연결 을 방출 하 는 것 으로 스 레 드 풀 과 같은 스 레 드 회수 관리 입 니 다.다음 데모 코드 보기:
public static void main(String[] args) {
Jedis jedis = JedisFactory.get();// redis ,
Jedis jedis2 = JedisFactory.get();
jedis.set("key1", "good job");
jedis.set("key2", "holy crap");
System.out.println(jedis.get("key1") + ", " + jedis2.get("key2"));
JedisFactory.close(jedis);// redis ,
System.out.println("redis jedis1 :");
System.out.println(jedis.get("key1") + ", " + jedis2.get("key2"));
}
redis 서버 를 열 면 인쇄 결 과 는 다음 과 같 습 니 다.
good job, holy crap
redis 탱크 회수 jedis 1 후:
good job, holy crap
상기 demo 코드 는 두 가 지 를 설명 합 니 다.
1)redis 탱크 에 저 장 된 서로 다른 redis 인 스 턴 스 의 데 이 터 를 공유 할 수 있 습 니 다.jedis 와 jeids 2 는 모두 Jedispool.getResource()방법 을 통 해 얻 은 것 입 니 다.즉,연못 에서 얻 은 서로 다른 인 스 턴 스 이지 만 jeids set 의 데 이 터 는 jeids 2 get 에서 얻 을 수 있 습 니 다.
2)탱크 의 Jedispool.returnResource(Jedis jedis)를 호출 한 후,jedis set 의 데 이 터 를 삭제 하지 않 습 니 다.
그래서 우리 가 흔히 볼 수 있 는 이상 을 이 끌 어 낸다.
java.util.NoSuchElementException: Timeout waiting for idle object
이 이상 은 남 은 redis 인 스 턴 스 를 받 지 못 해 시간 을 초과 한 것 을 나타 낸다.
질문 은 try{...}catch(Exception e){...}finally{.상기 demo 테스트 를 통 해 return 이 풀 에 준 후에 데이터 가 삭 제 될 까 봐 걱정 할 필요 가 없습니다!이것 도 내 가 줄곧 곤 혹 스 러 웠 던 곳 이다!
2.redis 의 key 관리-key 가 점점 많아 지면 어떻게 합 니까?
redis 는 많은 데 이 터 를 저장 할 수 있 고 k-v 형식 으로 저장 할 수 있 습 니 다.그것 도 높 은 병발 환경 에서 자주 사용 되 고 데이터 도 점점 많아 질 것 이다.이때 문제 가 생 겼 습 니 다.key 가 점점 많아 지 는 것 을 피 하 는 방법 이 있 습 니 다.사실은 대부분의 경우 데 이 터 는 일시 적 으로 캐 시 되 었 을 뿐 메모리 에 오래 저장 할 필요 가 없습니다.이 럴 때 키 를 관리 하 는 것 이 중요 하 다.다음 데모 코드 보기:
public static void main(String[] args) {
Jedis jedis = JedisFactory.get();
Jedis jedis2 = JedisFactory.get();
jedis.set("test1", "well done");
jedis.set("test2", "pain ends");
System.out.println(jedis.get("test1") + " " + jedis2.get("test2"));
jedis2.del("test1");
jedis2.expire("test2", 12);
System.out.println(jedis.get("test1") + " " + jedis2.get("test2"));
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("10s :" + jedis.get("test1") + " " + jedis2.get("test2"));
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(" 3s :" + jedis.get("test1") + " " + jedis2.get("test2"));
}
코드 가 완 료 된 후 인쇄 결 과 는 다음 과 같 습 니 다.
well done pain ends
null pain ends
10s 후:null pain ends
다시 3s 후:null null
인쇄 결과 키 에 대한 삭제 작업 과 키 설정 의 만 료 시간 효 과 는 동일 합 니 다.키 를 포함 한 데 이 터 를 일정 시간 후에 삭제 합 니 다.항목 에 서 는 데 이 터 를 삭제 하 는 시간 이 제어 되 지 않 기 때문에 key 의 만 료 시간 을 설정 하 는 것 이 좋 습 니 다.이 key 는 만 료 시간 을 지정 한 후에 자동 으로 메모리 에서 삭 제 됩 니 다.redis 의 메모 리 를 계속 사용 하지 않 습 니 다.
3.redis 라 이브 러 리 의"파 티 션"
redis 는 기본적으로 16 개의'라 이브 러 리'가 있 습 니 다.우 리 는 그것 을 16 개의 메모리 파 티 션 으로 이해 할 수 있 습 니 다.우 리 는 기본적으로 첫 번 째 라 이브 러 리 인 select(0),아래 demo 를 사용 합 니 다.
Jedis jedis = JedisFactory.get();// redis ,
Jedis jedis2 = JedisFactory.get();
System.out.println(jedis == jedis2);
jedis.set("key1", "good job");
// jedis.set("key2", "holy crap");
jedis2.select(1);
System.out.println(jedis.get("key1") + ", " + jedis2.get("key1"));
뛰 어 나 온 결 과 는:
false
good job, null
jedis 2 가 jedis 1 set 에 도착 하지 않 은 것 을 설명 합 니 다.이것 은 jedis 2.select(1)때 문 입 니 다.두 번 째 라 이브 러 리 를 선 택 했 기 때문에 첫 번 째 라 이브 러 리 set 의 데 이 터 를 얻 을 수 없습니다.해당 라 이브 러 리 설정 의 값 을 가 져 오 려 면 select(int index)를 먼저 가 져 와 야 합 니 다.-우 리 는 평소에 첫 번 째 라 이브 러 리 를 기본적으로 사용 하기 때문에 이 조작 을 할 필요 가 없다.
그러나 키 에 대해 서로 다른 기능 에 따라 구역 을 나 누고 결합 을 풀 고 관리 하기 쉬 운 목적 을 달성 하기 위해 서 는 서로 다른 라 이브 러 리 공간 을 선택 하 는 것 이 좋 습 니 다.다른 데 이 터 를 얻 으 려 면 먼저 어떤 라 이브 러 리 set 에 있 는 지 주의해 야 합 니 다.
-get set 는 라 이브 러 리 와 만 관련 이 있 습 니까?redis 인 스 턴 스 와 는 무관 합 니까?-같은 라 이브 러 리 에서 서로 다른 redis 인 스 턴 스 set 의 데이터 만 있 으 면 다른 redis 인 스 턴 스 를 얻 을 수 있 습 니 다.
4.redis 로 지난 한 동안 의 총 데이터,평균 데이터 등 을 통계 한다.
이것 은 내 가 그동안'사후 통계'라 는 생각 이 었 다.즉,그 동안 의 물건 을 먼저 redis 에 저장 한 다음 에 집합 한 다음 에 통 계 를 하 는 것 이다.이런 순환 효율 은 매우 낮 으 며,특히 높 은 병발 데이터 의 경우 에는 매우 낮다.그래서 우 리 는 서로 다른 통계 기준 에 따라 redis 에 들 어 갈 수 있다.예 를 들 어 jedis.incr(key)를 사용 하여 누적 하거나 jedis.incrBy(key,num)를 num 에 따라 누적 하면 통 계 를 할 때 key 에 대응 하 는 value 를 직접 가 져 올 수 있 습 니 다.왜냐하면 incr 작업 을 계속 했 기 때문에 우리 가 원 하 는 총 데이터 입 니 다.사후에 모든 데 이 터 를 누적 하 는 것 이 아 닙 니 다.lpush(key,data)는 집합 을 캐 시 할 수 있 습 니 다.통 계 를 작성 할 때 jeids.sort(key)를 사용 하여 정렬 할 수 있 습 니 다.정렬 알고리즘 을 통 해 계속 비교 하 는 것 이 아니 라 최대,최소 와 같은 지 표를 얻 을 수 있 습 니 다.
5.hmset hgetAll 에 대하 여
이것 은 value 가 map 형식 이 니 조심해 야 합 니 다!맵 에 있 는 한 Entry 의 value 가 null 이면 jedisdataexception 이상 을 보고 합 니 다.set 의 value 는 null 이 될 수 없습니다.(즉,맵 에 k-v 의 value 가 null 이면 전체 맵 이 null 이 아니 더 라 도 잘못 보고 할 수 있 습 니 다!)
따라서 일반적으로 hmset 를 사용 하 는 것 을 피 합 니 다.오류 가 발생 하기 쉬 울 뿐만 아니 라,당신 이 가 져 올 때 맵 을 먼저 얻 은 다음 맵 에서 대응 하 는 키 로 value 를 가 져 오 면 효율 이 매우 낮 습 니 다.
-redis 의 강 함 에 대해 서 는 간단 한 demo 에서 테스트 할 수 있 습 니 다.