Durmuş Yaşar
Bimar Teknoloji Blog
6 min readMay 4, 2023

--

Redis / In-Memory Cache

Caching Nedir? Caching Çeşitleri Nelerdir?

Caching, Çok sık kullanılan verilerin kaydetme tekniğidir. Çok sık kullanılan verilerin belli bir ortama kaydettikten sonra ihtiyaç halinde bu verilerin okuma süreci vardır. Genel olarak hem kaydetme hem de ilgili verilerin ihtiyaç halinde okuma işlemi sürecine denir.

Kullanım amacı;

- Daha hızlı bir site için

- Daha iyi bir kullanıcı deneyimi için

- Gereksiz veri tabanı bağlantısını kaldırmak için

- Performans ve ölçeklenebilirliği artırmak için

2 çeşidi vardır;

- In-memory Caching (Private Caching)

- Distributed Caching (Shared Caching)

In-Memory Cache Nedir?

Uygulama ile ilgili verilerin uygulamayı koşturan web server memory’sinde kaydetme işlemine denir.

Dezavantajı

Farklı server’larda farklı zamanlarda istek yapıldığı zaman iki server isteği aldığı zaman cache’inde istenilen veri yoksa database’den veriyi alıp cache’liyor şayet bu istek zamanlarında veride bir değişiklik yoksa sorun yok. İstek yapılan zamanlarda alınan veriler farklıysa farklı memory’de farklı veriler mevcut oluyor bir başka zamanda istek geldiği zaman server’lardan herhangi birine gittiğinde farklı veriler almış oluyor buda veri tutarsızlığına sebep oluyor. Bu veri tutarsızlığının önüne geçmek için Load Balancer’a istek geldiği zaman hangi kullanıcıdan geliyorsa bu bilgiyi tutup ve bu kullanıcının ilk isteği hangi sserver’a yönlendirmişse bundan sonra ilgili kullanıcıyı hep o server’a yönlendirilir (Kısmi olarak bu veri tutarsızlığını çözer). Bu Load Balancer kullanıcı bilgisini tutma yapısına session sticker denir.

Bir server’da ayağa kaldırıyorsak uygulamamızı bir sorun yoktur ama birden fazla uygulamada birden fazla server’da ayağa kaldırıyorsak o zaman bir handikap vardır.

İşletim sistemi restart olana kadar bu bilgiler cache’de saklanır.

Net 7’de In-memory Kodlama örnekleri

Program.cs’e AddMemoryCache() eklenir.

Herhangi bir controller.cs’e IMemoryCache eklenir.

Set() memory’e veri kaydetme işlemini gerçekleştirir.

Get() memory’den veri okuma işlemini gerçekleştirir.

TryGetValue() Memory’de bu değer var mı kontrolü yapar. Birinci parametre cache’de aranacak key, ikinci parametre varsa atanacak değişken.

GetOrCreate() Cache’de bu veri var ise getirir yoksa şayet cache’de bu key’e ait cache oluşturur.

MemoryCacheEntryOptions cache ile ilgili ayarlamaları yapmış olduğumuz yapıdır.

AbsoluteExpiration: Cache ömür süresi

SlidingExpiration: Cache verinin inaktif kalacağı süre

Priority: Cache dolduğu zaman yeni gelecek cache için ilk silinecek cache bilgisini belirtir.

- High: Önemli veri bunu silme

- Low: Önemli değil ilk bunu sil

- Normal: High-Low arası sıralı siler

- NewRemove: Memory dolsa dahi bu veriyi silme

RegisterPostEvictionCallback Memory’den silinen veriler silindikten sonra bir cache’in hangi sebep ile silindiğini tespit etmeye yarar.

Distributed Caching Nedir?

Cachelenecek olan veriler uygulamanın ayağa kalkmış olduğu server memory’sinde değil tamamen ayrı bir cache server’daverilerin tutulması ve bunların okunması işlemine denir.

Avantajlar;

- Veri tutarsızlığının önüne geçer

- Server’lar restart olsa dahi cache’lenmiş veriler bir server’da tutulduğu için saklanır.

Dezavantajı

- Uygulama dışında olduğu için erişim daha yavaş

- İmplementasyon ve kullanımı in-memory’e göre zordur.

