Redis: пул соединений Jedis JedisPool [легко понять]
Redis: пул соединений Jedis JedisPool [легко понять]

Всем привет, мы снова встретились, я ваш друг Цюаньчжаньцзюнь.

Оглавление

1. Применение JedisPool

1.1 Основное применение

1.2 Пакетное применение

1.3 Добавить повторную попытку по тайм-ауту

2. Конфигурация JedisPool

2.1 Заводская конфигурация

2.2 Конфигурация пула ресурсов

Jedis предоставляет пул соединений JedisPool. Поскольку объект Jedis не является потокобезопасным, объект Jedis обычно извлекается из пула соединений для эксклюзивного использования, а затем возвращается в пул соединений после использования.

зависимости maven:

Язык кода:javascript
копировать
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.1.0</version>
</dependency>

1. Применение JedisPool

1.1 Основное применение

Пример простого кода приложения пула ресурсов:

Язык кода:javascript
копировать
// Получить пул соединений
JedisPool pool = new JedisPool();
// Возьмите связываемый объект из пула ресурсов.
// Используйте try-with-resource для автоматического вызова метода close для возврата ресурса.
try(Jedis jedis = pool.getResource();) {
// Приложение выполняет действия

}

1.2 Пакетное применение

В приведенном выше методе записи, если пользователь не использует try-with-resource и забывает вернуть ресурс, в JedisPool можно создать уровень инкапсуляции для инкапсуляции операции возврата ресурса.

1. Пул ресурсов:

Язык кода:javascript
копировать
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. Интерфейс обратного вызова:

Язык кода:javascript
копировать
public interface RedisCallable {

    /**
     * Метод обратного вызова для выполнения задач, которые необходимо выполнить.
     *
     * @param jedis jedis
     */
    void call(Jedis jedis);
}

3. Используйте:

Язык кода:javascript
копировать
public class RedisMain {

    public static void main(String[] args) {
        RedisPool pool = new RedisPool();
        pool.execute((jedis) -> {
            System.out.println(jedis.get("key"));
        });
    }
}

1.3 Добавить повторную попытку по тайм-ауту

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

Пулы ресурсов можно изменить следующим образом:

Язык кода:javascript
копировать
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;
            }
        }
    }
}

2. Конфигурация JedisPool

Конструктор с наибольшим количеством параметров для JedisPool:

Язык кода:javascript
копировать
  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));
  }

Вышеуказанные параметры можно разделить на две части: Конфигурация. пула ресурсов,а также Заводская конфигурация。

2.1 Заводская конфигурация

Основная функция JedisFactory — управлять (создавать, закрывать, проверять) клиентом подключения Redis jedis. Получение ресурсов подключения jedis из пула соединений фактически получается из пула родительских классов JedisPool, и пул передается JedisFactory. Наконец, JedisFactory создает клиент соединения Redis jedis.

  1. хост: доменное имя или IP-адрес целевого экземпляра службы.
  2. порт: порт целевого сервера (номер порта Redis по умолчанию — 6379).
  3. ConnectionTimeout: время ожидания соединения
  4. soTimeout: время ожидания сокета
  5. пароль: пароль
  6. база данных: база данных
  7. clientName: имя созданного экземпляра клиента.

2.2 Конфигурация пула ресурсов

Пул ресурсов JedisPool использует экземпляр GenericObjectPool для передачи конфигурации, а GenericObjectPool является подклассом BaseGenericObjectPool.

Основные параметры:

  • maxTotal: максимальное количество подключений;
  • maxIdle: максимальное количество простаивающих соединений;
  • minIdle: минимальное количество простаивающих соединений;
  • blockWhenExhausted: указывает, блокировать ли выделение всех экземпляров jedis в пуле;
  • maxWaitMillis: если для параметра blockWhenExhausted установлено значение true, максимальная продолжительность блокировки.

Связано с обнаружением ресурсов простоя соединения:

  • testOnCreate: при создании экземпляра Jedis проверяется доступность соединения. По умолчанию отключено. Если включено, гарантированно создаются экземпляры Jedis с доступными подключениями.
  • testOnBorrow: при предоставлении экземпляра Jedis из пула ресурсов проверяется доступность соединения. По умолчанию он закрыт. Если он открыт, гарантируется, что все кредиты доступны;
  • testOnReturn: проверка доступности соединения, когда Jedis возвращает пул ресурсов Jedis, закрытый по умолчанию;
  • testWhileIdle: указывает, что существует поток удаления простаивающего объекта, сканирующий простаивающий экземпляр Jedis. Если проверка не удалась, экземпляр Jedis будет удален из пула ресурсов. Этот элемент имеет смысл только в том случае, если значение timeBetweenEvictionRunsMillis больше 0.

