어떻게 정상적으로 레디 스를 삭제는 같은 접두사 키를 설정 세트?
이 레디 스 단일 데이터 DEL을 삭제하는 명령,하지만 질량은 특정 접두사 키 명령이 삭제되지 않습니다,하지만 우리는 종종 땅에서 어떻게 다음, 비즈니스 현장에 따라 접두사를 제거 할 필요가 발생? 검색 아래의 답변을 얻을 것이다 후에 통과 할 수 있습니다 :
--raw 키를 레디 스-CLI "prefix- *"| xargs를의 레디 스-CLI 델
리눅스는 직접 모든 키에 대한 키의 레디 스 명령으로 경기의 다음 큰 위험이 겉으로는 완벽하지만, 현실에서, 삭제할 시스템 명령 xargs를 부른다. 이 폭발하는 폭탄이 준비가되어 있습니다! 우리 모두는 레디 스 서비스가 단일 스레드 모드 것을 알고, 명령 키 쿼리가 정상적인 서비스 요청을 차단할 수 있습니다 * 키를 사용하여, 레디 스도 그렇게 확실히, 다운 타임없는 결과. 따라서, 우리는 그것을 해결하기 위해 그 어떤 우아한 방법 위에 방법을 사용하여 프로덕션 환경에서 피해야한다? 스캔!
SCAN 소개
2.8 버전에서 레디 스 각각에 위해 새로운 커서, 사용자가 SCAN 명령으로이 새로운 반복 커서 커서 매개 변수를 사용할 필요가 다음 번에 반환 한 후 커서 기반의 반복자가 호출된다 SCAN 명령을 지원하기 시작했다 서버가 0의 커서 값을 반환 할 때까지 이전 반복의 연속은 완전한 탐색 과정이 끝났습니다.
다음과 같이 명령의 SCAN 기본 구문은 다음과 같습니다
주사 커서 [MATCH 패턴 [COUNT 카운트]
경기 : 커서 : 매칭 규칙은, 예를 들면, 모든 키에 시작 OPS-커피 - 기입 OPS-의 커피 - *로 이송 중간 -coffee- 함유 * * -coffee- 커서 같이 쓸 수있다
COUNT , 당신이 명령의 증분 반복 다만 힌트를 COUNT, COUNT 액션 옵션은 사용자가 각 반복에서 데이터 세트의 요소의 수를 반환해야합니다 반복 명령을 통보 할 수 있도록하는 것입니다 예를 들어, 실제 반환의 수를 나타냅니다하지 않습니다 2 세 요소로 돌아갈 수 COUNT가 제공되지만, 데이터 요소들이 양으로 리턴 COUNT 설정과 상관되며, COUNT의 디폴트 값은 10이다.
의 조작 키가 스캔 jedis 및 제거 동일한 프리픽스 키 .
공공 무효 testSetDel (Jedis의 jedis) {
은 try {
log.info ( "테스트를 시작 ---------------- ----------------- " )
initRedisData (jedis)
문자열 givenKey ="prefix_ * " ;
delValuesByKeys (givenKey, jedis)
log.info는 ( " "------------ 삭제 스캔 데이터를 사용하기 시작 )
initRedisData를 ( jedis)
은이 .delSetValues (givenKey, jedis)
설정 <문자열> 키 =의 jedis.keys (givenKey)
log.info ( "최종 ---------------- 테스트 - --------------- = "+ 같은 접두사의 주요 결과가 있는지!CollectionUtils.isEmpty (키));
} 캐치 (예외 E)는 {
log.error는 ( + "키에 해당하는 지정된 접두사 키를 삭제" ; E)
} 최종적으로 {
IF (Jedis! = null이 ) {
(jedis.close를 )
log.info ( "닫기 jedis 연결" );
}
}
}
/ **
* 자바 레디 스 지정된 접두사의 키 값에 대응 키 삭제
* @param givenKey
* @return
* /
공공 부울 delSetValues에게 (문자열 givenKey, jedis을 jedis ) 발생 예외 {
(log.info을 "삭제 데이터 세트에 흐리게하기 시작 givenKey ="+ givenKey)
목록 <문자열> 키 = getByScan (givenKey, jedis)
log.info는 ( + "삭제 키는" ; 키)
문자열 [ ] 배열 = keys.toArray ( 새로운 새 문자열 [0 ]);
jedis.del (배열),
리턴 참 ]
}
/ **
* Jedis이 키를 사용하여 지정된 프리픽스 키에 대응하는 키 삭제
* @param givenKey
* @return
* /
공공 부울 delValuesByKeys (문자열 givenKey, jedis을 jedis)이 발생 예외 {
log.info을 ("시작 퍼지 집합 데이터 삭제, givenKey ="+givenKey);
설정 <문자열>의 키 = jedis.keys (givenKey);
에 대한 {(키 문자열 키)
log.info ( "当前키是:"+ 키);
jedis.del (키);
}
반환 사실 ;
}
개인 공극 initRedisData (Jedis의 jedis) {
jedis.set ( "prefix_1333", "1" );
jedis.set ( "prefix_2KKKKK", "2" );
jedis.set ( "prefix_3哈哈哈哈哈哈", "777" );
} //使用스캔
공개 목록 <문자열>getByScan (문자열 키, Jedis의 jedis) {
목록
list.addAll (ELES); <문자열> 목록 = 새로운 ArrayList를 <> ();
ScanParams의 PARAMS = 새로운 ScanParams ();
params.match (키);
params.count ( 100 );
문자열 커서 = "0" ;
동안 ( 사실 ) {
ScanResult scanResult = jedis.scan (커서 PARAMS);
목록 <문자열> ELES = scanResult.getResult ();
만약 (! CollectionUtils.isEmpty (ELES)) {
}
커서 = scanResult.getStringCursor ();
IF ( "0" .equals (커서)) {
BREAK ;
}
}
log.info ( "데이터 세트를 발견 getByScan ============" + 목록)
반환 목록;
}
테스트 결과 :
---------------- Tests begin -----------------
开始模糊删除set中的数据,givenKey = prefix_*
当前 key 是 :prefix_1333
当前 key 是 :prefix_3哈哈哈哈哈哈
当前 key 是 :prefix_2KKKKK
开始使用 scan 删除数据 ------------
开始模糊删除set中的数据,givenKey = prefix_*
getByScan 查到的数据集是 ============ [prefix_1333, prefix_2KKKKK, prefix_3哈哈哈哈哈哈]
即将删除的key是 [prefix_1333, prefix_2KKKKK, prefix_3哈哈哈哈哈哈]
---------------- Tests end ----------------- 是否存在相同前缀的 key result = false
总结:虽然不提倡使用keys命令删除key,但是,本文示例依然给出了示例,目的在于了解使用原理。当然,比使用scan命令删除key效果更好的方案是直接调用Lua脚本,童鞋们自己琢磨吧!