İçeriğe geç
Anasayfa » .Net5 ile Redis Keyspace Events ve Pub/Sub Kullanımı

.Net5 ile Redis Keyspace Events ve Pub/Sub Kullanımı

Uygulamalarımız içerisinde zaman zaman bazı verilerin ‘caching’, ‘performans artırma’, ‘session yönetimi’, ‘pub/sub’, ‘message broker’ gibi ihtiyaçlarıyla karşılaşıyoruz. Bu ihtiyaçlarımızı karşılayan uygulamalar içerisinde en popüler olanlarından bir tanesi Redis’tir. Aslında Redis üzerinde birden fazla veri tabanı bulunan Nosql key-value, bir in-memorydatabase veri tabanıdır.

Bu yazımda Redis’in önemli özelliklerinden olan Keyspace Events Notification ve pub/sub mekanizmalarından bahsedeceğim. Öncelikle pub/sub ile başlamak istiyorum. Çünkü Keyspace Events ve pub/sub mekanizmaları iç içe geçmiş durumdadır.

Pub/Sub

Redis’in publish/subscribe özelliği temel olarak bir mesajlaşma sistemidir. Subscribe olan uygulamalar channel üzerinden publisher’ın mesajlarını doğrudan dinlerler. Aşağıdaki akışı inceleyerek bu yapıyı daha iyi anlayabilirsiniz.

Keyspace Events Notification

Redis üzerinde bazı event’leri yakalayarak subscribe olmuş channel’lara ilgili event bildirmek için kullanılır. Trigger edilen event’ler Redis’in normal pub/sub katmanı kullanılarak teslim edilir ve böylece pub/sub yapısı kullanan uygulamalar key event notification için tekrardan bir kod değişikliğine ihtiyaç duymazlar.

Bazı örnek event’ler:

  • Bir key için Lpush işlemin yapılması.
  • Belirli bir key için çalıştırılmış tüm komutlar.
  • Db0 üzerinde expire olan tüm key’ler.

Daha somut bir örnek vermek gerekirse; Redis üzerinde cache için sabit bir key’imizin var olduğunu ve uygulamamızın sürekli bu key değerini dinlediğini düşünelim. Key içerisindeki cache verisi Lpush işlemi ile güncellendiği zaman uygulamaya gelen notification ile uygulama güncel cache verisini Redis’ten tekrar alıyor. Bu senaryoda Keyspace Events Notification bizim için Publisher olmuş oluyor ve pub/sub üzerinden mesajını iletiyor.

Örneğimize başlamadan önce Keyspace Events Notification kullanmak için Redis üzerinde bir configuration yapmamız gerekiyor. Default olarak bu özellik Redis CPU tüketimini azaltmak için kapalı olarak gelmektedir.

Redis config dosyasında notify-keyspace-events’i aşağıdaki şekilde configure ediyorum. Bunun anlamı “m” event’i dışındaki tüm event’ler için bir notification oluşturabilir.

Notify-keyspace-events’i için kullanılan değerleri aşağıdaki resim üzerinden inceleyebilirsiniz.

Örneğimiz için gerekli kodları yazmaya geçelim. Öncelikle bir console uygulaması açarak Redis connection ve pub/sub mekanizmasını oluşturacağız.

Bunun için nuget üzerinden StackExchange.Redis paketini uygulamamıza dahil ediyoruz. Daha sonra Redis için connection açan ve bu connection’ı dönen class’ımızı oluşturduk.

Ardından Redis connection’ı alan ve bu connection için keyspace üzerinden bir pub/sub mekanizması oluşturan metotlarımızı oluşturduk.

“__keyspace@2__:CachedData”

Bu kısım oluşan pub/sub’ın Redis üzerinde hangi veri tabanı üstünde ve hangi key’i dinleyeceğini göstermektedir. @2 olmasının sebebi connection’ımızı db2 üzerinde açmamız ve Database 2 üzerinde bulunan CachedData key’i için oluşan event’leri dinleyeceğimiz anlamına gelmektedir.

Uygulamamızı tamamladık. Şimdi uygulamayı çalıştırıp ardından Redis üzerinden db2’de CachedData key’i için bir LPUSH operasyonu gerçekleştireceğiz. Aşağıdaki komut ile CachedData key’i üzerine “data” value’sunu set etmiş olduk.

LPUSH CachedData “data”

Bu set işlemi sonrasında Redis key event tetiklenerek subscribe olmuş ve db2 üzerinde CachedData key’i için event’leri dinleyen uygulamalara LPUSH event’i gerçekleştiğine dair mesajını iletti. Uygulamamız aşağıdaki resimde olduğu gibi bu event’i yakaladı.

Bundan sonraki kısımda business logic olarak nasıl ilerlemek isterseniz ona göre bir logic kurabilirsiniz. Örneğin; ‘cache data’yı bir statik objede uygulama içinde saklıyorsanız, veriniz değiştiği için yeniden Redis’ten güncel veriyi alıp uygulamadaki objenizi güncelleyebilirsiniz.

Temel key event uygulama örneğimiz için source kodlara şu Github bağlantısı üzerinden erişebilirsiniz.

Umarım faydalı olmuştur. Bir sonraki yazımızda görüşmek üzere 😊

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir