通常、キーセットを取得してから、ルックを使用して各キーと値のペアを削除します。
パターンを介してすべてのキーを削除することは可能ですか?
すなわち:
Del sample_pattern:*
ジェダイにとって、「パターンで削除」とは、基本的に特定のパターンのすべてのキーを取得して、それをループすることのようです。
すなわち
Set<String> keys = jedis.keys(pattern);
for (String key : keys) {
jedis.del(key);
}
KEYSは、本番環境で使用すると非効率になるため、使用をお勧めしません。 https://redis.io/commands/keys を参照してください。代わりに、SCANを使用することをお勧めします。さらに、jedis.del()を繰り返し呼び出すよりも効率的な呼び出しは、jedisを1回呼び出して一致するキーを削除し、削除するキーの配列を渡すことです。より効率的なソリューションを以下に示します。
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()]));
}
eval を使用してみてください。私はLuaの専門家ではありませんが、このコードは機能します。
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:*");
これにより、1つのサーバー側呼び出し、複数の削除操作が保証されます。
Redisson を1行で実行できます。
redisson.getKeys().deleteByPattern(pattern)
あなたはbashでそれを行うことができます:
$ redis-cli KEYS "sample_pattern:*" | xargs redis-cli DEL