[REDIS] 레디 스 / Jedis - 패턴에 의해 삭제 하시겠습니까?
REDIS레디 스 / Jedis - 패턴에 의해 삭제 하시겠습니까?
일반적으로, 나는 키 세트가 각 키 / 값 쌍을 삭제하는 모양을 사용하여 얻을.
그냥 패턴을 통해 모든 키를 삭제할 수 있습니까?
즉 :
Del sample_pattern:*
해결법
-
==============================
1."패턴 삭제"를, Jedis 들어 보인다 기본적으로 그것을 통해 다음 루프를 특정 패턴의 모든 열쇠를지고 있습니다.
"패턴 삭제"를, Jedis 들어 보인다 기본적으로 그것을 통해 다음 루프를 특정 패턴의 모든 열쇠를지고 있습니다.
즉
Set<String> keys = jedis.keys(pattern); for (String key : keys) { jedis.del(key); }
-
==============================
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.당신은 평가를 사용하여 시도해야합니다. 나는 더 루아 전문가는 아니지만,이 코드는 작동합니다.
당신은 평가를 사용하여 시도해야합니다. 나는 더 루아 전문가는 아니지만,이 코드는 작동합니다.
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.당신은 한 줄에 Redisson와 함께 할 수 있습니다 :
당신은 한 줄에 Redisson와 함께 할 수 있습니다 :
redisson.getKeys().deleteByPattern(pattern)
-
==============================
5.당신은 bash는 함께 할 수 있습니다 :
당신은 bash는 함께 할 수 있습니다 :
$ redis-cli KEYS "sample_pattern:*" | xargs redis-cli DEL
-
==============================
6.삭제 자바를 사용하여,이 같은 것입니다 :
삭제 자바를 사용하여,이 같은 것입니다 :
String keyPattern = "sample_pattern:*"; Set<String> keys = jedis.keys(keyPattern); for(String key:keys){ jedis.del(key); }
from https://stackoverflow.com/questions/21317501/redis-jedis-delete-by-pattern by cc-by-sa and MIT license
'REDIS' 카테고리의 다른 글
[REDIS] Laravel 4 : 정의되지 않은 메서드 레디 스에 전화 : 연결 () (0) | 2020.01.14 |
---|---|
[REDIS] 어떻게 루비에서 MULTI 블록 내부 레디 스에서 읽을 수 있습니까? (0) | 2020.01.14 |
[REDIS] 레디 스 목록에 값으로 항목의 인덱스를 가져옵니다 (0) | 2020.01.14 |
[REDIS] 레디 스가 EVAL, SCAN 및 DEL 반환 사용하여 스크립트를 삭제 와일드 카드 "쓰기 명령을 비 결정적 명령 후 허용되지 않습니다" (0) | 2020.01.14 |
[REDIS] 레디 스 템플릿을 사용하여 레디 스에서 모든 키를 얻는 방법 (0) | 2020.01.14 |