Основываясь на 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");
}
}