Стратегии кэширования

Оптимизация кода на Java

Pavlos Kosmetatos

Lead Engineer @Wealthyhood

Что такое кэширование?

Кэширование — это как держать часто используемые продукты на кухонном столе, а не в шкафу: доступ быстрее, но места меньше

Чаще всего кэшируют:

  • Результаты запросов к базе данных
  • Ответы API
  • Ресурсоёмкие вычисления
  • Другие затратные операции
Оптимизация кода на Java

Кэширование в памяти на Java

// In-memory cache using HashMap
public class SimpleCache<K, V> {
    private final Map<K, V> cache = new HashMap<>();

    public V get(K key) {
        return cache.get(key);
    }

    public void put(K key, V value) {
        cache.put(key, value);
    }
}
Оптимизация кода на Java

Политики вытеснения из кэша

  • LRU (Least Recently Used)
  • LFU (Least Frequently Used)
  • FIFO (First In, First Out)
  • Вытеснение по времени
  • И другие!
Оптимизация кода на Java

Redis для распределённого кэширования

Что такое Redis:

  • Хранилище данных/кэш в памяти
  • Отлично подходит как распределённый кэш
  • Поддерживает множество структур данных
  • Множество клиентских библиотек для Java — например, Jedis

Скриншот Redis

Оптимизация кода на Java

Использование Redis с Jedis

import redis.clients.jedis.Jedis;

// Using Jedis client
Jedis jedis = new Jedis("localhost");
jedis.set("key", "value");
String value = jedis.get("key");

Дополнительные возможности:

  • Автоматическое истечение срока действия записей
  • Поддержка кластера
Оптимизация кода на Java

Кэш с истечением срока действия на Redis

public class RedisTimedCache {
    private final Jedis jedis;

    public RedisTimedCache(String host, int port) {
        this.jedis = new Jedis(host, port);
    }

    public String get(String key) {
        return jedis.get(key);
    }

    public void put(String key, String value, int timeToLiveSeconds) {
        // Sets both the value and expiration time in seconds
        jedis.setex(key, timeToLiveSeconds, value);
    }
}
Оптимизация кода на Java

Итоги

  • Кэш хранит результаты вычислений, чтобы не повторять их
  • Эффективен для ресурсоёмких операций и часто запрашиваемых данных
  • Настройте политику вытеснения для управления памятью
  • Для многосерверных приложений используйте распределённый кэш (например, Redis с Jedis)
Оптимизация кода на Java

Давайте потренируемся!

Оптимизация кода на Java

Preparing Video For Download...