Önbellek etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Önbellek etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

Hibernate ve Spring Boot kullanarak EhCache ile yapılan ikinci düzey önbellekleme örneği ve açıklaması.

Hibernate second level cache nedir?

Hibernate, bir Java nesne/ilişkisel eşleme (ORM) çerçevesidir ve uygulamaların veritabanı işlemlerini kolaylaştırmak için kullanılır. Hibernate'de "ikinci seviye önbellek" (second level cache), uygulamanın performansını artırmak için veri erişimini hızlandırmak adına kullanılır.


Bir Hibernate uygulamasında, birincil önbellek otomatik olarak uygulamalar tarafından kullanılır ve herhangi bir ek yapılandırmaya ihtiyaç duymaz. Bu, bir veriye ilk erişildiğinde veritabanından alınan ve bir oturum boyunca kullanılan veriyi ifade eder. Bununla birlikte, bu veri her oturum için ayrı ayrı alınır ve diğer oturumlarla paylaşılmaz.


Buna karşın, ikinci seviye önbellek birden fazla oturum arasında paylaşılır. Bu, daha önce yüklenmiş bir nesne aynı uygulama tarafından tekrar talep edildiğinde, Hibernate'in bu veriyi ikinci seviye önbellekten alabileceği ve bu sayede veritabanına tekrar erişim yapmasına gerek kalmayacağı anlamına gelir. Bu, genellikle uygulamanın performansını önemli ölçüde artırabilir.


Hibernate, ikinci seviye önbellek için birçok popüler önbellek sağlayıcıyı destekler, örneğin EhCache, Infinispan ve Hazlecast. İkinci seviye önbelleği kullanma kararı ve hangi önbellek sağlayıcısını kullanacağınız genellikle uygulamanızın gereksinimlerine ve ölçeklenebilirlik gerekliliklerine bağlıdır.

Hibernate'de ikinci seviye önbellek kullanmanın bazı avantajları vardır:


Performansı Artırır: Veritabanı işlemleri genellikle zaman alır ve bu da uygulamanın performansını etkileyebilir. İkinci seviye önbellek kullanmak, aynı veriye birden fazla kez erişim ihtiyacını azaltır, böylece veritabanı üzerindeki yükü azaltır ve genel performansı artırır.


Ağ Trafiğini Azaltır: Veritabanından veri almak, genellikle ağ üzerinden bir miktar veri transferi gerektirir. Bu, özellikle büyük veri setleriyle çalışırken önemli bir faktör olabilir. İkinci seviye önbellek, ağ trafiğini azaltarak ve gerekli veri transferlerini minimuma indirerek bu yükü azaltır.


Veritabanı Bağlantılarını Azaltır: Her veritabanı bağlantısı, bir miktar sistem kaynağı gerektirir. İkinci seviye önbellek, veritabanı ile yapılacak olan gereksiz bağlantıları önleyerek sistem kaynaklarının daha verimli bir şekilde kullanılmasını sağlar.


Bununla birlikte, ikinci seviye önbelleğin dikkatli bir şekilde yönetilmesi gerekir. Önbellekte tutulan verinin güncel olmaması durumunda, uygulama eski veya yanıltıcı bilgilere dayalı kararlar alabilir. Bu nedenle, önbelleğin düzenli olarak güncellenmesi ve verinin zamanında geçersiz kılınması önemlidir.


Ayrıca, farklı önbellek sağlayıcıları farklı özelliklere sahip olabilir ve her uygulama için en iyi önbellek sağlayıcısını seçmek önemlidir. Önbellek sağlayıcısının seçimi, veritabanı erişiminin gerekliliklerine, uygulamanın ölçeğine ve önbelleğin yönetilme şekline bağlı olabilir.


Hibernate'deki ikinci seviye önbellek (second level cache), oturum fabrikası düzeyinde bulunur. Bu, farklı oturumlar (Session) arasında paylaşılan verinin saklandığı yerdir.


Her Hibernate oturumu (Session), birinci seviye önbellek (first level cache) olarak da bilinen kendi önbelleğine sahiptir. Bir oturum boyunca alınan tüm nesneler bu önbellekte saklanır. Ancak, bu önbellek sadece o oturum için geçerlidir ve oturum sona erdiğinde önbellek de boşaltılır.


Buna karşılık, ikinci seviye önbellek bir oturum fabrikası (SessionFactory) düzeyinde bulunur. Bu, tüm oturumlar arasında paylaşılan ve oturumlar sona erdikten sonra bile veriyi tutabilen bir önbellektir. İkinci seviye önbellek, aynı veriye birden fazla oturumdan erişim gerektiğinde verimlilik sağlar.


Sonuç olarak, ikinci seviye önbellek birden çok oturum arasında paylaşılan veriyi tutar ve bu veriyi tüm oturumlar arasında kullanılabilir hale getirir. Bu, özellikle verinin sık sık kullanıldığı durumlarda performansı önemli ölçüde artırabilir.

Hibernate ve Spring Boot ile ikinci seviye önbellekleme yapmak için bir Cache Provizyonu (Cache Provider) kullanılmalıdır. EhCache, Hazelcast, Infinispan gibi çeşitli cache provizyonları vardır. Bu örnekte, popüler bir cache provizyonu olan EhCache kullanılacak.





Öncelikle projenize EhCache ve Hibernate'in EhCache'i desteklemesi için gereken bağımlılıkları ekleyin:


xml

Copy code

<dependencies>

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-data-jpa</artifactId>

    </dependency>

    <dependency>

        <groupId>net.sf.ehcache</groupId>

        <artifactId>ehcache</artifactId>

    </dependency>

    <dependency>

        <groupId>org.hibernate</groupId>

        <artifactId>hibernate-ehcache</artifactId>

    </dependency>

</dependencies>

Daha sonra application.properties dosyanızda aşağıdaki Hibernate ikinci seviye önbellekleme ayarlarını yapın:


properties

Copy code

spring.jpa.properties.hibernate.cache.use_second_level_cache=true

spring.jpa.properties.hibernate.cache.use_query_cache=true

spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory

Bunlar sırasıyla:


İkinci seviye önbelleklemeyi aktif eder

Sorgu önbellekleme özelliğini aktif eder

Cache bölgesi için fabrika sınıfını ayarlar

Entity sınıflarınızda önbelleklemeyi aktifleştirmek için @Cacheable ve @Cache annotation'ları kullanın:


java

Copy code

import javax.persistence.Entity;

import javax.persistence.Id;

import org.hibernate.annotations.Cache;

import org.hibernate.annotations.CacheConcurrencyStrategy;


@Entity

@Cacheable

@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)

public class Book {


    @Id

    private Long id;


    // other fields, getters and setters...

}

Bu örnekte @Cacheable annotation'ı entity sınıfının önbelleklenebilir olduğunu belirtir ve @Cache annotation'ı önbelleklemenin nasıl yapılacağını belirler. Yukarıdaki durumda, READ_WRITE stratejisi, verinin okuma ve yazma işlemlerinde önbelleklenmesini sağlar.


