web-dev-qa-db-ja.com

Redis / Jedis-パターンで削除しますか?

通常、キーセットを取得してから、ルックを使用して各キーと値のペアを削除します。

パターンを介してすべてのキーを削除することは可能ですか?

すなわち:

Del sample_pattern:*
11

ジェダイにとって、「パターンで削除」とは、基本的に特定のパターンのすべてのキーを取得して、それをループすることのようです。

すなわち

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

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()]));
}
11
Aprille

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つのサーバー側呼び出し、複数の削除操作が保証されます。

5
corindiano

Redisson を1行で実行できます。

redisson.getKeys().deleteByPattern(pattern)
4

あなたはbashでそれを行うことができます:

$ redis-cli KEYS "sample_pattern:*" | xargs redis-cli DEL
1
Agis