Ana içeriğe geç

1.6. Cache#

Uygulamalarda in-memory ve distributed cache yeteneklerini sağlayan altyapı bileşenidir. Caffeine cache ve redis cache destekleri sağlanmaktadır. Bu altyapı bileşeni ihtiyaçlar doğrultusunda genişletilebilmektedir.

ÖNERİ: Cache kullanımının DTO üzerinden yapılması tavsiye edilmektedir. Gereksiz ve çok değişecek veriler cache'e konulmamalıdır.

Core#

Uygulamada cache yönetimi için HvlCacheManager sınıfı sunulmaktadır. Böylece uygulama içerisinde annotion dışında cache yönetimi yapılmaktadır.

NOT: hvl-cache-core kütüphanesi kullanılan sağlayıcıya göre entegrasyon göstermektedir. (Redis, EhCache, Caffeine vb...)


drawing Uygulamaya nasıl eklenir?
group: 'tr.com.havelsan.framework.cache', name: 'hvl-cache-core'

Redis#

Java dünyasında Redis ile entegrasyon için kullanılan en popüler teknolojiler Jedis ve Lettuce'dur. EKSEN tarafından bu iki teknolojiye de destek verilmektedir.

Redis ürünü ve çalışma yapısı ile ilgili detaylı bilgiye Redis'e Giriş sayfasından ulaşılabilir.


drawing Uygulamaya nasıl eklenir?
group: 'tr.com.havelsan.framework.cache', name: 'hvl-redis'

drawing Nasıl konfigüre edilir?

hvl-infra altında bulunan 'application-redis.yml' dosyasıyla konfigure edilebilmektedir.


Neden bu altyapıyı tercih etmeliyim:

  • Spring redis ile tamamen entegre çalışmaktadır. Herhangi bir kısıtlama yapılmamıştır.
  • Çalışma modları eklenmiştir, bu sayede redis'i standalone, cluster veya sentinel modda çalıştırılabilir.
  • Spring'in sağladığı cache manager konfigüratif yapıya çekilmiştir.
  • Spring'in sağladığı redis template için serializer'lar konfigüratif yapıya çekilmiştir.

YML Konfigürasyonları#

management:
  health:
    redis:
      enabled: ${REDIS_HEALTH_CHECK_ENABLED:true}

hvl:
  core:
    cache:
      redis:
        configuration-type: ${REDIS_CONFIGURATION_TYPE:standalone}
        cache-manager:
          ttl: ${REDIS_CM_TTL:-1}
          cache-null-values: ${REDIS_CM_CACHE_NULL_VALUES:true}
          use-prefix: ${REDIS_CM_USE_PREFIX:true}
          cache-prefix: ${REDIS_CM_CACHE_PREFIX:hvl::sfi::}
          value-serializer: ${REDIS_CM_VALUE_SERIALIZER:json}
        template:
          key-serializer: ${REDIS_TEMPLATE_KEY_SERIALIZER:java}
          value-serializer: ${REDIS_TEMPLATE_VALUE_SERIALIZER:java}
          hash-key-serializer: ${REDIS_TEMPLATE_HASH_KEY_SERIALIZER:java}
          hash-value-serializer: ${REDIS_TEMPLATE_HASH_VALUE_SERIALIZER:java}

spring:
  cache:
    type: ${CACHE_TYPE:redis}
  data:
    redis:
      host: ${REDIS_HOST:hvlredis}
      port: ${REDIS_PORT:6379}
      password: ${REDIS_PASSWORD:hvl12345}
      client-type: ${REDIS_CLIENT_TYPE:lettuce}
      lettuce:
        shutdown-timeout: ${REDIS_LETTUCE_SHUTDOWN_TIMEOUT:200ms}
        pool:
          max-active: ${REDIS_LETTUCE_POOL_MAX_ACTIVE:10}
          max-idle: ${REDIS_LETTUCE_POOL_MAX_IDLE:10}
      jedis:
        pool:
          max-active: ${REDIS_JEDIS_POOL_MAX_ACTIVE:10}
          max-idle: ${REDIS_JEDIS_POOL_MAX_IDLE:10}
      sentinel:
        master: ${REDIS_SENTINEL_MASTER:hvl-sentinel}
        nodes: ${REDIS_SENTINEL_NODES:hvlsentinel:26379,hvlsentinel2:26380,hvlsentinel3:26381}
        password: ${REDIS_SENTINEL_PASSWORD:hvl12345}
      cluster:
        nodes: ${REDIS_CLUSTER_NODES:hvlredis:6379,hvlredis2:6380,hvlredis3:6381,hvlredis4:6382,hvlredis5:6383,hvlredis6:6384}

management.health.redis.enabled: Uygulama açılışında redis'e bağlantıyı kontrol eder. Bağlantı sağlayamazsa uygulamayı kapatır.

hvl.core.cache.redis.configuration-type: Redis için çalışma modunu belirler. [standalone, cluster, sentinel]

hvl.core.cache.redis.cache-manager.ttl: Redisin kayıtları belirli bir süre kadar tutmasını sağlar. Süresi dolan kaydı siler. Saniye cinsinden verilmelidir. Varsayılan değeri "-1" dir ve sonsuz anlamına gelir.

hvl.core.cache.redis.cache-manager.cache-null-values: Null olarak gönderilen value değerlerini de cachelemesini söyler. Varsayılan değeri true'dur.

hvl.core.cache.redis.cache-manager.use-prefix: Redis'te oluşacak cacheler için ön ek ekleyip eklemeyeceğini ayarlar. Varsayılanı true'dur.