Son olarak, EhCache yapılandırmasını ehcache.xml dosyası ile yapmanız gerekiyor:


xml

Copy code

<ehcache>


    <defaultCache 

        maxElementsInMemory="100" 

        eternal="false"

        timeToIdleSeconds="120" 

        timeToLiveSeconds="200" >

    </defaultCache>


    <cache 

        name="com.example.Book" 

        maxElementsInMemory="100" 

        eternal="false" 

        timeToIdleSeconds="120" 

        timeToLiveSeconds="200" >

    </cache>


</ehcache>

Bu XML dosyasında, genel ve özelleştirilmiş önbellek politikalarını tanımlarsınız. Bu örnekte, com.example.Book entity'si için özel bir önbellek politikası tanımlanmıştır. Bu dosyayı classpath içinde (genellikle src/main/resources klasörü) oluşturmanız gerekiyor.


Sonuç olarak, bu yaklaşım ile Hibernate ve Spring Boot kullanarak ikinci seviye önbellekleme yapabilirsiniz.


Bahsettiğim bu adımlar genellikle Spring Boot ve Hibernate ile ikinci seviye önbelleklemeyi gerçekleştirmek için gerekli olan adımlardır. Ancak, uygulamanızın ihtiyaçlarına bağlı olarak bazı ek adımlar gerekebilir.


Örneğin, önbellek ayarlarını dinamik olarak değiştirmeniz gerekiyorsa, EhCache Manager'ı kullanabilirsiniz.


java

Copy code

import net.sf.ehcache.CacheManager;

import org.springframework.cache.ehcache.EhCacheCacheManager;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;


@Configuration

public class CacheConfig {


    @Bean

    public EhCacheCacheManager cacheManager() {

        return new EhCacheCacheManager(CacheManager.create());

    }

}

Eğer daha fazla kontrol veya önbellek ile ilgili daha fazla bilgiye ihtiyacınız varsa, Spring'in CacheManager ve Cache arayüzlerini kullanabilirsiniz. CacheManager önbellekleri almak ve yönetmek için kullanılırken, Cache belirli bir önbellek üzerinde işlem yapmak için kullanılır.


java

Copy code

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.cache.Cache;

import org.springframework.cache.CacheManager;

import org.springframework.stereotype.Component;


@Component

public class CacheService {


    private final CacheManager cacheManager;


    @Autowired

    public CacheService(CacheManager cacheManager) {

        this.cacheManager = cacheManager;

    }


    public void evictSingleCacheValue(String cacheName, String cacheKey) {

        Cache cache = cacheManager.getCache(cacheName);

        if (cache != null) {

            cache.evict(cacheKey);

        }

    }


    public void evictAllCacheValues(String cacheName) {

        Cache cache = cacheManager.getCache(cacheName);

        if (cache != null) {

            cache.clear();

        }

    }

}

Bu örnekte CacheService, bir önbellekteki belirli bir değeri kaldırmak veya bir önbellekteki tüm değerleri kaldırmak için kullanılabilir.


Ayrıca, önbellekleme hatalarını işlemek için Spring'in @CacheEvict annotation'ını kullanabilirsiniz. Bu annotation, bir metot çağrısı sonrasında belirli bir önbellekteki değerleri kaldırmak için kullanılır. Örneğin, bir kitap güncellendikten sonra, bu kitapla ilgili önbellekteki tüm değerlerin kaldırılması gerekebilir.


java

Copy code

import org.springframework.cache.annotation.CacheEvict;

import org.springframework.stereotype.Service;


@Service

public class BookService {


    @Autowired

    private BookRepository bookRepository;


    @CacheEvict(cacheNames = "books", allEntries = true)

    public void updateBook(Book book) {

        bookRepository.save(book);

    }

}

Bu örnekte @CacheEvict annotation'ı updateBook metodu çağrıldıktan sonra "books" önbellekteki tüm değerlerin kaldırılmasını sağlar. Bu sayede, önbellekte tutulan güncellenmiş kitap bilgilerinin güncel olduğundan emin olabiliriz.


Elbette, belirli senaryolarda, belirli bir önbellekteki değerleri otomatik olarak güncellemek isteyebilirsiniz. Bu durumda @CachePut annotation'ını kullanabilirsiniz. Bu annotation, bir metot çağrıldıktan sonra belirli bir önbellekteki bir değeri otomatik olarak günceller.


java

Copy code

import org.springframework.cache.annotation.CachePut;

import org.springframework.stereotype.Service;


@Service

public class BookService {


    @Autowired

    private BookRepository bookRepository;


    @CachePut(cacheNames = "books", key = "#book.id")

    public Book updateBook(Book book) {

        return bookRepository.save(book);

    }

}

Bu örnekte @CachePut annotation'ı updateBook metodu çağrıldıktan sonra "books" önbellekteki belirli bir değerin (bu durumda güncellenen kitabın ID'si) otomatik olarak güncellenmesini sağlar.


Bir diğer konu da önbelleğin boyutudur. Önbelleğin boyutunu kontrol altında tutmak önemlidir çünkü aşırı büyük bir önbellek hem belleği hem de performansı olumsiz etkileyebilir. EhCache yapılandırma dosyası (ehcache.xml), önbelleğin maksimum boyutunu kontrol etmek için kullanılabilir.


xml

Copy code

<ehcache>


    <defaultCache 

        maxElementsInMemory="100" 

        eternal="false"

        timeToIdleSeconds="120" 

        timeToLiveSeconds="200" >

    </defaultCache>


    <cache 

        name="com.example.Book" 

        maxElementsInMemory="500" 

        eternal="false" 

        timeToIdleSeconds="120" 

        timeToLiveSeconds="200" >

    </cache>


</ehcache>

Bu örnekte, "com.example.Book" önbelleğinin boyutu maksimum 500 element olarak belirlenmiştir.


Son olarak, önbellek durumunu izlemek için JMX (Java Management Extensions) kullanılabilir. JMX, Java uygulamalarını izlemek ve yönetmek için bir standarttır ve EhCache bu standartı destekler. JMX'i kullanarak önbellekte ne kadar alanın kullanıldığını, kaç önbellek girişinin olduğunu ve daha fazlasını görebilirsiniz.


xml

Copy code

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd" updateCheck="true" monitoring="autodetect" dynamicConfig="true">


    <cacheManagerPeerProviderFactory class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory" properties="peerDiscovery=automatic, multicastGroupAddress=230.0.0.1, multicastGroupPort=4446, timeToLive=32"/>


    <cacheManagerPeerListenerFactory class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory" properties="port=40001, remoteObjectPort=40002"/>


    <defaultCache maxElementsInMemory="100" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="200"/>


    <cache name="com.example.Book" maxElementsInMemory="500" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="200">

        <cacheEventListenerFactory class="net.sf.ehcache.distribution.RMICacheReplicatorFactory" properties="replicatePuts=true, replicateUpdates=true, replicateUpdatesViaCopy=true, replicateRemovals=true"/>

    </cache>


</ehcache>