Cache’lenecek veri çok güncellenmemeli ve çok sık erişebileceğimiz veri olmalı.

Not: Kullanımı Redis ile birlikte gösterilecektir.

On-Demand Caching Nedir?

Verinin talep olduğu zaman cache’lenmesidir.

PrePopulation Caching Nedir?

Uygulama ayağa kaldırıldığı zaman eğer bir veri cache’lenmek isteniliyorsa uygulama ayağa kalktığı zaman talep gelmeden database’den veri alınarak cache’lenmesidir.

On-Demand Caching ile PrePopulation Caching arasında bir üstünlük yoktur ihtiyaca göre hangi strateji uygunsa o kullanılır.

Cache Ömrü (Absolute ve Sliding Time) Nedir?

Absolute Time: Bir cache’in kesin bir ömür zamanı verilmesi, kesin olarak memory’de kalacağı süre

Sliding Time: Bir cache’in memory’de ne kadar inactive kalacağıdır. Bir cache t süre verip o cache t süresi bitmeden bir istek gelirse o cache’in ömrünü nir t süresi kadar daha uzatır.Eğer t sürede erişim olmazsa bu cache silinir. Dezavantajı her zaman bayat veriyi alınabilir. Bunu engellemek için Sliding Time ile birlikte Absolute Time’da tanımlanır.

Complex Type Caching

Uygulama içinde class’lar ve bunlardan alınan nesne örnek alınan verilerin cache’lenebilir.

Redis (Remote Dictionary Server) Nedir?

Disburited Cache denilebilir. Open source olarak geliştirilen ve verileri memory’de tutan noSql bir database’tir. Avantajlarının başında database’e sahip olması gelir. Verileri memory’de tuttuğu için verileri çok hızlı okuma ve yazmaya sahiptir. Güçlü olduğu yanlardan bir taneside in-memory’e karşı veri tutarlılığıdır. Kullanıcımızın session bilgilerinde redis server’da saklayabiliyoruz.

Windows için: Choclately ile redis kurulumu gerçekleştirilebilir.

Redis ayağa kaldırma komutu: redis-server

Server başarılı bir şekilde çalışıyor mu diye kontrol etmek için farklı bir terminalden redis-cli komutu çalıştırılır ve PONG komutu yazılır.

Not: redis-cli –row komutu ile Encode dilmiş karakterleri okumak için çalıştırılabilir.

Docker için: Docker-Hub’ üyelik yapılır. Arama alanından Redis aranır ve

Bu paket seçilir. How to use this image altında ki start a redis instance komutu çalıştırılır.Docker Desktop üzerinden de Redis kuruumu gerçekleştirilebilir.

Redis Desktop Manager üzerinden redis içerisinde ki database ve içerikleri görünütlenebilir.

Net 7 projesine redis implementasyonu

Program.cs

Herhangi bir controller üzerinde

Redis Veri Tipleri

- Redis String

- Redis List

- Redis Set

- Redis Sorted Set

- Redis Hash

Redis String : Sadece string değer tutar anlamına gelmez <key, value> olarak tek bir tipte veri tutar.

PowerShell komutları

- SET String tipinde bir veri koymak için kulanılan komuttur.

o SET name durmus

- GET: String tipinde key ve value getirir.

o GET name

- GETRANGE: Okunacak string’in index aralığında okuma

o GETRANGE name 0 3

- INCR: key ile beraber value integer ise arttırır.

o INCR count

- INCRBY: integer value’yi istenilen kadar arttırma

o INCRBY count 10

- DECR: integer değeri azaltmak için kullanılır bir değer azaltır.

o DECR count

- APPEND: var olan veriyi eklemek için kullanılır.

o APPEND name yasar

Redis List: C# programlama dilinde LinkedList’e karşılık gelir. İçinde list tipinde veri tutan veri tipidir. Listenin istenilen yerine veri ekleme silme yapılabilir.

PowerShell komutları

- LPUSH, RPUSH: Left Push anlamına gelir, RPUSH: Right Push anlamına gelir. Veri ekleme komutlarıdır.

o LPUSH kitap kitap1

o RPUSH kitap kitap2

- LRANGE, RRANGE: listeyi sıralama komutudur.

o LRANGE kitap 0 2

o RRANGE 0 -1 (-1: bütün veriyi listeler)

