Redis/Jedis - Удалить по шаблону?

Обычно я получаю набор ключей, а затем использую вид для удаления каждой пары ключ/значение.

Можно ли просто удалить все ключи с помощью шаблона?

т

Del sample_pattern:*

Ответ 1

Кажется, для 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 для удаления соответствующих ключей, передав массив ключей для удаления. Более эффективное решение представлено ниже:

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

Вы должны попробовать использовать 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:*");

Это гарантирует один вызов на стороне сервера, несколько операций удаления.

Ответ 4

Вы можете сделать это с помощью Redisson в одной строке:

redisson.getKeys().deleteByPattern(pattern)

Ответ 5

Вы можете сделать это с помощью bash:

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

Ответ 6

del команда redis: DEL key [key ...] из CLI. См. http://redis.io/commands/del

Версия Jedis 2.9 реализована таким образом, вот документ api: http://xetorthio.github.io/jedis/

String[] keys = {"u1","u2"}; jedis = jedisPool.getResource(); jedis.del(keys);

Все ключи в массиве "ключи" будут удалены, если они будут доступны. Если упомянутый ключ недоступен, он будет проигнорирован.

Ответ 7

Использование java для удаления выглядит следующим образом:

String keyPattern = "sample_pattern:*";
Set<String> keys = jedis.keys(keyPattern);
for(String key:keys){
jedis.del(key);
}