Связано с вытеснением ресурсов неактивного соединения:

  • timeBetweenEvictionRunsMillis: указывает количество миллисекунд, в течение которых ивентору неактивного объекта необходимо спать между двумя сканированиями;
  • numTestsPerEvictionRun: указывает максимальное количество объектов, сканируемых каждый раз программой проверки неактивных объектов;
  • minEvictableIdleTimeMillis: время вытеснения бездействующего объекта, указывающее минимальное время, в течение которого объект должен оставаться в состоянии бездействия, по крайней мере, прежде чем его можно будет просканировать и вытеснить с помощью средства удаления бездействующего объекта. Этот элемент имеет смысл только в том случае, если timeBetweenEvictionRunsMillis больше 0;
  • softMinEvictableIdleTimeMillis: время мягкого вытеснения бездействия. На основе minEvictableIdleTimeMillis также необходимо обнаружить, что по крайней мере объекты minIdle уже находятся в пуле ресурсов, прежде чем произойдет вытеснение.
  • lifo: следует ли при кредитовании ресурсов использовать стратегию LIFO (последним пришел — первым вышел) для предоставления взаймы ресурсов, которые использовались в последний раз, или следует использовать стратегию FIFO для предоставления взаймы ресурсов, которые не использовались в течение длительного времени; По умолчанию установлено значение true, то есть LIFO;
  • evictionPolicy: политика вытеснения, интерфейс, логика реализации по умолчанию: количество миллисекунд простоя ресурса. Если оно превышает время простоя minEvictableIdleTimeMillis или больше, чем softMinEvictableIdleTimeMillis, а текущее количество простаивающих ресурсов превышает настроенное минимальное количество. простаивающие ресурсы, будет произведено выселение

Конфигурация BaseGenericObjectPool следующая:

Язык кода:javascript
копировать
    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 следующая:

Язык кода:javascript
копировать
    /**
     * 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

boy illustration
Учебное пособие по Jetpack Compose для начинающих, базовые элементы управления и макет
boy illustration
Код js веб-страницы, фон частицы, код спецэффектов
boy illustration
【новый! Суперподробное】Полное руководство по свойствам компонентов Figma.
boy illustration
🎉Обязательно к прочтению новичкам: полное руководство по написанию мини-программ WeChat с использованием программного обеспечения Cursor.
boy illustration
[Забавный проект Docker] VoceChat — еще одно приложение для мгновенного чата (IM)! Может быть встроен в любую веб-страницу!
boy illustration
Как реализовать переход по странице в HTML (html переходит на указанную страницу)
boy illustration
Как решить проблему зависания и низкой скорости при установке зависимостей с помощью npm. Существуют ли доступные источники npm, которые могут решить эту проблему?
boy illustration
Серия From Zero to Fun: Uni-App WeChat Payment Practice WeChat авторизует вход в систему и украшает страницу заказа, создает интерфейс заказа и инициирует запрос заказа
boy illustration
Серия uni-app: uni.navigateЧтобы передать скачок значения
boy illustration
Апплет WeChat настраивает верхнюю панель навигации и адаптируется к различным моделям.
boy illustration
JS-время конвертации
boy illustration
Обеспечьте бесперебойную работу ChromeDriver 125: советы по решению проблемы chromedriver.exe не найдены
boy illustration
Поле комментария, щелчок мышью, специальные эффекты, js-код
boy illustration
Объект массива перемещения объекта JS
boy illustration
Как открыть разрешение на позиционирование апплета WeChat_Как использовать WeChat для определения местонахождения друзей
boy illustration
Я даю вам два набора из 18 простых в использовании фонов холста Power BI, так что вам больше не придется возиться с цветами!
boy illustration
Получить текущее время в js_Как динамически отображать дату и время в js
boy illustration
Вам необходимо изучить сочетания клавиш vsCode для форматирования и организации кода, чтобы вам больше не приходилось настраивать формат вручную.
boy illustration
У ChatGPT большое обновление. Всего за 45 минут пресс-конференция показывает, что OpenAI сделал еще один шаг вперед.
boy illustration
Copilot облачной разработки — упрощение разработки
boy illustration
Микросборка xChatGPT с низким кодом, создание апплета чат-бота с искусственным интеллектом за пять шагов
boy illustration
CUDA Out of Memory: идеальное решение проблемы нехватки памяти CUDA
boy illustration
Анализ кластеризации отдельных ячеек, который должен освоить каждый&MarkerгенетическийВизуализация
boy illustration
vLLM: мощный инструмент для ускорения вывода ИИ
boy illustration
CodeGeeX: мощный инструмент генерации кода искусственного интеллекта, который можно использовать бесплатно в дополнение к второму пилоту.
boy illustration
Машинное обучение Реальный бой LightGBM + настройка параметров случайного поиска: точность 96,67%
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция без кодирования и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
LM Studio для создания локальных больших моделей
boy illustration
Как определить количество слоев и нейронов скрытых слоев нейронной сети?
boy illustration
[Отслеживание целей] Подробное объяснение ByteTrack и детали кода