- LPOP, RPOP: Listeden veri silme komutudur.

o LPOP kitap

- LINDEX: Belirtilen index’teki veriyi alma

o LINDEX kitap 2

Redis Set: List veri tipi gibi dizin tutar. Tutulan veri Unique olmalı ve verinin nereye ekleneceğini redis kendi random atar.

PowerShell komutları

- SADD: Set’e veri ekleme

o SADD color blue

- SMEMBERS: Verileri okuma

o SMEMBERS color

- SREM: Veri silme

o SREM color blue

Redis Sorted List: Sıralama üzerine bir veri tipidir. Dizin içine veri eklerken sıra belirtilebilir. Sıralama score değişkini ile yapılmaktadır. Value değeri unique olmalıdır.

PowerShell komutları

- ZADD: Veri ekleme

o ZADD: kitaplar 1 kitap1

- ZRANGE: Verileri listeleme komutu

o ZRANGE kitaplar 0 -1 WITHSCORES (Cscore ile listelemek için eklenir opsiyonel)

- ZREM: Veri Silme

o ZREM kitaplar kitap1

Redis Hash: Dizin olarak <key,value> olarak veri tutan dicitonary veri tipidir.

PowerShell komutları

- HMSET: Veri ekleme komutu

o HMSET: sozluk pen red

- HGET: Veri okuma komutu

o HGET sozluk pen

- HDEL: Veri silme komutu

o HDEL sozluk pen

- HGETALL: Tüm verileri listeleme komutu

o HGETALL sozluk

Net 7’de Cache ile Redis Kullanımı

1. IDistributedCacge: bu interface’i herhangi bir controller’ın constructor’ına implemente ederek burada set get ile caching yapıalbilir.

2. AddStackExchangeRedisCache: resi ile ilgili daha detaylı kullanım için tüm veri tiplerini ve komutları bu API ilekullanabiliriz.

İlk önce Microsoft.Exetnsions.Caching.StackExchangeRedis paketi yüklenir.

IDatabase üzerinden gerekli komutlar yürütülebilir.

Ekstra Bilgiler

1 — Projelerde Asenkron kullanarak uygulamanın performansını daha çok artıracaktır. Uygulama ayağa kalktığı zaman var olan thread’ler çok daha efektif bir şekilde kullanılacaktır.Asenkron kullanıldığı zaman thread yönetimi çok daha kolay bir şekilde yapar ve bu thread’i efektif kullandığından dolayı uygulama daha performanslı response’lar daha hızlı olur ve daha fazla request alır. Ama asenkron kullanılmazsa istek yapılan methoda istek bitinceye kadar thread tutacağından dolayı o thread’i bırakmayacak ve çok fazla thread olmayacaktır. Asenkron kullanıldığında thread havuzundan bir thread alındığında asenkron method işi bittiğinde o thread’i havuza bırakır ihtiyaç olduğunda tekrar kullanır. Aenkron kullanılmadığında thread havuzundan bir thread aldığı zaman işlem bitinceye kadar thread’i tutar ve böylece thread havuzunda çok fazla thread kullanıldığı için çok performanslı çalışmaz.

2- InmemoryDB verilerin memory’de tutulmasını temsil eder. Amaç özellikle bir şeyler test edilmek istenildiğinde yani hızlı bir uygulama ayağa kaldırmak istediğimizde kullanılır ve özellikle Integration Test yazarken gerçek bir database kullanmak yerine InmemoryDb kullanılırsa testler çok daha hızlı bir şekilde gerçekleşir. InmemoryDb’e yazdığı için normal bir database’e yazmaktan çok daha hızlı olacaktır. Uygulama kapatıldığında memory’e yazılan verieler silinir. InmemorySb’de normal ilişkisel database’lerdeki gibi gerçek bir ilişki yoktur.

3- Decorator Disagn Pattern: Bir uygulamanın kodlarını değiştirmeden o uygulamaya yeni davranışlar eklemeye imkan veren Disagn Pattern’dir.

Eğitim esnasında yazmış olduğum kodların bulunduğu Github repository

https://github.com/durmusyasar/RedisAndInMemory

Kaynakça

Eğitmen: Fatih ÇAKIROĞLU

Eğitim: Asp.Net Core + Redis/In-Memory

--

--