He De He Neng Caffeine, известный как король кеша?

Java Spring

Не завидуйте мандаринкам или бессмертным, а строчку кода корректируйте долго. Оригинал: Miss Sister Taste (идентификатор публичной учетной записи WeChat: xjjdog), добро пожаловать, пожалуйста, сохраните источник для перепечатки.

Я хочу кэшировать свою память, чтобы я мог быстро узнать тебя, когда увижу тебя снова.

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

Кэширование очень важно, и можно сказать, что большая часть работы связана с кэшированием. Из-за его широкого использования любая оптимизация для системы кэширования, которая может хоть немного повысить производительность, очень интересна.

Давно пользуюсьGuavaизLoadingCache. это иConcurrentHashMapОн очень похож, но гораздо полезнее инкапсулировать в нем некоторые полезные стратегии вытеснения и оптимизации параллелизма.

Набор систем с открытым исходным кодом для учебных целей, добро пожаловать в звезду:GitHub.com/star hotel о, хорошо/неплохо…. Он включает в себя сложный бизнес ToB, бизнес с высокой степенью параллелизма в Интернете, приложение кэширования, DDD, руководство по микросервисам. Управляемый моделью, управляемый данными. Поймите путь эволюции крупномасштабных сервисов, навыки кодирования, изучите Linux и настройте производительность. Помощь Docker/k8s, мониторинг, сбор логов, изучение промежуточного ПО. Front-end технология, back-end практика и т.д. Основная техника:SpringBoot+JPA+Mybatis-plus+Antd+Vue3.

Главное сегодня этоCaffeine, китайское название кофеин, вещество, которое легко возбуждает людей. Можно сказать, что это переписывание Гуавы, но эффективность очень высока, и она лучше, чем синяя.

На следующем рисунке показана диаграмма производительности Caffeine. Вы можете увидеть его производительность, оставив GuavaCache далеко позади. Почему это? локальный файл://media/15938442367524/15938448827543.jpgНачнем с его автора. Гитхаб автора есть (github.com/ben-manes), однажды написалConcurrentLinkedHashMapЭтот класс, и этот класс является основой GuavaCache.Ben Manes Погладив по голове, он решил перейти на следующий уровень.

Почему кофеин полезен?

Как только появился Caffeine, GuavaCache уже ОТСУТСТВУЕТ.

Caffeine поддерживает асинхронную загрузку и возвращает напрямуюCompletableFutures, по сравнению с методом синхронизации GuavaCache, он не блокирует ожидание загрузки данных. Кроме того, его программная модель удобна и избавляет от повторяющейся работы.

GuavaCache основан на LRU, а Caffeine основан на LRU и LFU, сочетая в себе преимущества обоих. Для студентов, которые не очень хорошо разбираются в этих двух алгоритмах, вы можете обратиться к предыдущим статьям xjjdog:«3 алгоритма кэширования в куче, бесплатный исходный код и идеи дизайна»

После их объединения получается новыйW-TinyLFUАлгоритм, он имеет очень высокую скорость попадания и меньший объем памяти, что является основной причиной.

Еще одна причина, по которой Caffeine работает быстрее, заключается в том, что многие операции используют асинхронность для отправки этих событий в очередь. используется очередьюRingBuffer, когда я увидел этот термин, я невольно подумал об этомlmaxизDisruptor, он стал синонимом высокой степени параллелизма без блокировок.

частота попаданий в тест

Мы решили взять онлайн-данные для проверки. На самом деле, я заменил большинство наиболее важных Тайников на Кофеин и завершил обновление гнева.

из-за ихAPIВыглядит очень похоже, процесс безболезненный, нет необходимости в анестезии.

Один из сервисов имеет большой кэш in-heap, в котором кешируются пользовательские данные. Он содержит такие атрибуты, как имя пользователя, пол, адрес, очки и т. д., образуя объект JSON, но размер не превышает 1 КБ. Через оттенки серого, в соответствии с различными стратегиями, мы проверили его фактическую результативность.

