8.Redıs – C# Client

REDIS – C# Client

Redis başlı başına çok kullanışlı bir nosql çözümü olmakla birlikte, bunu bir dille consume etmeyi de bilmek gerekiyor. Bu yazıda redisin C# tarafındaki implementasyonundan bahsedeceğim. Redis C# implementasyonunu sağlayabilmek için daha önceden redisin bilgisayarınızda kurulu olması gerekiyor daha sonra da projenize ServiceStack.Redis nuget paketini dahil etmelisiniz. Bu aşamaları hallettikten sonra C# tarafında redise bağlanıp işlemler yapmak oldukça kolay.

Redis C# implementasyonuna geçmeden önce eklenmesi gereken bir diğer şey de, C# tarafında çalıştırdığınız her metodun redis konsol karşılığını görebilmek için redis konsolda metotları monitor etmenizdir. Bu C# tarafında yazılan kodun redis tarafında nasıl bir command grubuna karşılık geldiğini görebilmeniz için yararlı olacaktır. Rediste bunu yapmak da son derece kolay , redis konsolu açtıktan sonra monitor yazmanız bunun için yeterli olacaktır.

Aşağıda kod örneklerine github hesabımdan hazır olarak ulaşabilirsiniz.

https://github.com/cagataykiziltan/CsharpRedisClientExample

1.Redıs Clıent Oluşturma GET/SET

C# tarafından redise bağlanıp işlem yapabilmek için client oluşturmamız gerekir. Client oluşturma işlemi çok basit olmakla birlikte bu client üzerinden redis konsolda kullandığımız tüm metotlara kod tarafında da ulaşabiliriz.  Aşağıda client üzerinden Set metoduna ulaşarak bir key ve bu key için value tanımladık. Value byte dizisi olarak gönderdik. Böylece redis üzerinde  urn:messages:1 keyimiz ve “Hello c# world” valuemizi oluşturmuş olduk.

using (IRedisNativeClient client = new RedisClient())
{
    client.Set("urn:messages:1",Encoding.UTF8.GetBytes("Hello c# world"));
}

Bu valueye ulaşmak için de yapmamız gereken oldukça basit. Oluşturduğumuz key ile valueyı aşağıdaki şekilde get edebiliriz.

using (IRedisNativeClient client = new RedisClient())
{
  var result = client.Get("urn:messages:1");

  Console.Write(Encoding.UTF8.GetString(result));
}

Redis konsol karşılığı

2.Redıs Lıst Oluşturma

Redis list yapısını da C#’da tamamen soyutlanmış bir şekilde kullanabiliriz.  Client üzerinden bir list oluşturup bunu bir C# listiymiş gibi kullanabilir, rediste list ile yapılabilecek her işlemi kod tarafında metotlarla yapabilir, buna ilaveten bu listler üzerinde tüm entity framework extension metotlarını kullanabiliriz.

Aşağıda client ile redis üzerinde bir list oluşturup bu listi server tarafında kullandığımız bir örnek bulunuyor. Örnekte client üzerinden bir list ve bu liste ulaşabileceğimiz bir key tanımladık. Daha sonrasında da list’e 3 adet eleman ekledik.

using (IRedisClient client = new RedisClient())
{
   var customerNames = client.Lists["urn:customernames"];

   customerNames.Add("Ahmet");
   customerNames.Add("Mehmet");
   customerNames.Add("Veli");
}

Oluşturduğumuz liste erişmek için aşağıdaki kodları kullanmamız yeterli olacaktır.

using (IRedisClient client = new RedisClient())
{
   var customerNames = client.Lists["urn:customernames"];

   foreach (var customerName in customerNames)
   { 
     Console.WriteLine(customerName);
   }
}

Redis konsol karşılığı

3.Redıste Nesne Tutma

Depolamak istediğimiz veri tipleri her zaman string gibi veriler olmayıp daha kompleks veriler de olabilir. Örneğin,  içerisinde adres , isim ve başka veriler tutan bir nesneyi de rediste depolayabiliriz. Redisin temel veri türü string olduğundan elimizdeki nesneyi serialize edip redise atıp alırken tekrar deserialize edebiliriz.  Ama  IRedisTypedClient kullanarak işleri kendimiz için biraz daha kolaylaştırabiliriz. IRedisTypeClient bizim için ilgili nesneyi json stringine çevirip redise atar ve redisten çeker.

