Redis ile Azure da Mvc, AngularJs ve SignalR İle PubSub Bölüm1
Selamlar,
Bugün Asp.NET Mvc ile Azure üzerinde Redis kullanarak dataların nasıl memory’de tutulup, istendiğinde çekilebileceğini hep beraber inceleyeceğiz.
Öncelikle redis Salvatore Sanfilippo tarafından open source olarak geliştirilen, veriyi bellekte tutup, dosyaya yani herhangi bir storage’ı yazmayan memcached bir yapıdır. Ama istenir ise disk’e de yazabilmektedir. Sitesinden bu konu ile ilgili bilgi alınabilir. Kısaca memcached bir yapıda tutulacak verinin miktarına göre makinadaki rem kapasitesine dikkat edilmelidir. İlk akla tüm cache mimarilerinde olduğu gibi “key-value” pair yapısı gelse de Redis’de beş farklı veri tipi vardır.
Bunlar: “Strings”, “Lists”, “Sets” , “Hashes”, “Sorted Sets”‘dir.
Redis’in açılımı “Remote Dictionary Service”’dir. En büyük özelliği çok hızlı olmasıdır. Sn’de 100bin operasyon yürütebilmektedir. Peki memoryde ne kadar yer kaplar ? Örneğin sadece <String,String> şeklinde 1 milyon veri için 100mb ya da <Hash,Obj> şeklinde 5 kırılımlı karmaşık 1 milyon ver için 200mb yer kaplamaktadır. Kısaca hem çok hızlı hem de nerede ise hiç yer kaplamıyan bir yapıdır.
Nasıl Kurulur ? : Esasen Linux işletim sistemi için tasarlanmıştır. Ama sitesinde resmi olarak desteklenmese de, windowsda da çalışmaktadır. http://redis.io/download ilgili link tıklanıp, sayfanın aşağısındaki windows bölümünden GitHub altındaki “MSOpenTech”‘e ait “https://github.com/MSOpenTech/redis/releases” kaynak dosyalarına ulaşılır. Örneğin bu projede aşağıdaki dosya indirilmiştir.
Yukarıdaki zip dosyası açılınca ilgili klasörden önce “redis-server.ex”e tıklanarak redis-server çalıştırılır. Ayrıca “redis-ci.exe” ile client console aşağıdaki gibi açılır. Artık bu noktadan sonra local windows ortamında redis ile çalışılabilir.
Bundan sonra Azure üzerinde Redis kurulumu yaparak makaleye devam edeceğim. Siz isterseniz örneğinize, local makinadan da devam edebilirsiniz. Aşağıda görüldüğü gibi Azure üzerinde “Data + Storage”‘dan “Redis Cache” tıklanarak ilgili kurulum yapılır.
Kurulumdan sonra istenir ise Azure üzerinde Redis Console’una aşağıdaki gibi erişilebilir. İstenilen monitoring, test ve sorgu işlemlerinin hepsi aynı local makinada olduğu gibi buradan da kolaylıkla yapılabilir.
Redisin test işelemi aşağıdaki gibi “Get”-“Set” komutları ile aşağıdaki gibi yapılmıştır. Güvenlik için Azure ortamında “SSL” aktif edilmelidir. Azure üzerinde SSL ile redis “6380” nolu portdan çalışır. “SSL” kapalı iken Redis, Azure üzerinde “6379” nolu portu kullanır.
Aynı test işleminin, Redis dökümanlarında aşağıdaki gibi server’a çekilecek “Ping” komutu ile de yapılabileceği söylenmiştir.
Redis’de kullanılan birçok komut vardır. http://redis.io/commands adresinden ilgili komutlar örenilip, http://try.redis.io/ adresinden de test edilebilir. Ayrıca local bir makinada da kolaylıkla test işlemleri yapabilmektedir. Bu makalenin konusu aşağıdaki komutlardan ziyade, Redis’in Mvc .Net ve Azure ile nasıl kullanıldığına dair uygulamalı bir web app yapmaktır. Kod içinde, kullanılan komutlardan yeri geldiğince sırası ile bahsedilecektir.
Öncelikle Visual Studio 2015 ortamında Empty bir Mvc project yaratılır. Nuget’den Redis ile çalışmak üzere aşağıdaki 2 package’dan biri indirilir. Bu örnekde “ServiceStack.Redis” kütüpahanesi kullanılmıştır.
Ayrıca bu projede AngularJS’in 1.4.9 versiyonu indirilmiştir. Aslında an itibari ile AngularJS’in “1.5.0-rc.2” versiyonu yayınlanmıştır.
Bu projede hepsiborda.com :) sitesinin ürünlerinin kategori bazında listelenip, fiyatlarının göründüğü bir vitrin ve admin sayfası yapılacaktır. İstenen kategoriler ve her kategoriye ait ürünler eklenip, düzenlene bilecektir. Son olarak en ucuz 5 ürün real time olarak sayfanın altında bant şeklinde kayacaktır.
Öncelikle belli kategorilerin listeleneceği bir combobox’ı, Redis ve AngularJS kulanarak dolduralım. Bunun için Redis’deki strings tipi kullanılacaktır.
HomeController.cs: Aşağıda görüldüğü gibi “Index()” actionında herhangi bir işlem yapılmaz.
1 2 3 4 5 6 7 8 |
public class HomeController : Controller { // GET: Home public ActionResult Index() { return View(); } } |
Index.cshtml: İlgili AngularJs, Jquery ve Bootstarp kütüpahaneleri aşağıdaki gibi indirilir. Tüm javascript kodları “index.js”‘de yazılacaktır. Ayrıca css dosyası için “productStyle2.css” kullanılmıştır.
1 2 3 4 5 6 7 8 9 10 |
<head> <meta name="viewport" content="width=device-width" /> <title>Index</title> <link href="~/Content/productStyle2.css" rel="stylesheet" /> <script src="~/Scripts/angular.min.js"></script> <script src="~/Scripts/index.js"></script> <script src="~/Scripts/jquery-2.2.0.min.js"></script> <script src="~/Scripts/bootstrap.min.js"></script> <link href="~/Content/bootstrap.min.css" rel="stylesheet" /> </head> |
Aşağıda görüldüğü gibi, yeni bir kategori eklemek için bir Link ve kategorilerin AngularJS ile doldurulduğu bir “<select>” html elementi bulunmaktadır. Ilgili “$scope.Products” ‘dan “Id” ve “Name” fieldları combobox’a doldurulur. Ayrıca seçilen ürün id’si “$scope.selectedProduct””a “ng-model” ile bağlanmıştır. Herhangi bir kategori seçildiğinde ona ait olan ürünler “GetItems()” function’ı ile doldurulur.
1 2 3 4 5 6 7 8 |
<div style="margin:0 auto;"><div id='success_notification'><img src="~/Content/hepsiburada-yeni-logo.jpg" /></div></div> <br /><br /> <h1>Alışveriş Ekranı</h1> <a href="/Home/AddProduct">Yeni Bir Kategori Giriniz</a><br /><br /> <div ng-controller="ProductController"> <select ng-model="selectedProduct" ng-options="product.Id as product.Name for product in Products" ng-change="GetItems()"> <option value="">Ürün Seçiniz</option> </select> </div> |
index.js (Part 1): Aşağıda görüldüğü gibi AngularJs ile “ProductController” oluşturulmuştur. Sayfa ilk yüklendiğinde “Home/GetProducts” action’ından ürünler Redis üzerinden çekilmekte ve “$scope.Products”‘a doldurulmaktadır. Ayrıca seçilen kategoriye göre ilgili itemlar “GetItems()” function’ı ile “Home/GetItems” action’ına post işlemi yapılarak Redis üzerinden “productID”‘ye göre “$scope.Items” doldurulmuştur.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
var app = angular.module("app", []); app.controller('ProductController', function ($scope, $http) { $scope.Products = []; $http({ method: 'GET', url: '/Home/GetProducts' }).success(function (result) { console.log(JSON.stringify(result)); $scope.Products = result; console.log($scope.selectedProduct); }); $scope.GetItems = function () { var productID = $scope.selectedProduct; console.log(productID); $http({ method: 'POST', url: '/Home/GetItems', data: { 'productID': productID } }).success(function (result) { console.log(JSON.stringify(result)); $scope.Items = result; }); } }); |
HomeController.cs/GetProducts(): Aşağıda görüldüğü gibi ürünler Redisden doldurulmuştur. Öncelikle Redis’e bağlanmak için “RedisEndpoint” aşağıdaki gibi oluşturulur. “Host” Azure üzerindeki Redis’den yukarıdı görülen “Host name”alanından doldurulur. “Local” için kendi makinanızın ipsini “127.0.0.1” girmeniz yeterlidir. Port için Azure’da “Setting/Properties” sekmesinden ilgili portlar görülebilir. “6380”. Güvenlik amaçlı “Ssl=true” yapılmıştır. İlgli configurasyon dosyası ile Redise’e bağlanıldıktan sonra “client.As<Product>” ile Redis üzerindeki “ids:Product” strings’i ne ait tüm elemanlar çekilir. Daha sonra “GetAll()” methodu ile tüm “urn:product:1”, “urn:product:2”, “urn:product:3” strings lerine ait value değerler alınır. Ve çekilen tüm data “Json” formatında geri dönülür. Merak etmeyin hepsi tek tek açıklanacaktır:)
1 2 3 4 5 6 7 8 9 10 |
public JsonResult GetProducts() { var conf = new RedisEndpoint() { Host = "xxxxxxxxxx.redis.cache.windows.net", Password = "yyyyyyyyyyyyyyy", Ssl = true, Port = 6380 }; using (IRedisClient client = new RedisClient(conf)) { var productClient = client.As<Product>(); var products = productClient.GetAll(); return Json(products, JsonRequestBehavior.AllowGet); } } |
Şimdi ilgili komutları inceleyelim: Öncelikle yukarıdaki komutlar çalışırken Redis üzerinde “monitoring” komutu yazılarak ilgili methodların, Redis üzerindeki komut karşılıkları kolaylıkla gözlemlenebilir. Yani “ServiceStack”‘in .Net üzeriden çağırdığı komutların, Redis üzerinde anlamlandırılması biraz farklıdır. İşte yazının başında bahsedilen komutlara şimdi değinilmeye başlanacaktır.
Yukarıda görüldüğü gibi :
- “SMEMBERS” “ids:Product” Bu komut “SET” kümesindeki(bir çeşit List) tüm elemanları listelemek için kullanılır. “SET” tiplerine ilerde değinilecektir.
- “MGET” “urn:product:1” “urn:product:2” “urn:product:3” Birden çok key’a ait value’yu çekmek için strings veri tipinde kullanılır. ServiceStack kütüpahanesindeki “GetAll()” methoduna karşılık gelmektedir. Burada dikkat edilecek husus “key” oluşturulurkenki durumdur. “urn:product” productları belirler “:1” product ID’ye karşılık gelir. Yani 1 id’ili product anlamına gelmektedir. Biz de isimlendirmeleri yaparken “:” koyarak istediğimiz kırılımı yapabiliriz. Aşağıda görüldüğü gibi ilgili result Json olarak alınır.
Projede kullanılan “Product” ve “Item” modelleri aşağıdaki gibidir:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace RedisBlog.Models { public class Product { public long Id { get; set; } public string Name { get; set; } public string Detail { get; set; } } public class Item { public long Id { get; set; } public string Name { get; set; } public int Price { get; set; } public int ProductID { get; set; } } } |
HomeController.cs/GetItems(): Aşağıda seçilen bir product’a göre ilgili itemlar filitrelenerek gözükmektedir. Redis’e bağlanıldıktan sonra itemlar “Lists” türünde ilgili “productID”‘ye göre çekilir. “urn:item”+ productID çekilen liste Json olarak dönülür.
1 2 3 4 5 6 7 8 9 10 11 |
public JsonResult GetItems(int? productID) { var conf = new RedisEndpoint() { Host = "xxxxxxxxxxxxx.redis.cache.windows.net", Password = "yyyyyyyyyyyyyyyyyyyyyy", Ssl = true, Port = 6380 }; using (IRedisClient client = new RedisClient(conf)) { var itemClient = client.As<Item>(); var itemList = itemClient.Lists["urn:item:" + productID]; var items = itemList.GetAll(); return Json(items, JsonRequestBehavior.AllowGet); } } |
Yukarıda çalışan komutu Azure tarafında monitoring ettiğimizde seçilen kategoriye göre ilgli itemların filitrelenmesi, Redis tarafında aşağıdaki gibi yorumlanmaktadır:
- LRANGE “urn:item:2” “0” “-1”: Liste içindeki elemanları başlangıç ve bitiş verilerek toplu olarak listelemesini sağlar. Burada “-1” sonuna kadar yani hepsi anlamına gelmektedir.
Ilgili komut redis tarafında çalıştırıldığında aşağıdaki gibi bir sonuç ile karşılaşılır.
Şimdi gelelim dönen sonucun “$scope.Items”‘a basılmasından sonra UI’da gösterimine: Aşağıda görüldüğü gibi bootstarp ile bir table oluşturulmuştur. İlgili ürünler “data-ng-repeat” ile gezilerek ekrana basılmaktadır. Ayrıca sona bir “Düzenle” button’u konmuştur. “ng-click”‘de “EditItem()” function’ı çağrılarak ilgili item’ın editlenmesi sağlanmıştır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
<div ng-show="selectedProduct"> <a ng-href="/AddItem/{{selectedProduct}}">Yeni Bir Ürün Giriniz</a><br /><br /> <div class="panel panel-default pre-scrollable"> <table class="table table-striped table-bordered table-responsive table-condensed table-hover"> <thead> <tr> <th>Id</th> <th>Ad</th> <th>Fiyat</th> <th>Ürün ID</th> </tr> </thead> <tbody> <tr data-ng-repeat="item in Items"> <td> <span>{{item.Id}}</span> </td> <td> <span>{{item.Name}}</span> </td> <td> <span>{{item.Price}}</span> </td> <td> <span>{{item.ProductID}}</span> </td> <td> <button ng-click="EditItem(item.ProductID,item.Id)">Düzenle</button> </td> </tr> </tbody> </table> </div> </div> |
Şimdi sıra geldi yeni bir kategorinin eklenmesine:
En başdada belirtildiği gibi “Yeni Bir Kategori Giriniz” buttonuna tıklanınca “/Home/AddProduct” action’ına gidilmektedir.
Home/AddProduct: Aşağıda görüldüğü ilgili view’a direk gidilmektedir.
1 2 3 4 |
public ActionResult AddProduct() { return View(); } |
AddProduct.cshtml: Aşağıda görüldüğü gibi tüm işlemler yeni eklenecek “SubController” altından yapılmaktadır. Girilecek ürünün ismi “ng-model=Name” ve açıklaması “ng-model=Detail” ile tanımlanmıştır. Kaydet button’una basılınca “SaveProduct()” function’ı çağrılmaktadır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
@{ Layout = null; } <!DOCTYPE html> <html ng-app="app"> <head> <meta name="viewport" content="width=device-width" /> <title>AddProduct</title> <script src="~/Scripts/angular.min.js"></script> <script src="~/Scripts/index.js"></script> </head> <body> <div ng-controller="SubController"> <p><b>Ürün Adı:</b></p> <input type="text" ng-model="Name" id="Name" /><br /> <p><b>Açıklama:</b></p> <textarea rows="3" cols="21" ng-model="Detail" id="Description"></textarea> <input type="button" ng-click="SaveProduct()" value="Kaydet" /> </div> </body> </html> |
index.js (Part 2): Aşağıda görüldüğü gibi “app” module’üne Dependency Injection ile “directApp” module’u eklenmiştir. “directApp” module’ünde “SubController” controller’ı tanımlanmış ve “$scope.Name ve $scope.Detail” fieldları “SaveProduct()” action’ına postlanmıştır. İşlem bittiği zaman da Ana sayfaya yönlendirilmiştir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
var app = angular.module("app", ["directApp"]); var directApp = angular.module("directApp", []); directApp.controller('SubController', function ($scope, $http, $location) { $scope.SaveProduct = function () { var product = { "Name": $scope.Name, "Detail": $scope.Detail }; $http({ method: 'POST', url: '/Home/SaveProduct', data: product }).success(function () { document.location.href = "/"; }); } }); |
Home/SaveProduct: Aşağıda görüldüğü gibi öncelikle “Redis”‘e bağlanılmıştır.
Not: Her seferinde özellikle Redis’e bağlanılmıştır. Amaç size yapıyı her seferinde tekrar tekrar göstermektir. İlgili işlem, optimizasyon amaçlı bir static sınıf altında tek bir seferde yapılabilirdi.
“client.As<Product>” ile product client’ı oluşturulur. “GetNextSequence()” methodu ile aynı Sql’deki identity colomundaki gibi, enson “id” değerinin bir fazlası alınır. Ve gönderilen Product sınıfı Redis’e kaydedilir.
1 2 3 4 5 6 7 8 9 10 |
public void SaveProduct(Product product) { var conf = new RedisEndpoint() { Host = "xxxxxxx.redis.cache.windows.net", Password = "yyyyyyyyyyyyyy", Ssl = true, Port = 6380 }; using (IRedisClient client = new RedisClient(conf)) { var userClient = client.As<Product>(); product.Id = userClient.GetNextSequence(); userClient.Store(product); } } |
İlgili işlemler yapılırken Redis monitoring edilir ise aşağıdaki kodların çalıştırıldığı görülür.
- “INCR”: Sayısal bir alanın verilen bir key’e göre “1” arttırılması için kullanılır. Koddaki “GetNextSequence()”‘in karşılığıdır.
- “SET”: Belirtilen key değerine value atamak için string yapılarda kullanılan bir komuttur. Burada “urn:product:4” yani id’si 4 olan “Product” Key’ine yeni eklenen json “Product” sınıfı atanmıştır.
- “SADD”: Redis te Set dizi tiplerine “SADD” komutu ile veri eklenir. Set tipleri herhangi bir sıra gözetmeksizin veri eklenen dizilerdir. “SMEMBERS” komutu ile yukarıda da belirtildiği gibi tüm veriler okunur. “Set”‘tipine bağlı en büyük belirleyici özellikler, bir Set listesinde ilgili elemanın var olup olmadığının kolaylıkla bakıla bilmesi, 2 Set dizisinin kolaylıkla “Union” yani birleştirilip geriye dönülebilmesi, 2 Set dizisi arasındaki farklı veya ortak elemanların kolaylıkla bulunabilmesi sıralanabilir. Bir Set’e aynı isimli “Key” 2 kere yazılamaz. Setler sıralanabilir yada belirli bir eğer işlemine göre değer döndürebilirler.
Şimdi sıra geldi ilgili kategori altında yeni bir ürünün eklenmesine:
En başda da belirtildiği gibi “Yeni Bir Ürün Giriniz” buttonuna tıklanınca “/Home/AddItem/2” gibi bir action’ına gidilmektedir.
HomeController.cs/AddItem(): Aşağıda görüldüğü gibi ilgili action’a seçilen “Product”‘a göre gidildiğinde “AddItem.cshtml”‘ine ilgili seçilen “ProductID” “ViewBag.ProductID” ile gönderilmiştir.
1 2 3 4 5 |
public ActionResult AddItem(int? selectedProduct) { ViewBag.ProductID = selectedProduct; return View(); } |
Url satırına yukarıdaki yol yazıldığında ilgili Action’a gidilebilmesi için “RouteConfig.cs” sınıfına aşağıdaki tanımlamanın yapılması gerekmektedir.
RouteConfig.cs:
1 2 3 4 5 |
routes.MapRoute( name: "AddItem", url: "AddItem/{selectedProduct}", defaults: new { controller = "Home", action = "AddItem", selectedProduct = UrlParameter.Optional } ); |
AddItem.cshtml: Aşağıda görüldüğü gibi ürünün fiyat ve ismi “ng-model=Price” ve “ng-model=Name” ile AngularJs’deki “ItemController”‘a ait ilgili değişkenlere atanmışlardır. Burada “ng-app=’app'” olarak yine aynı “app”‘in kullanılmasına rağmen yeni bir “ItemController”‘ın eklenmesi AngularJs tarafında yeni bir “Dependency Injection”‘ın olduğu anlamına gelmektedir. “Kaydet” buttonu tıklanınca “SaveItem()” function’ı çağrılmıştır. Ayrıca en başta seçilen türe ait olan “ProductID” burada hidden “hdnProductID”‘ye viewbag vasıtası ile atanmıştır. Amaç kaydetme işleminde ilgili ProductID’nin ilgili Action’a gönderilebilmesidir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
@{ Layout = null; } <!DOCTYPE html> <html ng-app="app"> <head> <meta name="viewport" content="width=device-width" /> <title>AddItem</title> <script src="~/Scripts/angular.min.js"></script> <script src="~/Scripts/index.js"></script> </head> <body> <div ng-controller="ItemController"> <p><b>Ürün Adı:</b></p> <input type="text" ng-model="Name" id="Name" /><br /> <p><b>Fiyat(TL):</b></p> <input type="text" ng-model="Price" id="Price"/> <input type="button" ng-click="SaveItem()" value="Kaydet" /> <input type="hidden" value="@ViewBag.ProductID" id="hdnProductID" /> </div> </body> </html> |
index.js (Part 3): Aşağıda görüldüğü gibi “itemApp”‘de Injection ile “app” module’üne eklenmiştir. Burada diğerlerinden farklı olarak yeni bir “item” sınıfı yaratılmasıdır. item sınıfına ait “Name” ve “Price” propertyleri, AngularJS’deki text fieldların “ng-model” ile bağlandıkları “$scope” değişkenleri(“Name”,”Price”) ile atanmışlarıdır. Son olarak “ProductID”‘nin değeri olarak “hdnProductID”‘deki hidden filed’ın values’u atanmıştır. Daha sonra ilgili “item” sınıfı “Home/SaveItem()” action’ına post edilmiş ve işlem tamamlandığında ana sayfaya yönlendirilmiştir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
var app = angular.module("app", ["directApp", "itemApp"]); var itemApp = angular.module("itemApp", []); directApp.controller('ItemController', function ($scope, $http) { $scope.SaveItem = function () { var item = { "Name": $scope.Name, "Price": $scope.Price, "ProductID": document.getElementById("hdnProductID").value }; $http({ method: 'POST', url: '/Home/SaveItem', data: item }).success(function () { document.location.href = "/"; }); } }); |
HomeController.cs/SaveItem(): Aşağıda görüldüğü gibi Redis’e bağlanılıp “client.As<item>” ile “itemClient”‘a Redisdeki “item” listesi atanır. “itemClient.Lists” propertysinin key alınına “urn:item” ile başlanıp, bağlı olduğu productID’nin de sonuna eklenmesi ile yeni bir key oluşturulur. Örnek “urn:item:2” yani ProductID’si 2 olan itemları ifade etmektedir. Gelen item’ın “id” alanına “GetNextSequence()” methodu ile yeni bir “id” atanıp “itemList.Add()” ile kaydedilir.
1 2 3 4 5 6 7 8 9 10 11 |
public void SaveItem(Item item) { var conf = new RedisEndpoint() { Host = "xxxxxx.redis.cache.windows.net", Password = "yyyyyyyyyyyy", Ssl = true, Port = 6380 }; using (IRedisClient client = new RedisClient(conf)) { var itemClient = client.As<Item>(); var itemList = itemClient.Lists["urn:item:" + item.ProductID]; item.Id = itemClient.GetNextSequence(); itemList.Add(item); } } |
İlgili işlemler yapılırken Redis monitoring edilir ise aşağıdaki kodların çalıştırıldığı görülür.
- “INCR”: Sayısal bir alanın verilen bir key’e göre “1” arttırılması için kullanılır. Koddaki “GetNextSequence()”‘in karşılığıdır. “seq.Item” değeri bir arttırılmıştır.
- “RPUSH”: “List”‘in sonuna yeni eleman ekler. Burada da “Add()” komutu ile item “Lists”e yeni bir eleman eklenmiştir.
Bu zamana kadar yeni kategoriler Redis ile girilmiş ve listelenmiştir. Ayrıca ilgili kategorilere göre bir alt kırılım ile yeni itemlar girilmiş ve istendiğinde ilgili “Product”‘a göre listelenmiştir. En önemlisi de bu yapılan işlerin tamamı memory’de tutulmuş ve hiçbir fiziksel dosyaya yazılmamıştır. Redis, NoSql in memorized yapısı ile okuma ve yazma işlemlerinde gerçekten de çok başarılıdır. Bir sonraki makalede en ucuz 5 ürün real time olarak ekranın altında kayar band da listelenecek ve yeni bir item girildiğinde yada düzenlendiğinde yazılacak “MicroServices” ile tekrardan düzenleneceklerdir. Bu işlemler Redis’in Pub/Sub özeliği kullanılarak tetiklenecek ve sonunda gerçekten sıralamada bir değişiklik var ise signalR ile ekrana real time olarak basılacaktır. Ayrıca yine istenir ise ilgili MicroServisler’de Redis’e gelen data asenkron olarak MsSql bir database’e de basılabilir.
Bu makalenin 2.bölümünde görüşmek üzere hoşçakalın.
Not: Kaynak kodlar 2.makalenin sonunda verilecektir.
Source:
Hocam elinize saglik. 2. makaleyi beklemeden devam ediyorum :)
Teşekkürler Yiğit.
Esas kısım 2 bölüm aklında olsun:)
İyi çalışmalar.
Hocam Öncelikle elinize sağlık. Redisi monotoring etmek için ne kullanıyorsunuz?
Teşekkürler Abit,
Birçok farklı tool var. Ben redis-stat kullanıyorum.
RedisLive‘da efsane. Bir de Redmon var. Duydum ama kullanmadım.
İyi çalışmalar.
:)