Redis Yazı Serisi 12 – StackExchange.Redis API İle Redis Kullanımı
Merhaba
Redis yazı serimizin bir önceki Redis İle DistributedCache Kullanımı başlıkla yayınladığımız makalemizde Redis ile DistributedCache’i yüzeysel olarak nasıl kullandığımızı incelemiştik. Bu içeriğimizde ise StackExchange.Redis ile datalarımızı Redis türlerinde tutarak Redis’i daha hakim nasıl kullanacağımızı inceleyeceğiz.
Kütüphane Entegrasyonu ve Servis İnşası
İlk olarak Asp.NET Core uygulamanıza StackExchange.Redis kütüphanesini entegre ediniz. Ardından bu kütüphaneyi kullanarak aşağıdakine benzer bir servis oluşturunuz.
using StackExchange.Redis; public class RedisService { ConnectionMultiplexer connectionMultiplexer; public void Connect() => connectionMultiplexer = ConnectionMultiplexer.Connect("localhost:1453"); public IDatabase GetDb(int db) => connectionMultiplexer.GetDatabase(db); }
Burada ‘Connect’ metodu içerisinde ‘ConnectionMultiplexer’ sınıfıyla ilgili Redis sunucusuna bağlantı gerçekleştirilmekte ve ardından ‘GetDb’ metodu ile de bağlantı gerçekleştirilmiş ilgili sınıf üzerinden Redis sunucusundaki veritabanları çağrılarak elde edilmektedir.
Bizler bu servisi kullanabilmek için dependency injection provider’ına singleton olarak ekleyip tekbir nesne olarak yönetebiliriz. Şöyle ki; uygulamanın ‘Startup.cs’ dosyasında
public class Startup { public void ConfigureServices(IServiceCollection services) { . . . services.AddSingleton<RedisService, RedisService>(); . . . } public void Configure(IApplicationBuilder app, IWebHostEnvironment env, RedisService redisService) { . . . redisService.Connect(); . . . } }
şeklinde bir çalışma yapmamız yeterli olacaktır. Yapıya dikkat ederseniz uygulamada 8. satırda provider’a singleton olarak dahil edilen ‘RedisService’ nesnesi, 14. satırda dependency injection’dan talep edilmekte ve 19. satırda da ‘Connect’ fonksiyonu tetiklenerek Redis sunucusuyla hali hazırda bağlantısı kurulmuş vaziyete getirilmektedir. Nihayetinde ilgili servisin nesnesi singleton olacağı için bundan sonraki ilgili nesneye dair yapılacak tüm taleplerde bağlantısı gerçekleştirilmiş bu nesne gönderilecektir.
StackExchange.Redis Kullanımı
Oluşturulan servisi dependency injection ile aşağıdaki gibi talep ettikten sonra Redis türlerinden örneklendirmelere geçebiliriz.
public class RedisController : Controller { RedisService _redisService; public RedisController(RedisService redisService) { _redisService = redisService; } }
Redis String
IDatabase database = _redisService.GetDb(1); //SET database.StringSet("name", "gencay"); //GET string value_get = database.StringGet("name"); Console.WriteLine($"Get : {value_get}"); //APPEND database.StringAppend("name", " yıldız"); string value_append = database.StringGet("name"); Console.WriteLine($"Append : {value_append}"); //INCR database.StringSet("count", 1); long value_count = database.StringIncrement("count"); Console.WriteLine($"Incr : {value_count}"); //GETRANGE string value_getrange = database.StringGetRange("name", 1, 2); Console.WriteLine($"Getrange : {value_getrange}");
Redis List
IDatabase database = _redisService.GetDb(1); //LPUSH database.ListLeftPush("ogrenciler", "furkan"); database.ListLeftPush("ogrenciler", "hakan"); database.ListLeftPush("ogrenciler", "berrak"); //RPUSH database.ListRightPush("ogrenciler", "emine"); database.ListRightPush("ogrenciler", "kevser"); database.ListRightPush("ogrenciler", "murat"); //LRANGE RedisValue[] values = database.ListRange("ogrenciler", 0, -1); int count = 1; values.ToList().ForEach(o => Console.WriteLine($"öğrenci {count++} - {o}")); //LPOP string left_pop = database.ListLeftPop("ogrenciler"); Console.WriteLine($"LPOP : {left_pop}"); //RPOP string right_pop = database.ListRightPop("ogrenciler"); Console.WriteLine($"RPOP : {right_pop}"); //LINDEX string index_value = database.ListGetByIndex("ogrenciler", 2); Console.WriteLine($"LINDEX : {index_value}");
Redis Set
IDatabase database = _redisService.GetDb(1); //SADD database.SetAdd("color", "blue"); database.SetAdd("color", "red"); database.SetAdd("color", "white"); database.SetAdd("color", "black"); //SETMEMBERS RedisValue[] values = database.SetMembers("color"); values.ToList().ForEach(c => Console.WriteLine(c)); //SREM database.SetRemove("color", "white"); Console.WriteLine("****"); values = database.SetMembers("color"); values.ToList().ForEach(c => Console.WriteLine(c));
Redis Sorted Set
IDatabase database = _redisService.GetDb(1); //ZADD database.SortedSetAdd("esya", "kalem", 5); database.SortedSetAdd("esya", "silgi", 10); database.SortedSetAdd("esya", "defter", 15); database.SortedSetAdd("esya", "kağıt", 2); //ZRANGE RedisValue[] values = database.SortedSetRangeByRank("esya", 0, -1); values.ToList().ForEach(e => Console.WriteLine(e)); //ZRANGE - WITHSCORES SortedSetEntry[] values2 = database.SortedSetRangeByRankWithScores("esya", 0, -1); Console.WriteLine("****"); values2.ToList().ForEach(e => Console.WriteLine(e)); //ZREM database.SortedSetRemove("esya", "kalem"); Console.WriteLine("****"); values = database.SortedSetRangeByRank("esya", 0, -1); values.ToList().ForEach(e => Console.WriteLine(e));
Redis Hash
IDatabase database = _redisService.GetDb(1); //HMSET database.HashSet("sozluk", "pen", "kalem"); database.HashSet("sozluk", "mouse", "fare"); database.HashSet("sozluk", "dog", "köpek"); database.HashSet("sozluk", "cat", "kedi"); //HMGET string value_cat = database.HashGet("sozluk", "cat"); Console.WriteLine(value_cat); //HDEL database.HashDelete("sozluk", "mouse"); //HGETALL HashEntry[] values = database.HashGetAll("sozluk"); values.ToList().ForEach(h => Console.WriteLine(h));
İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…
Hocam merhabalar. İçeriklerinizi hevesle takip ediyorum öncelikle teşekkürlerimi sunayım. Benim sorum şu; .net katmanlı mimaride Redis Cache kullanmak istiyorum, halihazırda InMemoryCache kullanıyorum ve cachelenecek objelerimi direkt olarak aynı tipte verip geri alabiliyorum fakat Redis Cache kullanırken objeleri string tipte tutuyor ve cacheden almak istediğim zaman string şeklinde dönüyor ve bu stringi istediğim obje türüne dönüştüremiyorum örneğin List nesnesine. Bu konuda ne yapılabilir? Bu arada cache’i aspect olarak kullanıyorum yani Json vs. ile istediğim tipe convert etmem mümkün olmuyor. Yardımcı olabilirseniz sevinirim.
Teşekkürler faydalandığım güzel bir yazı olmuş.