Asp.Net Core + Redis/In-Memory
Makaleler => https://www.gencayyildiz.com/blog/redis-yazi-dizisi/
Asp .Net MVC Uygulamasında In-Memory Örneği
- Öncelikle servisimizi Program.cs dosyamıza ekliyoruz.
- Ardından kullanmak istediğimiz yerde IMemoryCache interface’ini çağırıp concructorda geçiyoruz.
Get() – Set() Kullanımı
- _memoryCache fieldı üzerinden generic Set<T>(Object key, T value) metodunu kullanarak cache’e key value şeklinde bir kayıt atıyoruz.
- Daha sonra başka bir fonksiyon içersinden de yine _memoryCache fieldını kullanarak generic Get<T>(Object key) metodu ile cacheden verimizi çekiyoruz.
GetOrCreate() – TryGetValue() – Remove() Kullanımı
- GetOrCreate() metodu ilgili key değerine sahip value değerini arar bulursa değeri getirir bulamassa oluşturur.
- TryGetValue() metodu key değeri ile sorgulama yapar ve geriye boolen türünde cevap döner.Ama istersen generic halini kullanarak out anahtar sözcüğü ile true dönen sonuç için value değerini bir değişkene atayabilirsin.
- Fonksiyon parametresinin lambda fonksiyonu ile verilmesi.
- Remove() metodu ile key değeri üzerinden cache de tutulan bir veriyi silebilirsin.
Not (out anahtar kelimesi) : C# dilinde out anahtar kelimesi, bir metodun parametre olarak aldığı bir değişkenin, metodun içinde değiştirilip, metodun dışına yani çağırıldığı yere geri döndürülmesini sağlar. out parametresi, bir metot çağrısı sırasında değişkene bir değer atanmasını zorunlu kılar. Bu mekanizma özellikle bir metodun birden fazla değer döndürmesi gerektiğinde veya bir değerin metot içerisinde hesaplanıp dışarıya iletilmesi gerektiğinde kullanışlıdır.
out Parametresinin Kullanımı
out parametresini kullanmak için, hem metot tanımında hem de metot çağrısında bu anahtar kelimeyi belirtmek gereklidir.
out İle ref Farkı
- out parametresi ile metot içine giren değişkenin mutlaka metot içinde bir değer alması zorunludur. Ancak ref anahtar kelimesinde, değişkenin metoda gönderilmeden önce de bir değer taşıması gerekir.
- out parametresinde, değişkenin metot çağrılmadan önce ilk değerine bakılmazken, ref parametresi kullanıldığında, metot çağrılmadan önce değişkenin atanmış bir değeri olmalıdır.
Cache Priority
Yayın süreci boyunca cache’e depolanan veriler memory’i haddinden fazla şişirebilir ve yeni veriler için sistem tarafından var olan veriler silinmek istenebilir. İşte böyle bir durumda cache’den silinecek olan verilerin önceliklerini ve hangilerinin kalıcı olacağını Priority değeri aracılığıyla belirlemekteyiz.
Priority değeri; Low, Normal, High ve NeverRemove olmak üzere dört değer almaktadır. Bu değerleri sırasıyla açıklarsak eğer;
Low : Önem derecesi en düşük olan datadır. İhtiyaç doğrultusunda ilk silinecek datadır.
Normal : Önem derecesi Low’dan sonra gelen datadır.
High : Önemli veridir. Çok zaruri olduğu taktirde cache’den silinecektir.
NeverRemove : Kesinlikle silinmemesi gereken datadır. Sınıra gelinen bir memory’de Priority değeri NeverRemove olan datalarla sınır aşılırsa exception fırlatılır.
RegisterPostEvictionCallback Olayı
Cachelenmiş bir datanın hangi sebepten dolayı memory’den silindiğine dair bilgi edinmemizi sağlayan olayı fırlatan bir fonksiyondur.
Parametre olarak
public delegate void PostEvictionDelegate(object key, object value, EvictionReason reason, object state)
imzasına sahip bir delegate almaktadır. Bu delegate aracılığıyla temsil edilen fonksiyonun ‘key’ parametresine cachelenmiş datanın keyini, ‘value’ parametresine değerini, ‘reason’ parametresine ise silinme sebebini döndürmektedir.
In-Memory Complex Types Caching
** In-Memory Cache yapısında Complex Type yapılarını herhangi bir serilaze işlemine tabi tutmadan direkt cachelenebilir.
Redis Nedir?
Bir olguyu anlamlandırmak demek o olguyu temsil eden kavramın etimolojisini bilmek demektir. Tabi ki de yazılım dünyasının etimolojisi 3 günlük teknoloji ömrüne denk olduğu ve sektöre ait terminolojik kelimeler kendi aralarında ilişkisel bağ oluşturacak kadar çok fazla vakte sahip olamadıkları için kelimeler açısından zengin bir kök beklememek lazımdır.
Redis, REmote DIctionary Server(Uzak Sözlük Sunucusu) kelimelerinden oluşan, açık kaynak olan(open source) ve veri erişiminde olabilecek en hızlı yöntemi benimseyerek dataları memory’de tutan bir NoSQL veritabanıdır.
Makale => https://www.gencayyildiz.com/blog/redis-yazi-serisi-6-redis-nedir/
Docker Container ile Redis Server Ayağa Kaldırma
Neden Docker Container
Chocolatey ile Windows ortamına yapılan Redis kurulumlarında son versiyonunu yüklemekte problemler yaşamaktayız. Halbuki Linux ortamda ayağa kaldırılan Docker Containerlar ise Redis sistemlerin en güncel sürümü üzerinde bizlere çalışma imkanı tanımaktadırlar. Ayriyetten Windows işletim sistemine Redis serverı kurabilmek için yapılacak onca zahmet ve alan tahsisinden bizleri kurtarmakta, tek bir imaj ile Redis serverı ayağa kaldırmamıza imkan tanımaktadır.
Container Ayağa Kaldırma
Redis serverı bir containerda ayağa kaldırabilmek için hub.docker.com/_/redis adresindeki imajı kullanacağız.Powershell’e docker run --rm -p 1453:6379 --name rediscontainer -d redis talimatını veriniz. Eğer Docker platformunuzda ‘redis’ imajı yoksa Docker Hub Registry’den bu imaj otomatik çekilecek ve container içerisinde 6379 portunda ayağa kalkan Redis’e bizler 1453 portu ile dışarıdan erişebileceğiz.
Test Edelim
Görüldüğü üzere ‘PING’ yazıldığında ‘PONG’ karşılığını almakta ve böylece hiçbir sorun olmadığını anlamaktayız.
NOT
“docker exec -it b45 sh” komutu, Docker konteynerlerinin içindeki bir shell (komut satırı) ortamına etkileşimli olarak erişmenizi sağlar. Bu komutun detaylı açıklaması şu şekildedir:
Komutun Parçaları
- docker exec: Bu komut, mevcut çalışan bir konteynerde yeni bir komut veya işlem çalıştırmanıza olanak tanır.
- -it: Bu iki parametre, komut satırı etkileşimini sağlamak için kullanılır.
- -i: Etkileşimli modda çalıştırır, yani standart girdi (stdin) akışını açık tutar.
- -t: Pseudo-TTY (terminal) tahsis eder, yani bir terminal bağlantısı simüle eder. Bu, bir terminal içinde çalışıyormuş gibi etkileşimde bulunmanızı sağlar.
- b45: Bu, çalıştırmak istediğiniz konteynerin adıdır veya konteynerin ID'sidir. b45, konteynerin tam ID'sinin kısaltması olabilir.
- sh: Bu, konteynerin içinde çalıştırılacak olan komuttur. sh, genellikle bir Unix shell ortamıdır ve konteynerin içinde komutlar çalıştırmanıza olanak tanır. Bazı konteynerlerde /bin/sh yerine /bin/bash veya başka bir shell bulunabilir.
Komutun Ne Yaptığı
Bu komut, b45 adındaki (veya ID'sindeki) Docker konteynerine etkileşimli olarak bağlanır ve konteynerin içinde bir sh shell başlatır. Bu, size konteynerin dosya sistemine ve içinde çalışan işlemlere erişim sağlar. İçeride, normal bir terminalde çalıştırabileceğiniz gibi komutlar çalıştırabilirsiniz, örneğin:
- Dosya sistemiyle etkileşim (örneğin, ls, cd, cat komutları)
- Yeni yazılımlar yüklemek (eğer konteyner root iznine sahipse)
- Günlük dosyalarını veya uygulama çıktısını incelemek
- Uygulama hatalarını ve yapılandırmaları kontrol etmek
Örnek Senaryo
Bir web uygulaması Docker konteyneri çalıştırıyorsanız ve içinde çalışan uygulamanın yapılandırmasını kontrol etmek istiyorsanız, bu komutu kullanarak konteynerin içine girip gerekli dosyaları inceleyebilirsiniz.
Redis Desktop Manager
Redis üzerindeki anlık veri akışını görsel arayüz üzerinden görmemizi sağlayacak olan ve open source geliştirilen Redis Desktop Manager uygulamasını kısaca sizlere tanıtacağım.
Redis Desktop Manager, Redis üzerinde tutulan key-value değerlerine ulaşmamızı ve modifiye etmemizi sağlayan kullanışlı, basit ve etkili bir arayüzdür.
Edinme
Redis Desktop Manager’ı indirebilmek için redisdesktop.com adresine üye olarak 14 günlük deneme sürümünü edinebilirsiniz.
Arayüz Tanıtım
Redis Desktop Manager’ı indirip yükledikten sonra uygulamayı açtığınızda verileri görselleştirilecek Redis sunucusuna bağlanabilmek için ekranının sol üst köşesindeki “Connect to Redis Server” butonuna tıklayınız. Ardında açılan pencerede ilgili Redis sunucusuna ait bilgileri girdikten sonra “Ok” butonuna tıklamanız yeterlidir.
Not : Redis Desktop Manager bir yerden sonra ücretli hale gelmektedir.Bunun için ücretsiz başka bir 3. Parti uygulama olna Another Redis Desktop Manager uygulamasını kullandık.
Program Linki : https://github.com/qishibo/AnotherRedisDesktopManager
Arayüzü Redis Desktop Manager’a göre biraz daha sade olsada kullanımı tamamen aynıdır.
Makale => https://www.gencayyildiz.com/blog/redis-yazi-serisi-9-redis-desktop-manager-nedir-nasil-kullanilir/
Ubuntu ile Redis Kullanımı
Ubuntu Kurulumu
Windows Subsystem for Linux (WSL), Windows 10 ve üzeri işletim sistemlerinde, Linux dağıtımlarını Windows üzerinde çalıştırmanıza olanak tanır. WSL ile Ubuntu kurulumu yapmak için aşağıdaki adımları izleyebilirsiniz:
Eğer Ubuntu'yu Windows üzerinde çalıştırıyorsanız (örneğin, Windows Subsystem for Linux - WSL kullanarak), aşağıdaki adımları izleyebilirsiniz:
Ubuntu Üzerinde Redis Kurulumu ve Sunucuyu Ayağa Kaldırma
1. Paket Listelerini Güncelleme
Terminali açın ve paket listelerini güncelleyin: sudo apt update
2. Redis Paketini Yükleme
Redis'i kurmak için aşağıdaki komutu çalıştırın: sudo apt install redis-server
3. Redis Sunucusunu Başlatma
Redis sunucusunu başlatmak için: sudo systemctl start redis-server
Redis sunucusunun otomatik olarak sistemle birlikte başlatılmasını sağlamak için: sudo systemctl enable redis-server
4. Redis Sunucusunun Durumunu Kontrol Etme
Redis sunucusunun durumunu kontrol etmek için: sudo systemctl status redis-server
5. Redis Konfigürasyonunu Yapılandırma
Redis konfigürasyon dosyası genellikle /etc/redis/redis.conf yolundadır. Konfigürasyon dosyasını düzenlemek için bir metin düzenleyici kullanabilirsiniz. Örneğin: sudo nano /etc/redis/redis.conf
Yapmak istediğiniz değişiklikleri yaptıktan sonra dosyayı kaydedin ve kapatın.
6. Redis Sunucusunu Yeniden Başlatma
Yapılandırma değişikliklerinin etkili olması için Redis sunucusunu yeniden başlatın: sudo systemctl restart redis-server
7. Redis ile Bağlantıyı Test Etme
Redis sunucusuna bağlanmak ve temel komutları test etmek için: redis-cli
redis-cli komutunu girdikten sonra Redis komutlarını kullanabilirsiniz. Örneğin: set test "Redis çalışıyor!" get test
Ubuntu Redis Server Durdurma
Redis Veri Tipleri
Makale => https://www.gencayyildiz.com/blog/redis-yazi-serisi-10-redis-veri-turleri/
Asp .Net Core Trafında Redis Kullanımı
IDistributedCache Interface Yapısı ile Redis Kullanımı
- Öncelikle Microsoft.Extensions.Caching.StackExchangeRedis paketini yüklüyoruz.
- StackExchangeRedisCache yapımızı Program.cs dosyasında servis olarak geçiyoruz.
- Kullanmak istediğimiz class içerisinde IDistributedCache interface’ini oluşturup concructorda geçiyoruz.
Basit Dataların Kaydedilmesi
Not : Redis-Server ayakta olmalıdır.
Complex Dataların Kaydedilmesi
** IDistributed Redis Cache yapısında Complex Type yapılarının kaydedilmesi için serilaze ve deserilaze işlemlerine tabi tutulmalıdır.
Not : Complex Typları Redis’e gönderirken JSON formatında serilize edilebileceği gibi Binary tipinde de gönderilebilir.
Makale => https://www.gencayyildiz.com/blog/redis-yazi-serisi-11-redis-ile-distributedcache-kullanimi/
Dosyaların Kaydedilmesi
1. ImageCache Metodu:
- 1.1. Dosya Yolu Oluşturma:
- Path.Combine ve Directory.GetCurrentDirectory() kullanılarak, sunucudaki wwwroot/Images/Car.jpg adlı dosyanın tam yolu belirlenir.
- 1.2. Görüntü Verisinin Okunması:
- System.IO.File.ReadAllBytes(path) ile belirtilen dosya yolundaki görüntü dosyası bayt dizisi (byte[]) olarak okunur.
- 1.3. Verinin Önbelleğe Kaydedilmesi:
- Okunan görüntü verisi _distributedCache.Set("resim", bytes) komutuyla resim anahtarıyla dağıtılmış önbelleğe kaydedilir.
2. ImageUrl Metodu:
- 2.1. Veriyi Önbellekten Almak:
- _distributedCache.Get("resim") ile resim anahtarı kullanılarak önbellekten görüntü verisi alınır ve bayt dizisine (byte[]) atanır.
- 2.2. Görüntü Dosyasını Geri Döndürmek:
- File(bytes, "image/jpg") ile alınan bayt dizisi, image/jpg MIME türü olarak dosya şeklinde tarayıcıya geri döndürülür.
3. ImageShow Metodu:
- 3.1. Görünümün Geri Dönülmesi:
- return View(); komutuyla, ImageShow adında bir HTML görünümü döndürülür. Bu görünüm, ilgili görüntüyü göstermek için kullanılır.
4. HTML Görünümünde Görüntünün Gösterimi:
- 4.1. Görüntü Etiketinin Oluşturulması:
- <img src="/Products/ImageUrl" width="200" height="200" /> ile /Products/ImageUrl adresinden gelen görüntü, genişliği 200 piksel ve yüksekliği 200 piksel olacak şekilde sayfada gösterilir.
StackExchange ile Redis Kullanımı
- StackExchange.Redis paketi projeye dahil edilir.
- Tanımlamalarımızı ve bağlantılarımızı yaptığımız bir RedirService class’ı oluşturduk.
- Program.cs de gerekli configürasyonları yaptık.
Veri Tipleri ile Kullanımı
String Type
List Type (LinkedList => C#)
Set Type (HashSet => C#)
SortedSet Type
Hash Type (Dictionary => C#)
Yorumlar
Henüz yorum yapılmamış. İlk yorumu siz yapın!