Bu örnekte, EhCache'nin JMX'i desteklemek için yapılandırıldığını ve ayrıca RMICacheManagerPeerListenerFactory ve RMICacheReplicatorFactory'nin kullandığı portların belirtildiğini görüyoruz.


Önbellekleme karmaşık bir konudur ve bu kılavuz genel bir bakış sunmaktadır. Önbelleklemenin yararlarına ulaşmak için uygulamanızın ihtiyaçlarını ve senaryolarını dikkatlice değerlendirmeniz gerekmektedir.

Redis konu anlatımı, Spring Boot Redis cache kullanım örneği, Spring Data Redis mülakat soruları ve cevapları

Redis nedir? Detaylı anlatım

Redis, açılımıyla "Remote Dictionary Server", açık kaynaklı, in-memory veri yapısı depolama sistemidir. Yüksek performanslı bir key-value (anahtar-değer) depolama sistemidir ve genellikle veritabanı, önbellek ve mesaj brokeri olarak kullanılır.





Redis, çeşitli veri yapısını destekler: dizeler (strings), hashler, listeler, kümesler, sıralı kümesler, bitmapler, hyperlogloglar ve coğrafi indeksler. Bu zengin veri yapısı desteği Redis'i çok çeşitli uygulamalar için uygun hale getirir.


En temel kullanım örneği olarak, bir web uygulamasında genellikle bir veritabanından sürekli olarak alınan ve çok az değişen veriler, Redis'in bellekte tutulabilir. Bu şekilde, verileri her seferinde veritabanından çekmek yerine çok daha hızlı bir şekilde Redis'ten alabilirsiniz. Bu, uygulamanın performansını önemli ölçüde artırabilir.


Redis'in önemli bir özelliği de sunucunun durması, sistem çökmesi gibi durumlarda bile verilerin kaybolmaması için diske sürekli yazma (persistence) seçeneklerini sunmasıdır. Bu özellik, Redis'in sadece bir önbellek sistemi olmasının ötesine geçerek dayanıklı bir veri deposu olarak da kullanılmasını sağlar.


Buna ek olarak, Redis'in birçok dil için istemci kitaplıkları (client libraries) vardır. Python, Java, PHP, C#, JavaScript gibi popüler programlama dillerinde Redis ile kolayca entegre olabilirsiniz.


Son olarak, Redis, çok düğümlü (multi-node) dağıtımları destekler. Bu, yüksek derecede okunabilirlik ve yazılabilirlik gerektiren uygulamalar için Redis'i bir çözüm haline getirir. Redis Cluster adı verilen bu özellik sayesinde, Redis düğümleri arasında otomatik veri partisyonlaması ve dayanıklılık sağlar.

Redis'in temel bileşenleri arasında anahtar-değer çiftlerini, yayın-abonelik (publish-subscribe) modelini, işlemleri ve Lua scriptlerini kullanabilme gibi özellikler yer alır.





Anahtar-değer çiftleri: Redis, anahtar-değer çiftlerini kullanarak verileri depolar. Anahtarlar daima bir string'dir ve değerler farklı veri tipleri olabilir. Bu veri tipleri arasında stringler, listeler, setler, sorted setler (veya Zsetler), hashler bulunur.


Yayın-abonelik modeli: Bu model, bir mesajın birden çok tüketiciye dağıtılmasını sağlar. Bir uygulama, belirli bir kanala mesaj "yayınlar" ve bu kanala abone olan tüm uygulamalar bu mesajı alır. Bu model, genellikle gerçek zamanlı uygulamalarda, örneğin anlık mesajlaşma veya canlı hizmet güncellemeleri gibi durumlardan yararlanır.


İşlemler: Redis, birden çok komutun bir grup olarak çalıştırılmasını sağlayan işlemleri destekler. Bu, bir dizi komutun atomik olarak yürütülmesini sağlar, yani ya tüm komutlar başarılı bir şekilde çalışır ya da hiçbiri çalışmaz. Bu, veri tutarlılığını sağlamak için önemlidir.


Lua Scripting: Redis, Lua scripting dilini destekler, bu da kullanıcıların Redis sunucusunda karmaşık işlemler gerçekleştirmesine olanak sağlar. Bu işlemler bir dizi komutu içerebilir ve Lua scripti bir işlem gibi atomik olarak çalışır.


Bunlara ek olarak, Redis son yıllarda stream veri tiplerini de desteklemeye başladı. Streamler, büyük miktarda veriyi depolamak ve işlemek için ideal bir yol sağlar, özellikle de bu verilerin sürekli bir şekilde üretildiği durumlarda. Streamler, mesajların bir zaman damgasıyla birlikte depolanmasına ve daha sonra sıralı bir şekilde işlenmesine olanak sağlar.


Redis, veri yapısı sunucusu olarak adlandırılmasının yanı sıra bir uygulama içinde bir dizi farklı kullanıma sahiptir. Bunlar arasında önbellekleme, mesajlaşma kuyrukları, web uygulamalarının durum paylaşımı ve veri analizi gibi kullanımlar yer alır.


Yüksek performansı ve geniş özellik seti sayesinde Redis, dünya genelinde birçok büyük ölçekli uygulamada tercih edilen bir teknolojidir.

Redis'in geniş özellik setine ek olarak, bir dizi ileri seviye özelliği ve kullanım senaryosu bulunur. Bunlar arasında:


Transactional capabilities: Redis, MULTI, EXEC, DISCARD ve WATCH gibi bir dizi komut kullanarak işlem desteği sunar. Bu, bir dizi komutun atomik olarak yürütülmesini sağlar, yani ya tüm komutlar başarılı bir şekilde çalışır ya da hiçbiri çalışmaz. Bu, bir uygulamanın bir dizi komutu "bir araya getirebileceği" ve tüm komutların başarılı bir şekilde tamamlanmasını garantileyebileceği anlamına gelir.


Pub/Sub: Redis, sunucudan yayınlanan mesajları almak için istemcilerin bir konuya abone olmasını sağlayan bir Yayın/Abonelik modeli sunar. Bu, anlık mesajlaşma, canlı hizmet güncellemeleri gibi durumlar için oldukça kullanışlıdır.


Lua scripting: Redis, önceden tanımlanmış işlevlerin yanı sıra, kullanıcı tanımlı Lua scriptlerini çalıştırabilir. Bu, daha karmaşık veri işleme işlemlerinin gerçekleştirilmesine izin verir.


LUA scripting: Redis, Lua scripting dilini destekler. Bu, kullanıcıların Redis sunucusunda karmaşık işlemler gerçekleştirmesine olanak sağlar. Lua scriptleri bir işlem gibi atomik olarak çalışır, yani ya tüm komutlar başarıyla çalışır ya da hiçbiri çalışmaz.


Replication: Redis, asenkron replikasyonu destekler. Bu, bir Redis sunucusunun bir veya daha fazla kopyasının başka bir yerde tutulmasını sağlar. Bu özellik, veri kaybını önlemek ve okuma hızını artırmak için kullanılır.


Redis Sentinel: Redis'in yüksek kullanılabilirlik çözümü olan Redis Sentinel, otomatik bölüm anahtarlama, tespit ve yapılandırma sağlar.


Redis Cluster: Redis Cluster, yüksek kullanılabilirlik ve otomatik bölümleme (sharding) için bir çözüm sunar. Redis Cluster, Redis verilerini otomatik olarak birden çok Redis düğümü arasında böler, böylece uygulamanın genel yüksekliğini ve dayanıklılığını artırır.


Security: Redis, istemci bağlantıları için TLS/SSL şifrelemesini ve AUTH komutu ile istemci kimlik doğrulamasını destekler.


Genellikle, Redis yüksek performanslı, düşük gecikmeli bir veri depolama çözümü olarak öne çıkar. Ancak, bunun yanında, Redis'in zengin özellik seti ve genişletilebilirliği onu daha karmaşık veri işleme ve analitik uygulamalar için de uygun hale getirir.

Redis kullanarak Java uygulamalarında bir cache oluşturma yeteneğine odaklanalım.




Spring, @Cacheable, @CachePut, @CacheEvict, vb. gibi annotation'ları kullanarak metod seviyesinde caching özelliklerini sunar. Bu, metodun sonuçlarını önbelleğe almayı ve aynı metod çağrıldığında tekrar hesaplama yapmak yerine önbellekten sonuçları almayı mümkün kılar. Spring Data Redis, Redis'i bir cache provider olarak kullanmayı mümkün kılar.


Aşağıda, bir Spring uygulamasında Redis'i kullanarak önbellekleme işlemlerini nasıl gerçekleştirebileceğimizi gösteren bir örneği bulabilirsiniz:


java

Copy code

import org.springframework.cache.annotation.Cacheable;

import org.springframework.stereotype.Service;


@Service

public class CacheExampleService {


    @Cacheable(value = "books", key = "#isbn")

    public Book findBook(String isbn) {

        // Some expensive operation to find book by ISBN

        return book;

    }

}

Bu örnekte, findBook metodunun sonuçları "books" önbelleğine alınır ve anahtar olarak ISBN kullanılır. Metod ilk kez çağrıldığında, sonucu hesaplar ve önbelleğe alır. Sonraki çağrılarda, sonuç doğrudan önbellekten alınır ve metod tekrar çalıştırılmaz.


Önbellekten bir girdiyi silmek için @CacheEvict annotation'ı kullanılır:


java

Copy code

import org.springframework.cache.annotation.CacheEvict;

import org.springframework.stereotype.Service;


@Service

public class CacheExampleService {


    @CacheEvict(value = "books", key = "#isbn")

    public void evictBook(String isbn) {

        // Evict the book from cache

    }

}

Bu örnekte, evictBook metodu, "books" önbelleğinden belirtilen ISBN'ye karşılık gelen girdiyi siler.


Spring Data Redis ve Spring'in cache abstraction'ı, Redis'i bir cache provider olarak kullanmayı çok kolaylaştırır. Bu, uygulamanın performansını önemli ölçüde artırabilir, özellikle de aynı sonuçların tekrar tekrar hesaplanması gerektiğinde.


Redis cache için spring boot'da ne tür konfigrasyonlar yapmalıyım?


Spring Boot uygulamasında Redis önbelleğini kullanmak için öncelikle bağımlılıkları ve gerekli yapılandırmaları eklemeniz gerekiyor. Spring Boot, auto-configuration özelliği sayesinde çok fazla yapılandırma gerektirmeyecek şekilde tasarlanmıştır. Ancak, önce gerekli olan Redis ve Spring Cache bağımlılıklarını eklemeliyiz:


Maven kullanıyorsanız pom.xml dosyanıza aşağıdaki bağımlılıkları ekleyin:

xml

Copy code

<dependencies>

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-data-redis</artifactId>

    </dependency>

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-cache</artifactId>

    </dependency>

</dependencies>

Ardından, Redis sunucunuza ait bağlantı bilgilerini application.properties veya application.yml dosyanıza ekleyin. Örnek bir yapılandırma aşağıdaki gibidir:

properties

Copy code

# Redis

spring.redis.host=localhost

spring.redis.port=6379

Spring Boot'un cache desteğini etkinleştirmek için ana sınıfınızda @EnableCaching annotation'ını ekleyin:

java

Copy code

import org.springframework.cache.annotation.EnableCaching;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication

@EnableCaching

public class Application {


    public static void main(String[] args) {

        SpringApplication.run(Application.class, args);

    }

}

Bu aşamadan sonra, @Cacheable, @CachePut, @CacheEvict gibi annotation'ları kullanabilirsiniz. Ancak bu annotation'ları kullanmadan önce, Spring'e hangi önbellek sağlayıcısını kullanması gerektiğini belirtmeliyiz. Bunun için bir CacheManager bean'i oluşturmalıyız. Spring Boot, Redis için otomatik bir CacheManager oluşturacaktır, ancak sizin spesifik ihtiyaçlarınıza göre özelleştirebilirsiniz. Örneğin, aşağıdaki şekilde bir RedisCacheManager bean'i oluşturabiliriz:

java

Copy code

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.data.redis.cache.RedisCacheManager;

import org.springframework.data.redis.connection.RedisConnectionFactory;


@Configuration

public class CacheConfig {


    @Bean

    public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {

        return RedisCacheManager.create(connectionFactory);

    }

}

Bu adımların ardından, Redis'in Spring Boot uygulamanızda önbellek sağlayıcısı olarak kullanılması gerektiğini belirtmiş olursunuz.


Spring boot ile sınıf seviyesinde cache objesi nasıl yapılır?


Spring Boot uygulamasında, sınıf seviyesinde önbellek kullanmak için @Cacheable, @CachePut, @CacheEvict gibi Spring Cache Abstraction annotation'larını kullanabilirsiniz.


Bir sınıfın bütün metodlarını önbelleklemek için sınıf seviyesinde @Cacheable annotation'ını kullanabilirsiniz:


java

Copy code

import org.springframework.cache.annotation.Cacheable;

import org.springframework.stereotype.Service;


@Service

@Cacheable("books")

public class BookService {


    public Book findBookByIsbn(String isbn) {

        // Some expensive operation to find book by ISBN

    }


    public Book findBookByTitle(String title) {

        // Some expensive operation to find book by title

    }

    

    // other methods...

}

Bu örnekte, BookService sınıfı @Cacheable annotation'ı ile süslenmiştir ve "books" adında bir önbellek kullanır. Bu, findBookByIsbn ve findBookByTitle metodları dahil olmak üzere sınıftaki tüm metodların sonuçlarının "books" önbelleğinde saklanacağı anlamına gelir.


Her metod için farklı bir önbellek kullanmak isterseniz, metod seviyesinde @Cacheable annotation'ını kullanabilirsiniz:


java

Copy code

import org.springframework.cache.annotation.Cacheable;

import org.springframework.stereotype.Service;


@Service

public class BookService {


    @Cacheable("isbnBooks")

    public Book findBookByIsbn(String isbn) {

        // Some expensive operation to find book by ISBN

    }


