Что такое Kache
Kache — это фреймворк для кэширования, который оптимизирует производительность чтения и записи данных на уровне сохраняемости в высоконагруженных веб-приложениях. Он также обеспечивает актуальность данных и повышает эффективность использования пространства кэша базы данных.
Kache подчёркивает разделение между бизнес-логикой и кэшированием, реализуя обходной путь кэширования с помощью динамического проксирования. Фреймворк имеет специальный кодировщик параметров, скрывающий детали кодирования ключей и значений, а также четыре основных аннотации CRUD и перечисление Status или соответствие имени метода для управления действиями Kache, ориентированными на абстракцию и автоматизацию обработки.
Реализация кэша Kache включает Guava Cache, Redis и Lua, что снижает потребление сетевого ввода-вывода. Кэширование разделено на индексированный кэш и метаданные кэша. При сохранении данных в кэш выполняется операция «Эхо», которая сохраняет только те данные, которые ещё не были удалены из кэша, уменьшая необходимость повторной сериализации. В сценариях с большими объёмами данных, сосредоточенными на горячих точках, можно достичь почти бессериализованного уровня кэширования.
Фреймворк Kache универсален и имеет абстрактную реализацию компонентов, позволяя заменять стандартные компоненты пользовательскими реализациями через конструктор. Поддерживаются такие бэкенды, как MongoDB, IndexDB и даже MySQL. Кроме того, предоставляются дополнительные стратегии интерфейса, позволяющие пользователям настраивать стратегии для распределённых и одноузловых сред.
Отличия от других фреймворков кэширования
GuavaCache — выдающийся фреймворк кэширования от Google, предлагающий рациональное толкование и реализацию различных определений и операций кэширования. Существуют и другие популярные фреймворки кэширования, такие как J2Cache, Memcache и Ehcache, которые прошли проверку практикой и являются отличными открытыми проектами.
Существуют также автоматизированные фреймворки кэширования, такие как SpringCache и AutoLoadCache, которые освобождают пользователей от необходимости вручную обрабатывать операции кэширования и позволяют им сосредоточиться на бизнес-логике.
Среди множества популярных открытых фреймворков кэширования Kache предлагает уникальный подход к структуре кэширования, обеспечивая максимальное использование пространства памяти.
В традиционной структуре кэширования функции обычно используют параметры в качестве ключей, а результаты — в качестве значений. Это простая и эффективная структура, подходящая для большинства случаев. Однако она может привести к проблеме избыточности данных: разные параметры могут указывать на одни и те же данные.
При использовании в качестве кэша процессов, например, в Java, где данные хранятся в структурах данных, таких как HashMap, значения и ключи представлены в виде ссылок, и при разумных операциях не происходит дублирования объектов, занимающих пространство памяти. Однако это не относится к NoSQL базам данных, таким как Redis.
Когда данные сохраняются в Redis, они обычно должны быть сериализованы. Даже если значения одинаковы, но ключи различаются, это приводит к тому, что одни и те же сериализованные данные сохраняются отдельно, вызывая избыточность и занимая пространство. Это не только требует значительных вычислительных ресурсов процессора при сериализации больших объектов, но и ограничивает эффективное использование IO.
Цитата из статьи Tencent на Zhihu о кэшировании подчёркивает важность размера ключа в Redis: «Поскольку максимальный размер одного пакета передачи по сети составляет 1500 байт, рекомендуется, чтобы размер каждого ключа-значения не превышал 1 КБ для обеспечения эффективной производительности. Это позволяет избежать многократных сетевых взаимодействий».
Это означает, что при кэшировании больших наборов данных, таких как списки, важно избегать избыточной сериализации данных, чтобы минимизировать занимаемое пространство кэша. Как обеспечить уникальность данных без избыточной сериализации?
Идея заключается в том, чтобы использовать ссылки, подобные тем, которые используются в процессах Java для объектов, и хранить отдельные данные в Redis, используя id в качестве ссылки. Эта структура отделяет конкретные данные от параметров, распределяя их по Redis.
В контексте проблемы избыточности данных между разными параметрами, ссылающимися на одни и те же данные, эта структура кэширования обеспечивает более точное соответствие реальной логике ссылок. В реализации Kache это достигается следующим образом:
При чтении данных с условиями:
Если ключ индексированного кэша присутствует:
Эта структура кэширования имеет следующие особенности:
Этот тип кэширования подходит для следующих сценариев:
Если большинство из этих условий выполняются, эта структура кэширования может обеспечить более высокую производительность по сравнению с традиционными фреймворками.
Важно отметить, что этот фреймворк является лишь реализацией предложенной структуры и требует проверки в реальных условиях эксплуатации. Данный текст представляет собой описание программного обеспечения, его компонентов и их взаимодействия.
Вот перевод этого текста на русский язык:
Данный Kache предназначен для управления компонентами с использованием родных JDK для поддержки Kotlin или Scala и других языков JDK. Если вы используете Spring Framework, перейдите по ссылке: https://gitee.com/kroup/kache-spring.
Примеры использования Kache в исходном виде можно найти в test/java/com.kould.test/KacheTest.
1. Введение зависимости в файл pom:
<dependency>
<groupId>io.gitee.kould</groupId>
<artifactId>Kache</artifactId>
<version>1.8.9.INFORMAL_VERSION</version>
</dependency>
2. Наследование сущности кэша от интерфейса KacheEntity:
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("kork_article")
public class Article extends BasePO implements KacheEntity {
private static final long serialVersionUID = -4470366380115322213L;
@DataFactory(minLen = 10)
private String title;
private String summary;
@JsonAdapter(IdAdapter.class)
private Long authorId;
@JsonAdapter(IdAdapter.class)
private Long bodyId;
@JsonAdapter(IdAdapter.class)
private Long categoryId;
private Integer commentCounts;
private Long viewCounts;
private ArticleType weight;
@Override
public String getPrimaryKey() {
return getId().toString();
}
}
3. Проксирование Mapper с помощью Kache:
Kache kache = Kache.builder().build();
// Необходимо инициализировать и уничтожить Kache для загрузки скрипта и освобождения соединения
kache.init();
kache.destroy();
// Динамическое проксирование Mapper для получения нового Mapper с функциями кэширования
// Пример:
ArticleMapper proxy = kache.getProxy(articleMapper, Article.class);
4. Соответствующие аннотации слоя Dao:
@Repository
public interface TagMapper extends BaseMapper<Tag> {
@Select("select t.* from klog_article_tag at "
+ "right join klog_tag t on t.id = at.tag_id "
+ "where t.deleted = 0 AND at.deleted = 0 "
+ "group by t.id order by count(at.tag_id) desc limit #{limit}")
@DaoMethod(value = Type.SELECT,status = Status.BY_FIELD)
// Получение данных через условный поиск
List<Tag> listHotTagsByArticleUse(@Param("limit") int limit);
@DaoMethod(Type.INSERT)
// Метод пакетной вставки (может привести к изменению данных)
Integer insertBatch(Collection<T> entityList);
}
Пользовательские настройки или компоненты: Параметры конструктора PageDetails:
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )