레디 스 키 같은 접두사를 삭제하려면

      어떻게 정상적으로 레디 스를 삭제는 같은 접두사 키를 설정 세트?
      이 레디 스 단일 데이터 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脚本,童鞋们自己琢磨吧!
 

추천

출처www.cnblogs.com/east7/p/11665392.html