Sobes.tech
Назад к вопросам
Senior
6

В чём основная проблема данной реализации - Подключение к Redis захардкожено - Имеется пул соединений для Redis - Непроверенный вызов `jedis.get` может вернуть значение null. - Использование команды `KEYS`, вызывающее нагрузку на сервер - Нет событий Redis

Компании, где спрашивали
СБК ПАРУС

Ответ от нейросети

sobes.tech AI

Основные проблемы данной реализации:

  1. Жёстко заданное подключение к Redis — это снижает гибкость и усложняет тестирование и поддержку. Лучше использовать конфигурацию через параметры или DI (Dependency Injection).

  2. Пул соединений есть, но непроверенный вызов jedis.get может вернуть null — отсутствие проверки на null может привести к NullPointerException. Нужно всегда проверять возвращаемое значение.

  3. Использование команды KEYS — эта команда сканирует все ключи и может вызвать серьёзную нагрузку на сервер, особенно в продуктивной среде с большим количеством данных. Вместо KEYS лучше использовать SCAN, который итеративно возвращает ключи без блокировки.

  4. Отсутствие событий Redis — если приложение зависит от изменений в данных, стоит использовать механизмы подписки/публикации (Pub/Sub) или Redis Streams для обработки событий.

Пример улучшения вызова с проверкой null и использованием SCAN вместо KEYS:

try (Jedis jedis = jedisPool.getResource()) {
    String value = jedis.get("key");
    if (value != null) {
        // обработка значения
    } else {
        // обработка отсутствия значения
    }

    ScanParams params = new ScanParams().match("prefix:*").count(100);
    String cursor = ScanParams.SCAN_POINTER_START;
    do {
        ScanResult<String> scanResult = jedis.scan(cursor, params);
        List<String> keys = scanResult.getResult();
        // обработка ключей
        cursor = scanResult.getCursor();
    } while (!cursor.equals(ScanParams.SCAN_POINTER_START));
}

Также рекомендуется вынести конфигурацию подключения в отдельный файл и использовать события Redis для реактивного взаимодействия.