Всем привет, мы снова встретились, я ваш друг Цюаньчжаньцзюнь.
Оглавление
1.3 Добавить повторную попытку по тайм-ауту
2.2 Конфигурация пула ресурсов
Jedis предоставляет пул соединений JedisPool. Поскольку объект Jedis не является потокобезопасным, объект Jedis обычно извлекается из пула соединений для эксклюзивного использования, а затем возвращается в пул соединений после использования.
зависимости maven:
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.1.0</version>
</dependency>
Пример простого кода приложения пула ресурсов:
// Получить пул соединений
JedisPool pool = new JedisPool();
// Возьмите связываемый объект из пула ресурсов.
// Используйте try-with-resource для автоматического вызова метода close для возврата ресурса.
try(Jedis jedis = pool.getResource();) {
// Приложение выполняет действия
}
В приведенном выше методе записи, если пользователь не использует try-with-resource и забывает вернуть ресурс, в JedisPool можно создать уровень инкапсуляции для инкапсуляции операции возврата ресурса.
1. Пул ресурсов:
public class RedisPool {
private JedisPool pool;
public RedisPool() {
this.pool = new JedisPool();
}
/**
* выполнять задания
*
* @param callable
*/
public void execute(RedisCallable callable) {
try(Jedis jedis = pool.getResource()) {
callable.call(jedis);
}
}
}
2. Интерфейс обратного вызова:
public interface RedisCallable {
/**
* Метод обратного вызова для выполнения задач, которые необходимо выполнить.
*
* @param jedis jedis
*/
void call(Jedis jedis);
}
3. Используйте:
public class RedisMain {
public static void main(String[] args) {
RedisPool pool = new RedisPool();
pool.execute((jedis) -> {
System.out.println(jedis.get("key"));
});
}
}
В случае дрожания сети необходимо добавить таймаут для механизм повтора, вы можете повторить попытку, когда будет перехвачено исключение JedisConnectionException.
Пулы ресурсов можно изменить следующим образом:
public class RedisPool {
/**
* Максимальное количество повторов
*/
private static final int MAX_RETRY = 3;
private JedisPool pool;
public RedisPool() {
this.pool = new JedisPool();
}
/**
* выполнять задания
*
* @param callable
*/
public void execute(RedisCallable callable) {
int count = 0;
try (Jedis jedis = pool.getResource()) {
execute(callable, jedis, count);
}
}
private void execute(RedisCallable callable, Jedis jedis, int count) {
try {
callable.call(jedis);
} catch (JedisConnectionException e) {
if (count < MAX_RETRY) {
execute(callable, jedis, ++count);
} else {
throw e;
}
}
}
}
Конструктор с наибольшим количеством параметров для JedisPool:
public JedisPool(final GenericObjectPoolConfig poolConfig, final String host, int port,
final int connectionTimeout, final int soTimeout, final String password, final int database,
final String clientName) {
super(poolConfig, new JedisFactory(host, port, connectionTimeout, soTimeout, password,
database, clientName));
}
Вышеуказанные параметры можно разделить на две части: Конфигурация. пула ресурсов,а также Заводская конфигурация。
Основная функция JedisFactory — управлять (создавать, закрывать, проверять) клиентом подключения Redis jedis. Получение ресурсов подключения jedis из пула соединений фактически получается из пула родительских классов JedisPool, и пул передается JedisFactory. Наконец, JedisFactory создает клиент соединения Redis jedis.
Пул ресурсов JedisPool использует экземпляр GenericObjectPool для передачи конфигурации, а GenericObjectPool является подклассом BaseGenericObjectPool.
Основные параметры:
Связано с обнаружением ресурсов простоя соединения:
Связано с вытеснением ресурсов неактивного соединения:
Конфигурация BaseGenericObjectPool следующая:
private volatile int maxTotal =
GenericKeyedObjectPoolConfig.DEFAULT_MAX_TOTAL;
private volatile boolean blockWhenExhausted =
BaseObjectPoolConfig.DEFAULT_BLOCK_WHEN_EXHAUSTED;
private volatile long maxWaitMillis =
BaseObjectPoolConfig.DEFAULT_MAX_WAIT_MILLIS;
private volatile boolean lifo = BaseObjectPoolConfig.DEFAULT_LIFO;
private final boolean fairness;
private volatile boolean testOnCreate =
BaseObjectPoolConfig.DEFAULT_TEST_ON_CREATE;
private volatile boolean testOnBorrow =
BaseObjectPoolConfig.DEFAULT_TEST_ON_BORROW;
private volatile boolean testOnReturn =
BaseObjectPoolConfig.DEFAULT_TEST_ON_RETURN;
private volatile boolean testWhileIdle =
BaseObjectPoolConfig.DEFAULT_TEST_WHILE_IDLE;
private volatile long timeBetweenEvictionRunsMillis =
BaseObjectPoolConfig.DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS;
private volatile int numTestsPerEvictionRun =
BaseObjectPoolConfig.DEFAULT_NUM_TESTS_PER_EVICTION_RUN;
private volatile long minEvictableIdleTimeMillis =
BaseObjectPoolConfig.DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS;
private volatile long softMinEvictableIdleTimeMillis =
BaseObjectPoolConfig.DEFAULT_SOFT_MIN_EVICTABLE_IDLE_TIME_MILLIS;
private volatile EvictionPolicy<T> evictionPolicy;
private volatile long evictorShutdownTimeoutMillis =
BaseObjectPoolConfig.DEFAULT_EVICTOR_SHUTDOWN_TIMEOUT_MILLIS;
Конфигурация GenericObjectPool следующая:
/**
* The default value for the {@code maxTotal} configuration attribute.
* @see GenericObjectPool#getMaxTotal()
*/
public static final int DEFAULT_MAX_TOTAL = 8;
/**
* The default value for the {@code maxIdle} configuration attribute.
* @see GenericObjectPool#getMaxIdle()
*/
public static final int DEFAULT_MAX_IDLE = 8;
/**
* The default value for the {@code minIdle} configuration attribute.
* @see GenericObjectPool#getMinIdle()
*/
public static final int DEFAULT_MIN_IDLE = 0;
private int maxTotal = DEFAULT_MAX_TOTAL;
private int maxIdle = DEFAULT_MAX_IDLE;
private int minIdle = DEFAULT_MIN_IDLE;
Заявление об авторских правах: Содержание этой статьи добровольно предоставлено пользователями Интернета, а мнения, выраженные в этой статье, представляют собой только точку зрения автора. Этот сайт предоставляет только услуги по хранению информации, не имеет никаких прав собственности и не принимает на себя соответствующие юридические обязательства. Если вы обнаружите на этом сайте какое-либо подозрительное нарушение авторских прав/незаконный контент, отправьте электронное письмо, чтобы сообщить. После проверки этот сайт будет немедленно удален.
Издатель: Лидер стека программистов полного стека, укажите источник для перепечатки: https://javaforall.cn/197083.html Исходная ссылка: https://javaforall.cn