Обычно я получаю набор ключей, а затем использую вид для удаления каждой пары ключ/значение.Redis/Jedis - Удалить по шаблону?
Можно ли просто удалить все ключи с помощью шаблона?
т.е.
Del sample_pattern:*
Обычно я получаю набор ключей, а затем использую вид для удаления каждой пары ключ/значение.Redis/Jedis - Удалить по шаблону?
Можно ли просто удалить все ключи с помощью шаблона?
т.е.
Del sample_pattern:*
Кажется, для Jedis, «удалить по шаблону», в основном, получают все ключи от определенной схемы, то через него.
т.е.
Set<String> keys = jedis.keys(pattern);
for (String key : keys) {
jedis.del(key);
}
Вы можете сделать это с Башем:
$ redis-cli KEYS "sample_pattern:*" | xargs redis-cli DEL
Извините, забыли упомянуть, что я хочу сделать это в коде Java. но это полезно. – iCodeLikeImDrunk
@yaojiang Я никогда не писал строку Java, но вот мой прием, см. Обновленный ответ. – Agis
без кости. похоже, что реализация jedis позволяет мне делать что-то вроде jedis.del (key1, key2, key3, ...); – iCodeLikeImDrunk
Вы должны попробовать использовать 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:*");
Это гарантирует один серверный вызов а, многократные операции удаления.
Вы можете сделать это с Redisson в одной строке:
redisson.getKeys().deleteByPattern(pattern)
Использование Java для удаления, это, кажется, как это:
String keyPattern = "sample_pattern:*";
Set<String> keys = jedis.keys(keyPattern);
for(String key:keys){
jedis.del(key);
}
дель команду Redis: DEL key [key ...]
из CLI. См: http://redis.io/commands/del
Jedis 2,9 версия имеет этот метод, реализованный, вот апи документ: http://xetorthio.github.io/jedis/
String[] keys = {"u1","u2"}; jedis = jedisPool.getResource(); jedis.del(keys);
Все ключи в массиве «ключи» будут удалены, если имеется. Если упомянутый ключ недоступен, он будет проигнорирован.
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()]));
}
Мне интересно, какие вещи - почему KEYS настолько неэффективны, и действительно ли SCANning нетривиальных записей (скажем, 10Kb JSON) больше чем использование KEYS.Я имею в виду - ключи в основном похожи на SCAN, только отбрасывая содержимое и возвращаясь в один объем. Что вам все равно нужно делать здесь. –
Сканирование лучше. Но вы можете уменьшить количество звонков на jedis, выполнив 'Set keys = jedis.keys (pattern); jedis.del (keys.toArray (new String [keys.size()])); ' –
dbaq