2015-06-17 5 views
0

Основываясь на suggested solusion и следуя example, я пытаюсь удалить ключ сразу после получения уведомления о том, что другой ключ истек.Redis hooking (publish-subscribe) в стресс-тестах - производительность под нагрузкой

Проблема заключается в том, что при стресс-теста с тяжелой нагрузкой седений 600K новые ключи и настройки половина из них со временем истечения 2-х секунд, я получаю следующее исключение:

Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: Unknown reply: t 

Вопрос заключается в том, что будет лучше всего написать такого слушателя? (? Пул потоков, если так, в каком контексте его реализовать?)

Jedis версия: 2.7.2

Redis версия: 2.8.19


Мой код до сих пор:

класс

Subscriber:

public class Subscriber { 

    public static void main(String[] args) { 
     JedisPool pool = new JedisPool(new JedisPoolConfig(), "localhost"); 

     Jedis jedis = pool.getResource(); 
     jedis.psubscribe(new KeyExpiredListener(), "__key*__:*"); 

    } 

} 

Слушатель Класс:

public class KeyExpiredListener extends JedisPubSub { 

    private String generalKeyTimeoutPrefix = "TO_"; 

    @Override 
    public void onPMessage(String pattern, String channel, String message) { 
     String originalKey = null; 
     try { 
      if(channel.endsWith("[email protected]__:expired") && message.startsWith(generalKeyTimeoutPrefix)) { 
       originalKey = message.substring(generalKeyTimeoutPrefix.length()); 
       del(originalKey); 
      } 
     } catch(Exception e) { 
      logger.error("..", e); 
     } 
    } 

    private void del(String key) { 
     Jedis jedis = new Jedis("localhost"); 
     jedis.connect(); 
     try { 
      jedis.del(key); 
     } catch (Exception e) { 
      logger.error("..."); 
     } finally { 
      jedis.disconnect(); 
     } 
    } 
} 

Генератор ключа:

public class TestJedis { 
    public static void main(String[] args) throws InterruptedException { 
     JedisPool pool = new JedisPool(new JedisPoolConfig(), "localhost"); 
     Jedis jedis = pool.getResource(); 
     String prefixForlKeys = "token_"; 
     String prefixForTimeoutKeys = "TO_"; 
     for (int i = 0; i < 300000; i++) { 
      String key = prefixForlKeys + i; 
      String timeoutKey = prefixForTimeoutKeys + key; 
      jedis.set(key, "some_data"); 
      jedis.set(timeoutKey, ""); 
      jedis.expire(timeoutKey, 2); 
     } 
     System.out.println("Finished to create the keys"); 
    } 
} 

ответ

1

проблема с осуществлением дель() метод: он не использует пул соединений, не повторное использование соединений, так что, наконец, занимает все доступные местные порты. Попробуйте использовать что-то вроде этого:

private void del(String key) { 
    Jedis jedis = pool.getResource(); 
    jedis.connect(); 
    try { 
     jedis.del(key); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     jedis.close(); 
    } 
} 

вместо открытия/закрытия соединения для каждого ключа с истекшим сроком действия.

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

  • Нет связанных вопросов^_^