Не завидуйте мандаринкам или бессмертным, а строчку кода корректируйте долго. Оригинал: 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, добро пожаловать в друзья для дальнейшего общения.
общаться с.