cache2k cachesource работает с mysql в качестве бэкэнда
Я использую cache2k в качестве кеша для моего Java-приложения.
Я использую CacheSource для запросов на получение и просмотр, если кэш не находится в кеше in-mermoy. Но сейчас я хочу реализовать метод put.
- Как я могу ограничить кэш памяти, например, до 1000 элементов (необязательно: со временем жизни)?
- Как я могу поместить элемент в память и в MySQL? Просто добавить метод put в cachesource? (MySQL - это постоянный кеш)
Надеюсь, кто-нибудь сможет мне помочь.
private static Cache<String, Integer> c =
CacheBuilder.newCache(String.class, Integer.class)
.source(new CacheSource<String, Integer>() {
public Integer get(String o) {
System.out.println("ACCESSING SOURCE");
return checkCache(o) ? 1: 0; // checkCache checks if the item is in MySQL Cache
}
})
.name("cache")
.build();
1 ответ
Для первого вопроса вам нужно добавить две строки:
private static Cache<String, Integer> c =
CacheBuilder.newCache(String.class, Integer.class)
.name("cache")
.maxSize(1000) // limits in memory cache to 1000 entries
.expirySecs(60) // sets expiry (time to live) to 60 seconds
.source(new CacheSource<String, Integer>() {
public Integer get(String o) {
System.out.println("ACCESSING SOURCE");
return checkCache(o) ? 1: 0;
}
})
.build();
Два совета по expirySecs: По умолчанию cache2k имеет срок действия по умолчанию 10 минут. Вы можете выключить срок действия с помощью expirySecs(-1)
, Предстоящая версия 0.20 cache2k очистит интерфейс: eternal(true)
выключит истечение срока действия. А также expiryDuration(long, Timeunit)
это новый метод для установки времени истечения. Методы expiryMillis
а также expirySecs
все еще присутствуют и поддерживаются, но исчезнут в более поздних выпусках.
Второй вопрос: чтобы поместить запись в ваш кеш с прикрепленным сохранением mysql, используйте этот шаблон:
start database transaction
update item in the database
cache.remove(item key)
commit the transaction
Следующий доступ к кешу через get()
будет пропущен, вызовите источник кеша и получите обновленный элемент из базы данных. Если get()
происходит между remove()
и фиксация базы данных остановится, пока транзакция не будет зафиксирована (это зависит от ваших настроек mysql и уровня изоляции транзакции). Этот шаблон также работает, если вы хотите использовать cache2k в качестве кэша для слоя постоянства базы данных.
С помощью cache.put
а затем вставка элемента в базу данных приводит к проблемам параллелизма, поскольку эти две операции не являются атомарными. Вышеуказанный шаблон безопаснее, но медленнее, поскольку для каждого обновления кэша требуется хранилище базы данных и выборка.
Еще один совет: "лучший способ" сделать это изменится в будущем. В настоящее время я добавляю общую поддержку персистентности в cache2k. Так что это будет просто вопрос добавления свойств базы данных в будущем.