복붙노트

[REDIS] 레디 스 / Jedis - 패턴에 의해 삭제 하시겠습니까?

REDIS

레디 스 / Jedis - 패턴에 의해 삭제 하시겠습니까?

일반적으로, 나는 키 세트가 각 키 / 값 쌍을 삭제하는 모양을 사용하여 얻을.

그냥 패턴을 통해 모든 키를 삭제할 수 있습니까?

즉 :

Del sample_pattern:*

해결법

  1. ==============================

    1."패턴 삭제"를, Jedis 들어 보인다 기본적으로 그것을 통해 다음 루프를 특정 패턴의 모든 열쇠를지고 있습니다.

    "패턴 삭제"를, Jedis 들어 보인다 기본적으로 그것을 통해 다음 루프를 특정 패턴의 모든 열쇠를지고 있습니다.

    Set<String> keys = jedis.keys(pattern);
    for (String key : keys) {
        jedis.del(key);
    } 
    
  2. ==============================

    2.생산에 사용되는 경우 KEYS는 인해 비 효율성에 사용하지 않는 것이 좋습니다. https://redis.io/commands/keys를 참조하십시오. 대신, SCAN을 사용하는 것이 좋습니다. 또한, jedis.del에 반복 호출 ()보다 더 효율적인 호출은 삭제 키의 배열을 전달, 일치하는 키를 제거 할 jedis 하나 개의 단일 통화를 만드는 것입니다. 보다 효율적인 솔루션은 아래에 제시된다 :

    생산에 사용되는 경우 KEYS는 인해 비 효율성에 사용하지 않는 것이 좋습니다. https://redis.io/commands/keys를 참조하십시오. 대신, SCAN을 사용하는 것이 좋습니다. 또한, jedis.del에 반복 호출 ()보다 더 효율적인 호출은 삭제 키의 배열을 전달, 일치하는 키를 제거 할 jedis 하나 개의 단일 통화를 만드는 것입니다. 보다 효율적인 솔루션은 아래에 제시된다 :

    Set<String> matchingKeys = new HashSet<>();
    ScanParams params = new ScanParams();
    params.match("sample_pattern:*");
    
    try(Jedis jedis = jedisPoolFactory.getPool().getResource()) {
        String nextCursor = "0";
    
        do {
            ScanResult<String> scanResult = jedis.scan(nextCursor, params);
            List<String> keys = scanResult.getResult();
            nextCursor = scanResult.getStringCursor();
    
            matchingKeys.addAll(keys);
    
        } while(!nextCursor.equals("0"));
    
        if (matchingKeys.size() == 0) {
          return;
        }
    
        jedis.del(matchingKeys.toArray(new String[matchingKeys.size()]));
    }
    
  3. ==============================

    3.당신은 평가를 사용하여 시도해야합니다. 나는 더 루아 전문가는 아니지만,이 코드는 작동합니다.

    당신은 평가를 사용하여 시도해야합니다. 나는 더 루아 전문가는 아니지만,이 코드는 작동합니다.

    private static final String DELETE_SCRIPT_IN_LUA =
        "local keys = redis.call('keys', '%s')" +
        "  for i,k in ipairs(keys) do" +
        "    local res = redis.call('del', k)" +
        "  end";
    
    public void deleteKeys(String pattern) {
      Jedis jedis = null;
    
      try {
        jedis = jedisPool.getResource();
    
        if (jedis == null) {
          throw new Exception("Unable to get jedis resource!");
        }
    
        jedis.eval(String.format(DELETE_SCRIPT_IN_LUA, pattern));  
      } catch (Exception exc) {
        if (exc instance of JedisConnectionException && jedis != null) {
          jedisPool.returnBrokenResource(jedis);
          jedis = null;
        }
    
        throw new RuntimeException("Unable to delete that pattern!");
      } finally {
        if (jedis != null) {
          jedisPool.returnResource(jedis);
        }
      }
    }
    

    그리고 전화 :

    deleteKeys("temp:keys:*");
    

    이것은 하나의 서버 측 호출, 여러 삭제 작업을 보장합니다.

  4. ==============================

    4.당신은 한 줄에 Redisson와 함께 할 수 있습니다 :

    당신은 한 줄에 Redisson와 함께 할 수 있습니다 :

    redisson.getKeys().deleteByPattern(pattern)
    
  5. ==============================

    5.당신은 bash는 함께 할 수 있습니다 :

    당신은 bash는 함께 할 수 있습니다 :

    $ redis-cli KEYS "sample_pattern:*" | xargs redis-cli DEL
    
  6. ==============================

    6.삭제 자바를 사용하여,이 같은 것입니다 :

    삭제 자바를 사용하여,이 같은 것입니다 :

    String keyPattern = "sample_pattern:*";
    Set<String> keys = jedis.keys(keyPattern);
    for(String key:keys){
    jedis.del(key);
    }
    
  7. from https://stackoverflow.com/questions/21317501/redis-jedis-delete-by-pattern by cc-by-sa and MIT license