Aşağıda oluşturduğumuz bir nesneyi redise atıyoruz. Bunu yaparken öncelikle elimizdeki tipi RedisTypedClient ile redise tanıtıyoruz. Daha sonrasında da oluşturduğumuz nesneyi bu typeClient üzerinden redise bir json string olarak yolluyoruz. Burada dikkat etmemiz gereken bir diğer önemli nokta customerClient.GetNextSequence(), GetNextSequence ile redise atılan her bir customer için  unique bir Id oluşturur.

long lastId = 0;
using (IRedisClient client = new RedisClient())
{
   IRedisTypedClient<Customer> customerClient = client.As<Customer>();

   Customer customer = new Customer()
   {
     Id = customerClient.GetNextSequence(),
     Address = "123 Main st", 
     Name = "Bob Green",
     Orders = new List<Order>
    {
      new Order {OrderNumber = "AB123"},
      new Order {OrderNumber = "AB1234"}
    }
};
    var storedCustomer = customerClient.Store(customer);
    lastId = storedCustomer.Id;
}

Nesneyi redise attırtan sonra , tekrar almak için yapmamız gereken tek şey, redis tarafından oluşturulan Id ile nesneyi redisten çekmek. Redisten nesnemizi çektiğimiz an direkt olarak modelimize mapli olarak gelecektir.

using (IRedisClient client = new RedisClient())
{
   var customerClient = client.As<Customer>();
   var customer = customerClient.GetById(lastId);

  Console.WriteLine("Got customer {0}, with name {1}", customer.Id, customer.Name);

}

Redis konsol karşılığı

4.Redıs Transactıon Yönetme

Transcationın ne olduğunu ve redis consoleda transcation yönetimini ‘rediste transaction yönetimi’ yazımda detaylıca açıkladığım için tekrar uzun uzun açıklamayıp burada sadece .net tarafındaki implementasyonundan bahsedeceğim.

.net tarafında client üzerinden bir transcation başlatmak için CreateTransaction() kullanılır. Yaratılan transcation üzerinden de QueueCommand() metoduyla transcationa komutlar sıralanır ve commit edilir.

using (IRedisClient client = new RedisClient())
{
    var transaction = client.CreateTransaction();

    transaction.QueueCommand(c=>c.Set("abc",1));
    transaction.QueueCommand(c => c.Increment("abc", 1));

    transaction.Commit();

   var result = client.Get<int>("abc");

   Console.WriteLine(result);

}

Redis konsol karşılığı

5.REDIS PUB/SUB

.Net tarafında redis pub/subı implemente etmek de diğer redis implementasyonları kadar basit.

ilk olarak .net tarafında bir kanal oluşturup bu kanaldan yayınladığımız mesaja redis konsol tarafından erişmeye çalışıcaz. Bunun için tek yapmamız gereken PublishMessage( KanalIsmi, Mesaj ) kalıbını aşağıdaki şekilde kullanmak. Daha sonrasında redis konsol tarafına geçip  subscribe kanalIsmi kalıbıyla .net tarafında oluşturacağımız kanala subscribe oluyoruz. Subscribe işlemini tamamladıktan sonra .net tarafındaki projemizi run eder etmez redis konsolda .net tarafından gelen mesajı real time olarak aşağıdaki şekilde görebiliyoruz.

using (IRedisClient client = new RedisClient())
{
   client.PublishMessage("debug", "Hello C#");
}

Şimdi de redis konsol tarafında bir kanal üzerinden yayınlanan mesajlara real time olarak .net tarafından ulaşmaya çalışacağız. Önce subscribe nesnesi yaratıp bu nesne üzerinden mesaja aşağıdaki gibi ulaşabiliriz. Kodtaki m redis tarafından real time olarak gelen mesajı, c ise subscribe olduğumuz kanalı (channel) belirtir. En aşağıdaki sub.SubscribeToChannels(“news”); ise news isimli kanala subscribe olduğumuzu belirtir. Aşağıdaki kodları yazıp run ettikten sonra redis konsol tarafına geçebiliriz.

using (IRedisClient client = new RedisClient())
{
   var sub = client.CreateSubscription();
   sub.OnMessage = (c, m) => Console.WriteLine("Got message: {0}, from channel {1}", m, c);

  sub.SubscribeToChannels("news");
}

Sağ konsolda gördüğünüz gibi bir kanal üzerinden real-time mesaj publish etmek oldukça kolay. publish kanalIsmi message kalıbıyla yayınladığımız mesaj sol tarafta C# konsola real-time olarak düşecektir. Redis konsolundan aldığımız 1 returnı de bize publish işleminin sorunsuz olduğunu belirtir.