    @Cacheable("titleBooks")

    public Book findBookByTitle(String title) {

        // Some expensive operation to find book by title

    }

    

    // other methods...

}

Bu örnekte, findBookByIsbn metodu "isbnBooks" önbelleğini ve findBookByTitle metodu "titleBooks" önbelleğini kullanır.


Spring Data Redis mülakat soruları ve cevapları


Spring Data Redis, Spring Data projesinin bir parçasıdır ve Java uygulamalarının Redis veri deposuyla kolayca entegre olmasını sağlar. Spring Data Redis, Redis sunucularıyla çalışırken daha üst düzey bir soyutlama sunar ve çeşitli özellikler sağlar, örneğin: otomatik modelleme/dönüşüm, veritabanı işlemleri için şablon sınıfları, ve Redis'i kullanarak mesajlaşma ve olay işleme gibi yetenekler.


Aşağıda Spring Data Redis hakkında yaygın mülakat soruları ve örnek yanıtları bulabilirsiniz.


1. Soru: Spring Data Redis ne için kullanılır?


Cevap: Spring Data Redis, Java uygulamalarının Redis veri deposuyla kolayca entegre olmasını sağlar. Bu entegrasyon, otomatik modelleme/dönüşüm, veritabanı işlemleri için şablon sınıfları, Redis'i kullanarak mesajlaşma ve olay işleme gibi yetenekleri içerir. Spring Data Redis, Redis'in tüm anahtar-değer veri modelini destekler ve Redis'i kullanarak veri erişimi ve işleme için güçlü bir araç seti sağlar.


2. Soru: Spring Data Redis'i kullanırken nasıl bir veritabanı modeli kullanılır?


Cevap: Spring Data Redis, Redis'in anahtar-değer veri modelini kullanır. Bu model, her verinin bir anahtara (genellikle bir string) atanarak depolandığı basit bir modeldir. Değerler, basit bir string, bir liste, bir set, bir sıralı set, veya bir hash olabilir. Spring Data Redis, bu veri tiplerini kullanarak veriyi depolar ve alır.


3. Soru: Spring Data Redis ve RedisTemplate arasındaki fark nedir?


Cevap: RedisTemplate, Spring'in Redis sunucuları ile etkileşim kurmak için sağladığı düşük düzeyli bir sınıftır. Spring Data Redis ise daha üst düzey bir soyutlamadır ve otomatik nesne-serileştirme/deserileştirme, çeşitli veri tipleriyle çalışma ve veri depolama/erişim için daha geniş bir API seti sağlar. Yani, RedisTemplate ile doğrudan çalışabilirsiniz, ancak Spring Data Redis'in sunduğu ekstra özelliklerden yararlanmak daha kolay ve verimli olabilir.


4. Soru: Spring Data Redis'te @RedisHash annotasyonu ne işe yarar?


Cevap: @RedisHash annotasyonu, Spring Data Redis'te bir sınıfın Redis'te bir hash olarak depolanacağını belirtir. Bu annotasyon, sınıfın alanlarının hash'in alanlarına nasıl eşleştirileceğini ve alanların nasıl serileştirilip deserileştirileceğini yönetir. Bu, bir sınıfı doğrudan Redis veri deposuna kolayca eşleştirmeyi sağlar.


5. Soru: Spring Data Redis'te bir öğenin süresi nasıl ayarlanır?


Cevap: RedisTemplate veya StringRedisTemplate kullanılıyorsa, 'expire' veya 'expireAt' metotları kullanılarak bir anahtarın süresi belirlenebilir. Bunun yanında, @TimeToLive anotasyonu kullanılarak bir Spring Data Redis @RedisHash sınıfındaki belirli bir alanın öğenin ömrünü belirlemesi sağlanabilir. Bu alanın değeri, öğenin Redis'teki yaşam süresini saniye cinsinden belirler.


Öncelikle, örnek bir @RedisHash sınıfını inceleyelim:


java

Copy code

import org.springframework.data.annotation.Id;

import org.springframework.data.redis.core.RedisHash;


@RedisHash("Student")

public class Student {

    @Id

    private String id;

    private String name;

    private String grade;


    // Getters and setters...

}

Bu örnekte, Student adlı bir sınıf oluşturduk. @RedisHash("Student") anotasyonu, bu sınıfın Redis'te bir hash olarak depolanacağını belirtir. @Id anotasyonu ise hangi alanın bu sınıfın benzersiz tanımlayıcısı olacağını belirtir.


Şimdi, bu Student sınıfını nasıl kaydedip alabileceğimizi gösteren bir örnek inceleyelim:


java

Copy code

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.data.redis.core.HashOperations;

import org.springframework.stereotype.Repository;


@Repository

public class StudentRepository {

    private HashOperations hashOperations;


    @Autowired

    public StudentRepository(HashOperations hashOperations){

        this.hashOperations = hashOperations;

    }


    public void save(Student student){

        hashOperations.put("Student", student.getId(), student);

    }


    public Student find(String id){

        return (Student) hashOperations.get("Student", id);

    }

}

Bu örnekte, StudentRepository adında bir sınıf oluşturduk. Bu sınıf, Student sınıfını Redis'te depolayıp almamızı sağlar. save metodu, bir Student nesnesini alır ve Redis'te depolar. find metodu ise bir öğrenci id'si alır ve o id'ye karşılık gelen Student nesnesini geri döndürür.


Son olarak, bir Student nesnesini nasıl oluşturup kaydedeceğimizi ve sonra nasıl alacağımızı gösteren bir örneğe bakalım:


java

Copy code

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.boot.CommandLineRunner;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication

public class Application implements CommandLineRunner {


    @Autowired

    private StudentRepository studentRepository;


    public static void main(String[] args) {

        SpringApplication.run(Application.class, args);

    }


    @Override

    public void run(String...args) throws Exception {

        Student student = new Student();

        student.setId("1");

        student.setName("John");

        student.setGrade("A");

        

        studentRepository.save(student);

        

        Student retrievedStudent = studentRepository.find("1");

        System.out.println(retrievedStudent.getName()); // Prints "John"

    }

}

Bu örnekte, bir Student nesnesi oluşturuyoruz, bilgilerini ayarlıyoruz ve sonra StudentRepository kullanarak bu nesneyi Redis'te depoluyoruz. Daha sonra, bu öğrenciyi id'sini kullanarak geri alıyoruz ve adını yazdırıyoruz. Bu, Spring Data Redis'in temel kullanımının bir örneğidir.


Tamam, önceden bahsettiğimiz @TimeToLive anotasyonunun kullanımı hakkında bir örnek vereyim.


@TimeToLive anotasyonu ile belirli bir nesnenin ne kadar süreyle Redis'te saklanacağını belirleyebiliriz. İşte @TimeToLive anotasyonunun kullanıldığı bir Student sınıfı örneği:


java

Copy code

import org.springframework.data.annotation.Id;

import org.springframework.data.annotation.TimeToLive;

import org.springframework.data.redis.core.RedisHash;


@RedisHash("Student")

public class Student {

