cache2k cachesource работает с mysql в качестве бэкэнда

Я использую cache2k в качестве кеша для моего Java-приложения.

Я использую CacheSource для запросов на получение и просмотр, если кэш не находится в кеше in-mermoy. Но сейчас я хочу реализовать метод put.

  1. Как я могу ограничить кэш памяти, например, до 1000 элементов (необязательно: со временем жизни)?
  2. Как я могу поместить элемент в память и в 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. Так что это будет просто вопрос добавления свойств базы данных в будущем.

Другие вопросы по тегам