Локальные кэши Infinispan имеют несколько функций, которые делают его не просто картой: срок действия и выселение, прослушиватели, статистика, транзакции, хранилища кэша и т. Д. Однако это дорого обходится — из-за всех хуков и размещения объектов обычный ConcurrentHashMapбыстрее, чем локальный кеш.
Есть приложения, которым нужно что-то среднее — отличная производительность, но и некоторые из этих функций тоже. В нашем случае мотивация была внутренними кешами в Hibernate Second Level Cache. Поэтому Infinispan 8.0.1.Final предоставляет простой кэш — альтернативную реализацию AdvancedCache интерфейса, оптимизированную для максимальной производительности, когда вам нужны только основы.
В таблице ниже показано, какие функции доступны в простом кеше:
| Характерная черта | Доступность |
|---|---|
| Основной картоподобный API | ✔ |
| Слушатели кэша (некластеризованные) | ✔ |
| истечение | ✔ |
| выселение | ✔ |
| Безопасность | ✔ |
| Доступ JMX | ✔ |
| Статистика | ✔ |
| операции | ✘ |
| Пакетное обращение | ✘ |
| Постоянство (кеш-накопители и загрузчик) | ✘ |
| Карта Уменьшить Рамки | ✘ |
| Структура распределенных исполнителей | ✘ |
| Таможенные перехватчики | ✘ |
| Индексирование (запрос) | ✘ |
| Совместимость (встроенный / сервер) | ✘ |
| Хранить как бинарный файл | ✘ |
Настроить простой кеш так же просто, как добавить один атрибут в конфигурацию XML:
<local-cache name="mySimpleCache" simple-cache="true">
<!-- expiration, eviction, security... -->
</local-cache>
Хотя схема конфигурации позволяет настроить неподдерживаемые функции, это приводит к исключению при создании кэша.
Вы также можете настроить простой кеш программно:
CacheManager cm = getCacheManager();
ConfigurationBuilder builder = new ConfigurationBuilder().simpleCache(true);
cm.defineConfiguration("mySimpleCache", builder.build());
Cache cache = cm.getCache("mySimpleCache");
Итак, какого улучшения производительности вы можете ожидать? Мы запустили базовый (однопоточный) тест с использованием JMH, и вот что мы получили:
| Реализация | get () (операций / с) | put () (операций / с) | ||||
|---|---|---|---|---|---|---|
| ConcurrentHashMap | 128354135 | ± | 2178755 | 33980088 | ± | 28487 |
| Простой кеш | 86969897 | ± | 738935 | 14044642 | ± | 14280 |
| Локальный кеш | 17280018 | ± | 361910 | 2267850 | ± | 44814 |
Это дает нам примерно 5-кратное ускорение для чтения и 6✕ для записи. Ваш пробег может варьироваться, но несомненно, что простой кэш обеспечивает существенное повышение производительности.
Итак, если ваш вариант использования позволяет, попробуйте простой кеш и дайте нам знать. Это так же просто, как один атрибут конфигурации!