    @Id

    private String id;

    private String name;

    private String grade;


    @TimeToLive

    private long expiration; // in seconds


    // Getters and setters...

}

Bu örnekte, @TimeToLive anotasyonunu expiration alanına ekledik. Bu alanın değeri (saniye cinsinden), öğrenci nesnesinin Redis'te kalacağı süreyi belirler.


Bu sınıfı kullanarak, bir öğrenci nesnesini oluşturabilir ve bu nesneyi 60 saniye süreyle Redis'te saklayabiliriz:


java

Copy code

Student student = new Student();

student.setId("1");

student.setName("John");

student.setGrade("A");

student.setExpiration(60); // The student will be stored in Redis for 60 seconds.


studentRepository.save(student);

Spring Data Redis, RedisTemplate üzerinde soyutlama sağlar ve Redis ile etkileşim kurmayı kolaylaştırır. RedisTemplate'i doğrudan kullanarak da benzer işlemleri gerçekleştirebilirsiniz, ancak Spring Data Redis'in sunduğu soyutlama ve otomatik modelleme/dönüşüm yetenekleri işlerinizi çok daha kolay hale getirir.


Spring Data Redis, özellikle büyük uygulamalar ve hizmetler için veri depolama ve erişim işlemlerini hızlandırmak ve kolaylaştırmak için kullanılır. Yüksek performansı, esnekliği ve geniş özellik seti sayesinde Spring Data Redis, pek çok farklı uygulama ve hizmet için ideal bir çözüm sunar.


Şimdi, Spring Data Redis ile Pub/Sub messaging örneği üzerinden gidelim. Bu, mesajlaşma ve etkinlik tabanlı mimarilerde yaygın olarak kullanılır.


Öncelikle bir mesaj yayınlayıcı sınıfı oluşturalım:


java

Copy code

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.data.redis.core.StringRedisTemplate;

import org.springframework.stereotype.Service;


@Service

public class MessagePublisher {

    

    @Autowired

    private StringRedisTemplate redisTemplate;


    public void publish(String channel, String message) {

        redisTemplate.convertAndSend(channel, message);

    }

}

Bu örnekte, MessagePublisher sınıfında publish metodu, belirli bir kanala bir mesaj gönderir.


Şimdi bir mesaj alıcı sınıfı oluşturalım:


java

Copy code

import org.springframework.data.redis.connection.Message;

import org.springframework.data.redis.connection.MessageListener;

import org.springframework.stereotype.Service;


@Service

public class MessageSubscriber implements MessageListener {


    @Override

    public void onMessage(final Message message, final byte[] pattern) {

        System.out.println("Received message: " + message.toString());

    }

}

MessageSubscriber sınıfı, MessageListener arayüzünü uygular ve bir mesaj alındığında ne olacağını belirler. Bu durumda, alınan mesajı basitçe yazdırırız.


Son olarak, mesaj yayınlayıcısını ve alıcıyı bir araya getirip bir mesaj yayınlayıp alalım:


java

Copy code

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.data.redis.listener.ChannelTopic;

import org.springframework.data.redis.listener.RedisMessageListenerContainer;

import org.springframework.stereotype.Component;


@Component

public class RedisPubSubExample {


    @Autowired

    private MessagePublisher messagePublisher;


    @Autowired

    private MessageSubscriber messageSubscriber;


    @Autowired

    private RedisMessageListenerContainer listenerContainer;


    public void runExample() {

        String channel = "myChannel";

        listenerContainer.addMessageListener(messageSubscriber, new ChannelTopic(channel));


        messagePublisher.publish(channel, "Hello, Redis!");

    }

}

Bu örnekte, RedisPubSubExample sınıfında, belirli bir kanala bir MessageSubscriber ekliyoruz ve ardından o kanala bir mesaj yayınlıyoruz. MessageSubscriber'ın onMessage metodunun, yayınlanan mesajı alıp yazdıracağını göreceksiniz.


Pub/Sub messaging, olay tabanlı sistemlerde ve gerçek zamanlı uygulamalarda yaygın olarak kullanılır. Örneğin, bir kullanıcının bir işlemi tamamladığında diğer bir sistem bölümünün buna tepki vermesi gerekiyorsa, bir mesaj yayınlayabilir ve diğer sistem bölümü bu mesajı alabilir ve uygun bir işlem yapabilir. Spring Data Redis'in bu yeteneği, Redis'in güçlü pub/sub özelliklerini Java uygulamaları için kolayca kullanılabilir hale getirir.


Tabii ki, devam ediyorum. İlgili bir başka konu ise Redis Transactions. İşlem, bir veritabanında gerçekleştirilen bir veya daha fazla işlemin bir grup olarak kabul edilmesidir. Bu, ya tüm işlemlerin başarıyla tamamlanması veya hiçbirinin uygulanmaması anlamına gelir.


Spring Data Redis, Redis işlemlerini destekler. RedisTemplate veya StringRedisTemplate kullanarak bir işlem başlatabiliriz. İşte bir örnek:


java

Copy code

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.data.redis.core.RedisTemplate;

import org.springframework.data.redis.core.SessionCallback;

import org.springframework.stereotype.Service;


@Service

public class TransactionService {


    @Autowired

    private RedisTemplate<String, String> template;


    public void executeTransaction() {

        template.execute(new SessionCallback<Object>() {

            public Object execute(RedisOperations operations) throws DataAccessException {

                operations.multi(); // Start transaction

                operations.opsForValue().set("key1", "value1");

                operations.opsForValue().set("key2", "value2");

                return operations.exec(); // Execute transaction

            }

        });

    }

}

Bu örnekte, executeTransaction metodu bir işlem başlatır, iki anahtar-değer çifti ekler ve sonra işlemi yürütür. multi metodu bir işlemi başlatır ve exec metodu işlemi yürütür. İşlem yürütüldüğünde, tüm işlemler ya başarıyla tamamlanır ya da hiçbir şey olmaz.


Bu, bir hata durumunda verilerin tutarlılığını sağlar. Örneğin, iki anahtar-değer çiftini eklerken bir hata oluşursa, hiçbir değişiklik yapmayacaktır. Bu, özellikle birden çok işlemi atomik bir şekilde (hepsi ya da hiçbiri) gerçekleştirmeniz gerektiğinde yararlıdır.


Redis işlemleri, Redis'in temel özelliklerinden biridir ve Spring Data Redis, bu işlemleri Java uygulamalarına kolayca entegre etmek için bir araç sunar.


Elbette, devam edelim. Redis ile kullanılabilecek bir başka özellik de, işlemlerin ne kadar sürede tamamlandığını ölçmek için kullanılan Redis Monitor'dur. Redis Monitor, tüm istemcilerden gelen talepleri zaman içinde gözlemlemek için bir mekanizma sunar.


Spring Data Redis'te, RedisTemplate veya StringRedisTemplate'in execute metodunu kullanarak Redis Monitor'u kullanabiliriz. İşte bir örnek:


java

Copy code

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.data.redis.connection.DefaultMessage;

