Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

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 Yazı Serisi 12 - StackExchange.Redis API İle Redis Kullanımı

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 Yazı Serisi 12 - StackExchange.Redis API İle Redis Kullanımı

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 Yazı Serisi 12 - StackExchange.Redis API İle Redis Kullanımı

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 Yazı Serisi 12 - StackExchange.Redis API İle Redis Kullanımı

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));

Redis Yazı Serisi 12 - StackExchange.Redis API İle Redis Kullanımı

İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

3 Cevaplar

  1. Sinan Doğan dedi ki:

    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.

  2. Kemal Karadag dedi ki:

    Teşekkürler faydalandığım güzel bir yazı olmuş.

  1. 20 Nisan 2020

    […] Redis Yazı Serisi 12 – StackExchange.Redis API İle Redis Kullanımı […]

Bir yanıt yazın

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