hvl.core.cache.redis.cache-manager.cache-prefix: Redis'te oluşacak cacheler için ön ek ekler. Varsayılanı "[cacheName] + ::" şeklindedir.

hvl.core.cache.redis.cache-manager.value-serializer: Redis'e kaydedilecek valuelar için serializer ayarlaması yapar. Cachelenen veri nesne ise 'java' veya 'json' kullanılması tavsiye edilir. Sadece string bazlı veri tutulacaksa 'string' değeri kullanılabilir. Varsayılan değeri java'dır. [java, json, string, byte_array]

hvl.core.cache.redis.template.key-serializer: Redis template'in kullanacağı key serializer ayarlaması yapar. Varsayılan değeri java'dır. [java, json, string, byte_array]

hvl.core.cache.redis.template.value-serializer: Redis template'in kullanacağı value serializer ayarlaması yapar. Varsayılan değeri java'dır. [java, json, string, byte_array]

hvl.core.cache.redis.template.hash-key-serializer: Redis template'in kullanacağı hash key serializer ayarlaması yapar. Varsayılan değeri java'dır. [java, json, string, byte_array]

hvl.core.cache.redis.template.hash-value-serializer: Redis template'in kullanacağı hash value serializer ayarlaması yapar. Varsayılan değeri java'dır. [java, json, string, byte_array]

spring.data.redis yml konfigürasyonları ile ilgili detaylı bilgi spring'in dökümantasyonlarından bakılabilir.

Redis Cache Kullanımı#

Otomatik Kullanım#

Cache kullanımı otomatik olarak spring'in sağladığı @Cacheable, @CacheEvict anotasyonlarını method tepesine yazılarak yapılabilir.

.
.
.

@Override
@CacheEvict(value = "ObjectLockCache", allEntries = true)
public HvlObjectLockModel save(HvlObjectLockModel objectLockModel) throws HvlObjectLockDataException {
//save data
}

@Override
@HvlTransactionalReadOnly
@Cacheable("ObjectLockCache")
public HvlObjectLockModel getObjectLockById(Long id) {
//returns data
}

.
.
.

Manuel Kullanım#

Cache manuel olarak manipüle edilmek isteniyorsa javalt framework'ün sağladığı HvlCacheManager kullanılabilir.

.
.
.

@Autowired
private HvlCacheManager cacheManager;

.
.
.
public interface HvlCacheManager {

    /**
     * Verilen nesneyi verilen cache ekleme islemini saglayan yontemdir.
     *
     * @param name   Cache ismi
     * @param object Nesne
     * @param <CO>   Nesne generik turu
     */
    <CO> void put(String name, CO object);


    /**
     * Verilen nesneyi verilen cache ekleme islemini saglayan yontemdir.
     *
     * @param name   Cache ismi
     * @param key    Cache bilgisi
     * @param object Nesne
     * @param <CO>   Nesne generik turu
     */
    <CO> void put(String name, String key, CO object);

    /**
     * Verilen cache bilgisini verilen cacheden temizleme islemini saglayan yontemdir.
     *
     * @param name Cache ismi
     */
    void evict(String name);


    /**
     * Verilen cache bilgisini verilen cacheden temizleme islemini saglayan yontemdir.
     *
     * @param name Cache ismi
     * @param key  Cache bilgisi
     */
    void evict(String name, String key);

    /**
     * Verilen cache tamamen temizlemeyi saglayan yontemdir.
     *
     * @param name Cache ismi
     */
    void clear(String name);

    /**
     * Verilen cache verisini donen yontemdir.
     *
     * @param name Cache ismi
     * @param <CO> Nesne generik turu
     * @return
     */
    <CO> CO cache(String name);

    /**
     * Verilen cache verisini donen yontemdir.
     *
     * @param name Cache ismi
     * @param key  Cache bilgisi
     * @param <CO> Nesne generik turu
     * @return
     */
    <CO> CO cache(String name, String key);


    /**
     * Verilen cache verisini donen yontemdir.
     *
     * @param name          Cache ismi
     * @param cacheProvider HvlCacheProvider implementasyonu
     * @param <CO>          Nesne generik turu
     * @return
     */
    <CO> CO cache(String name, HvlCacheProvider<CO> cacheProvider);

    /**
     * Verilen cache verisini donen yontemdir.
     *
     * @param name          Cache ismi
     * @param key           Cache bilgisi
     * @param cacheProvider HvlCacheProvider implementasyonu
     * @param <CO>          Nesne generik turu
     * @return
     */
    <CO> CO cache(String name, String key, HvlCacheProvider<CO> cacheProvider);

}

Redis Docker-Compose Uygulaması#

Redis docker compose örneklerine javalt framework'ün sağladığı infra projesi üzerinden ulaşılabilir.

Redis docker compose: http://bitbucket.bulut.ai/projects/BITJAVALT/repos/hvl-infra/browse/deployment/management-service/redis/redis-docker-compose.yml

Redis sentinel docker compose: http://bitbucket.bulut.ai/projects/BITJAVALT/repos/hvl-infra/browse/deployment/management-service/redis/redis-sentinel-cluster-docker-compose.yml

Caffeine#

EKSEN, in memory olarak çalışan caffeine cache desteği sağlamaktadır. In memory cache kullanımları için oldukça performanslı çalışır.


drawing Uygulamaya nasıl eklenir?
group: 'tr.com.havelsan.framework.cache', name: 'hvl-caffeine'

drawing Nasıl konfigüre edilir?
spring:
  cache:
    type: caffeine

Aşağıdaki şekilde bean inject edilerek kullanılabilir.

.
.
.
private final CaffeineCacheManager caffeineCacheManager;
.
.
.