import org.springframework.data.redis.connection.MessageListener;

import org.springframework.data.redis.core.RedisTemplate;

import org.springframework.stereotype.Service;


@Service

public class MonitoringService {


    @Autowired

    private RedisTemplate<String, String> template;


    public void monitor() {

        template.execute((RedisCallback<Object>) connection -> {

            connection.monitor(new MessageListener() {

                public void onMessage(Message message, byte[] pattern) {

                    System.out.println(new String(message.getBody()));

                }

            });

            return null;

        });

    }

}

Bu örnekte, monitor metodu Redis Monitor'u başlatır ve gelen her mesajı yazdırır. MessageListener'ın onMessage metodu, her bir mesajı nasıl işleyeceğinizi belirtir.


Bu özellik, gelen isteklerin frekansını ve yürütme süresini ölçmek, uygulamanın performansını analiz etmek ve sorunları teşhis etmek için çok kullanışlıdır. Spring Data Redis, bu yeteneği Java uygulamaları için kolayca kullanılabilir hale getirir.


Bununla birlikte, Redis Monitor'ın yoğun trafiği olan uygulamalarda kullanılmasına dikkat edilmelidir çünkü Redis Monitor, uygulamanın performansını düşürebilir. Kullanımı, genellikle sorun teşhis etme veya debugging süreçlerinde daha uygun olabilir.


Redis ile verileri depolamanın çeşitli yolları olduğunu biliyoruz - Stringler, Listeler, Setler, Hashes ve Sorted Setler gibi. Spring Data Redis, bu veri yapılarıyla çalışmayı kolaylaştırır. Aşağıda, bunlardan bazılarına örnekler vereceğim.


1. String


Redis'teki Stringler, bir anahtara ilişkilendirilmiş olan değerleri depolamak için kullanılır. Spring Data Redis'teki ValueOperations arayüzünü kullanarak stringlerle çalışabiliriz.


java

Copy code

@Autowired

private StringRedisTemplate template;


public void setKey(String key, String value) {

    template.opsForValue().set(key, value);

}


public String getKey(String key) {

    return template.opsForValue().get(key);

}

2. Hash


Redis'teki Hashes, anahtar-değer çiftlerinin bir listesini depolar. Bir hash, bir anahtara ilişkilendirilmiş birden fazla alanı ve bu alanların değerlerini saklar. Spring Data Redis'teki HashOperations arayüzünü kullanarak hashlerle çalışabiliriz.


java

Copy code

@Autowired

private StringRedisTemplate template;


public void setHashField(String key, String field, String value) {

    template.opsForHash().put(key, field, value);

}


public Object getHashField(String key, String field) {

    return template.opsForHash().get(key, field);

}

3. List


Redis'teki Listeler, bir anahtarın ilişkilendirildiği bir değerler listesini depolar. Spring Data Redis'teki ListOperations arayüzünü kullanarak listelerle çalışabiliriz.


java

Copy code

@Autowired

private StringRedisTemplate template;


public void addToList(String key, String value) {

    template.opsForList().rightPush(key, value);

}


public List<String> getList(String key) {

    return template.opsForList().range(key, 0, -1);

}

4. Set


Redis'teki Setler, benzersiz değerlerin bir koleksiyonunu depolar. Spring Data Redis'teki SetOperations arayüzünü kullanarak setlerle çalışabiliriz.


java

Copy code

@Autowired

private StringRedisTemplate template;


public void addToSet(String key, String value) {

    template.opsForSet().add(key, value);

}


public Set<String> getSet(String key) {

    return template.opsForSet().members(key);

}

Bu örnekler, Spring Data Redis'in çeşitli Redis veri yapılarıyla nasıl etkileşime girebileceğini göstermektedir. Bu yetenek, verilerinizi Redis'te nasıl yapılandıracağınıza ve sorgulayacağınıza dair esneklik sağlar.


Tabii ki, devam edelim. Redis'in bir başka ilginç özelliği olan Sorted Setler'den bahsedelim.


Sorted Set


Redis'teki Sorted Setler, bir anahtarın ilişkilendirildiği bir değerler listesini depolar, ancak bu liste bir skorla birlikte sıralanır. Yani, her elemanın bir değeri ve bir skoru vardır. Elemanlar, skorlarına göre otomatik olarak sıralanır. Spring Data Redis'teki ZSetOperations arayüzünü kullanarak Sorted Set'lerle çalışabiliriz.


java

Copy code

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.data.redis.core.StringRedisTemplate;

import org.springframework.data.redis.core.ZSetOperations;

import org.springframework.stereotype.Service;


@Service

public class RedisSortedSetExample {


    @Autowired

    private StringRedisTemplate template;


    public void addToSortedSet(String key, String value, double score) {

        template.opsForZSet().add(key, value, score);

    }


    public Set<String> getSortedSet(String key) {

        return template.opsForZSet().range(key, 0, -1);

    }


    public Set<ZSetOperations.TypedTuple<String>> getSortedSetWithScores(String key) {

        return template.opsForZSet().rangeWithScores(key, 0, -1);

    }

}

Bu örnekte, addToSortedSet metodu bir anahtar-değer çifti ekler ve bu çifti bir skorla ilişkilendirir. getSortedSet metodu, belirtilen anahtara karşılık gelen sıralı setin tüm elemanlarını döndürür. getSortedSetWithScores metodu ise, hem elemanları hem de skorları içeren bir set döndürür.


Redis'teki Sorted Setler, sıralama ve hızlı erişim gerektiren senaryolar için özellikle yararlıdır. Örneğin, bir oyunun tüm oyuncularını skorlarına göre sıralamak isteyebilirsiniz. Redis Sorted Set'leri, bu tür senaryolarda çok etkilidir ve Spring Data Redis, bu yeteneği Java uygulamaları için kolayca kullanılabilir hale getirir.


Redis'in bu güçlü ve esnek veri yapıları, verilerinizi en uygun şekilde depolamanıza ve sorgulamanıza olanak sağlar. Spring Data Redis, bu yapılarla etkileşim kurmayı basitleştirir ve kodunuzu daha anlaşılır ve yönetilebilir kılar.


Elbette, devam edelim. Redis'in sunduğu bir diğer özellik olan Expiry (son kullanma süresi) konusuna değinelim.


Her bir Redis anahtarına bir son kullanma süresi atanabilir. Bu süre dolduğunda, anahtar otomatik olarak Redis veritabanından silinir. Bu özellik, geçici verileri depolamak için oldukça yararlıdır - örneğin, oturum bilgileri, önbelleklenmiş veriler veya sınırlı bir süre için geçerli olan tokenlar.



Spring Data Redis ile bir anahtarın son kullanma süresini ayarlamak oldukça basittir. RedisTemplate veya StringRedisTemplate'in expire metodunu kullanabiliriz. İşte bir örnek:


java

Copy code

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.data.redis.core.StringRedisTemplate;

import org.springframework.stereotype.Service;


import java.util.concurrent.TimeUnit;


@Service

public class ExpiryExample {


    @Autowired

    private StringRedisTemplate template;