Стратегия 1

  • максимальный кеш1wПользователь
  • После того, как данные попадают в кеш, срок их действия истекает через 5 минут (требуется повторное чтение)

Скорость попадания:

  • Caffeine 29.22 %
  • Guava 21.95%

Стратегия 2

  • Увеличьте объем кешированных данных до 6 Вт пользователей.
  • После того, как данные попадают в кеш, срок их действия истекает через 20 минут, что соответствует сеансу.

Частота попаданий (все еще высокая):

  • Caffeine 56.04 %
  • Guava 50.01%

Стратегия 3

  • Напрямую увеличить кеш до 15w пользователей
  • После того, как данные попадают в кеш, срок их действия истекает через 30 минут.

Показатель попаданий в это время:

  • Caffeine 71.10 %
  • Guava 62.76%

Кофеин всегда лидировал по популярности. Чем выше процент попаданий, тем выше эффективность. С поправкой на более чем 50% наш эффект кеша очень велик.

Асинхронная загрузка

Затем выложите две официальные тестовые картинки:

(1) Read (75%) / Write (25%) localfile://media/15938442367524/15938463845793.jpg

(2) Write (100%) localfile://media/15938442367524/15938464259214.jpg

(3) Read (100%) localfile://media/15938442367524/15938464366776.jpg

Мы упоминали асинхронную загрузку Caffeine. Так как же выглядит код? Кэш асинхронной загрузки использует модель реактивного программирования и возвращаетCompletableFutureобъект. Честно говоря, код очень похож на Guava.

public static void main(String[] args) {
        AsyncLoadingCache<String, String> asyncLoadingCache = Caffeine.newBuilder()
                .maximumSize(1000)
                .buildAsync(key -> slowMethod(key));

        CompletableFuture<String> g = loadingCache.get("test");
        String value = g.get();
    }

    static String slowMethod(String key) throws Exception {
        Thread.sleep(1000);
        return key + ".result";
    }

Я помню, как видел это, когда некоторое время назад просматривал исходный код Spring. локальный файл://media/15938442367524/15938479597151.jpgВ SpringBoot, предоставляяCacheManagerБин, который можно использовать сSpringboot-cacheМожно сказать, что это очень удобно для интеграции.

ключевой код.

//bean生成
@Bean("caffeineCacheManager")
public CacheManager cacheManager() {
    CaffeineCacheManager cacheManager = new CaffeineCacheManager();
    cacheManager.setCaffeine(Caffeine.newBuilder() .maximumSize(1000));
    return cacheManager;
}

//使用注入
@CacheConfig(cacheNames = "caffeineCacheManager")

//信息缓存
@Cacheable(key = "#id")

Существует так много технических рамок, когда им конец.

Набор систем с открытым исходным кодом для учебных целей, добро пожаловать в звезду:GitHub.com/star hotel о, хорошо/неплохо…. Он включает в себя сложный бизнес ToB, бизнес с высокой степенью параллелизма в Интернете, приложение кэширования, DDD, руководство по микросервисам. Управляемый моделью, управляемый данными. Поймите путь эволюции крупномасштабных сервисов, навыки кодирования, изучите Linux и настройте производительность. Помощь Docker/k8s, мониторинг, сбор логов, изучение промежуточного ПО. Front-end технология, back-end практика и т.д. Основная техника:SpringBoot+JPA+Mybatis-plus+Antd+Vue3.

Об авторе:Мисс сестра вкус(xjjdog), публичная учетная запись, которая не позволяет программистам идти в обход. Сосредоточьтесь на инфраструктуре и Linux. Десять лет архитектуры, десятки миллиардов ежедневного трафика, обсуждение с вами мира высокой параллелизма, дающие вам другой вкус. Мой личный WeChat xjjdog0, добро пожаловать в друзья для дальнейшего общения.​

общаться с.​