2014-01-23 4 views

ответ

15

Кажется, для Jedis, «удалить по шаблону», в основном, получают все ключи от определенной схемы, то через него.

т.е.

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

Сканирование лучше. Но вы можете уменьшить количество звонков на jedis, выполнив 'Set keys = jedis.keys (pattern); jedis.del (keys.toArray (new String [keys.size()])); ' – dbaq

1

Вы можете сделать это с Башем:

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

Извините, забыли упомянуть, что я хочу сделать это в коде Java. но это полезно. – iCodeLikeImDrunk

+1

@yaojiang Я никогда не писал строку Java, но вот мой прием, см. Обновленный ответ. – Agis

+0

без кости. похоже, что реализация jedis позволяет мне делать что-то вроде jedis.del (key1, key2, key3, ...); – iCodeLikeImDrunk

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:*"); 

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

2

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

redisson.getKeys().deleteByPattern(pattern) 
-3

Использование Java для удаления, это, кажется, как это:

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

дель команду 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);

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

5

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()])); 
} 
+0

Мне интересно, какие вещи - почему KEYS настолько неэффективны, и действительно ли SCANning нетривиальных записей (скажем, 10Kb JSON) больше чем использование KEYS.Я имею в виду - ключи в основном похожи на SCAN, только отбрасывая содержимое и возвращаясь в один объем. Что вам все равно нужно делать здесь. –

Смежные вопросы