    public void setKeyWithExpiry(String key, String value, long timeout, TimeUnit unit) {

        template.opsForValue().set(key, value);

        template.expire(key, timeout, unit);

    }

}

Bu örnekte, setKeyWithExpiry metodu bir anahtar-değer çifti ekler ve belirtilen süre sonunda anahtarın sona ermesini ayarlar. TimeUnit enum'ı, sürenin saniye, milisaniye veya dakika gibi birimlerle ifade edilmesini sağlar.


Bir anahtarın son kullanma süresini kontrol etmek için getExpire metodu kullanılabilir. Bu, anahtarınn ne kadar süre sonra sona ereceğini belirtir:


java

Copy code

long expiry = template.getExpire(key, TimeUnit.SECONDS);

Son kullanma süresi, Redis'in esnekliğini ve kullanılabilirliğini daha da artırır. Spring Data Redis, bu özelliği Java uygulamalarında kullanmayı kolaylaştırır.


Elbette, devam edelim. Redis Pub/Sub özelliğine değinelim.


Redis Pub/Sub, bir yayıncı/abone mesajlaşma modeli sağlar. Bir yayıncı, belirli bir kanala bir mesaj gönderir ve bu kanala abone olan herkes bu mesajı alır. Bu, verilerin gerçek zamanlı olarak birçok alıcıya dağıtılmasına olanak sağlar.


Spring Data Redis, Redis Pub/Sub özelliğini kullanmayı kolaylaştırır. İşte bir örnek:


java

Copy code

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.data.redis.core.StringRedisTemplate;

import org.springframework.data.redis.listener.ChannelTopic;

import org.springframework.stereotype.Service;


@Service

public class PubSubExample {


    @Autowired

    private StringRedisTemplate template;


    private ChannelTopic topic = new ChannelTopic("news");


    public void publish(String message) {

        template.convertAndSend(topic.getTopic(), message);

    }

}

Bu örnekte, publish metodu bir mesajı belirtilen kanala gönderir. Yayıncı, mesajını convertAndSend metodunu kullanarak gönderir.


Aynı şekilde, bir abone bir kanala abone olabilir ve mesajları alabilir:


java

Copy code

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.data.redis.connection.MessageListener;

import org.springframework.data.redis.listener.ChannelTopic;

import org.springframework.data.redis.listener.RedisMessageListenerContainer;

import org.springframework.stereotype.Service;


@Service

public class PubSubExample {


    @Autowired

    private RedisMessageListenerContainer container;


    private ChannelTopic topic = new ChannelTopic("news");


    public void subscribe(MessageListener listener) {

        container.addMessageListener(listener, topic);

    }

}

Bu örnekte, subscribe metodu, belirtilen MessageListener'ı belirtilen kanala abone eder. Mesaj geldiğinde, MessageListener'ın onMessage metodu çağrılır.


Redis Pub/Sub, verilerin gerçek zamanlı olarak yayılmasına olanak sağlar. Bu, canlı güncellemeler, bildirimler, chat uygulamaları ve diğer gerçek zamanlı özellikler için yararlıdır. Spring Data Redis, bu yeteneği Java uygulamalarına kolayca entegre etmek için bir araç sunar.


Evet, devam edelim. Bu sefer, Redis'in bir başka önemli özelliği olan işlemler (transactions) üzerine konuşacağız.


Redis işlemleri, birden çok Redis komutunun bir atomik birim olarak yürütülmesini sağlar. Yani, ya tüm komutlar başarılı bir şekilde yürütülür, ya da hiçbiri yürütülmez. Bu, veri bütünlüğünün korunmasına yardımcı olur.


Spring Data Redis, SessionCallback arayüzünü kullanarak Redis işlemlerini destekler. Aşağıda bir örneğini görebiliriz:


java

Copy code

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.data.redis.core.RedisOperations;

import org.springframework.data.redis.core.SessionCallback;

import org.springframework.data.redis.core.StringRedisTemplate;

import org.springframework.stereotype.Service;


@Service

public class TransactionExample {


    @Autowired

    private StringRedisTemplate template;


    public void doInTransaction(String key, String value1, String value2) {

        template.execute(new SessionCallback<Object>() {

            @Override

            public Object execute(RedisOperations operations) throws DataAccessException {

                operations.multi();  // Start a new transaction

                operations.opsForValue().set(key, value1);

                operations.opsForValue().set(key, value2);

                return operations.exec();  // Execute the transaction

            }

        });

    }

}

Bu örnekte, doInTransaction metodu bir işlem başlatır, iki set operasyonu gerçekleştirir ve işlemi yürütür. multi metodu yeni bir işlem başlatır, ve exec metodu işlemi yürütür. İşlem sırasında herhangi bir hata oluşursa, işlem otomatik olarak iptal edilir ve hiçbir komut yürütülmez.


Redis işlemleri, çoklu komutların bir atomik birim olarak yürütülmesi gerektiğinde oldukça yararlıdır. Bu, veri bütünlüğünü korumaya yardımcı olur ve bir işlemin tamamlanması için gerekli olan tüm komutların başarılı olmasını garanti eder. Spring Data Redis, bu özelliği Java uygulamalarına kolayca entegre etmek için bir araç sağlar.


Tabii ki, devam edelim. Şimdi de Redis'in Lua scriptleri kullanabilme yeteneklerini ele alacağız.


Redis, Lua scripting dilini kullanarak daha karmaşık işlemleri tek bir atomik adımda gerçekleştirebilir. Bu, birden fazla komutu bir arada çalıştırma ve ağ gecikmesinden kaynaklanan maliyeti azaltma yeteneği sağlar.


Spring Data Redis, RedisScript ve DefaultRedisScript sınıfları aracılığıyla Lua scripting'i destekler. Aşağıda bir örneğini görebilirsiniz:


java

Copy code

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.data.redis.core.RedisOperations;

import org.springframework.data.redis.core.StringRedisTemplate;

import org.springframework.data.redis.core.script.DefaultRedisScript;

import org.springframework.stereotype.Service;


@Service

public class LuaScriptExample {


    @Autowired

    private StringRedisTemplate template;


    public void runScript(String key, String value) {

        DefaultRedisScript<String> script = new DefaultRedisScript<>();

        script.setScriptText("redis.call('set', KEYS[1], ARGV[1])");

        script.setResultType(String.class);


        template.execute(script, Collections.singletonList(key), value);

    }

}

Bu örnekte, runScript metodu bir Lua scripti oluşturur ve çalıştırır. Bu script, belirtilen anahtarı belirtilen değerle ayarlar. execute metodu, scripti çalıştırmak için kullanılır.


Lua scripting, Redis'teki işlemlerin daha verimli ve esnek hale gelmesini sağlar. Bu, özellikle birden çok Redis komutunun tek bir atomik işlem olarak yürütülmesi gerektiğinde yararlıdır. Spring Data Redis, Lua scripting'i kolayca Java uygulamalarına entegre etmek için araçlar sunar.







Rastgele İçerik

DonanımHaber

© tüm hakları saklıdır
made with by templateszoo