﻿
{"id":15131,"date":"2020-04-14T19:26:21","date_gmt":"2020-04-14T19:26:21","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=15131"},"modified":"2020-04-14T19:26:21","modified_gmt":"2020-04-14T19:26:21","slug":"redis-yazi-serisi-5-asp-net-coreda-in-memory-cache-kullanimi","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/redis-yazi-serisi-5-asp-net-coreda-in-memory-cache-kullanimi\/","title":{"rendered":"Redis Yaz\u0131 Serisi 5 &#8211; Asp.NET Core&#8217;da In-Memory Cache Kullan\u0131m\u0131"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/redis-yazi-dizisi\/\" target=\"_blank\" rel=\"noopener noreferrer\">Redis yaz\u0131 serisinin<\/a> bu be\u015finci makalesinde Redis mimarisinin temellerini daha iyi atabilmek i\u00e7in \u00f6ncelikle Asp.NET Core mimarisinde In-Memory Cache kullan\u0131m\u0131n\u0131 inceleyece\u011fiz. B\u00f6ylece uygun temellendirmeyi yapt\u0131\u011f\u0131m\u0131z s\u00fcrece makale serimizin sonraki makalelerinde Distributed Caching sistemi olan Redis sistemine tam teferruatl\u0131 giri\u015f yapabilecek zemini olu\u015fturmu\u015f olaca\u011f\u0131z.<\/p>\n<h3>Ba\u015flarken<\/h3>\n<p>\u0130\u00e7eri\u011fin seyrine e\u015f zamanl\u0131 e\u015flik edebilmek i\u00e7in elinizin alt\u0131nda bir Asp.NET Core uygulamas\u0131 olmas\u0131na \u00f6zen g\u00f6stermenizi tavsiye ederim.<\/p>\n<h3>Service ve Aray\u00fcz Tan\u0131t\u0131m\u0131<\/h3>\n<p>Asp.NET Core uygulamalar\u0131nda In-Memory Cache yapabilmek i\u00e7in &#8216;<em>AddMemoryCache<\/em>&#8216; servisini kullanmaktay\u0131z. Bu servisi uygulamaya dahil ettikten sonra &#8216;<em>IMemoryCache<\/em>&#8216; interface&#8217;i ile dependency injection taleplerinde bulunarak cacheleme operasyonlar\u0131n\u0131 ger\u00e7ekle\u015ftirebiliriz.<\/p>\n<p>AddMemoryCache;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Startup\r\n    {\r\n        public void ConfigureServices(IServiceCollection services)\r\n        {\r\n            .\r\n            .\r\n            services.AddMemoryCache();\r\n            .\r\n            .\r\n        }\r\n\r\n        .\r\n        .\r\n        .\r\n    }\r\n<\/pre>\n<p>IMemoryCache;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class EmployeeController : Controller\r\n    {\r\n        IMemoryCache _memoryCache;\r\n        public EmployeeController(IMemoryCache memoryCache)\r\n        {\r\n            _memoryCache = memoryCache;\r\n        }\r\n    }\r\n<\/pre>\n<p>\u015eimdi dependency injection ile talep etti\u011fimiz &#8216;IMemoryCache&#8217; nesnesi \u00fczerinden caching i\u015flemlerinde kullanaca\u011f\u0131m\u0131z metot ve propertyleri inceleyelim.<\/p>\n<p><strong>Get &#8211; Set Fonksiyonlar\u0131<\/strong><br \/>\n\u0130simlerinden de anla\u015f\u0131laca\u011f\u0131 \u00fczere memory&#8217;e data cachelemek ve cachelenen datay\u0131 okumak i\u00e7in Get ve Set metotlar\u0131 kullan\u0131lmaktad\u0131r. key &#8211; value diziliminde olan bu metotlardan Set metodu datay\u0131 cachelemek, Get metodu ise cache&#8217;de ki datay\u0131 okumak\/elde etmek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        public IActionResult SetCache()\r\n        {\r\n            _memoryCache.Set(&quot;employeeName&quot;, &quot;Muiddin Impatrino&quot;);\r\n            return View();\r\n        }\r\n\r\n        public IActionResult GetCache()\r\n        {\r\n            string name = _memoryCache.Get&lt;string&gt;(&quot;employeeName&quot;);\r\n            return View();\r\n        }\r\n<\/pre>\n<p><strong>Remove Fonksiyonu<\/strong><br \/>\nCachelenmi\u015f datay\u0131 silmek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        public void RemoveCache()\r\n        {\r\n            _memoryCache.Remove(&quot;employeeName&quot;);\r\n        }\r\n<\/pre>\n<p><strong>TryGetValue Fonksiyonu<\/strong><br \/>\nCache&#8217;de belirtilen key de\u011ferine uygun veriyi sorgular. Veri yoksa &#8216;false&#8217; e\u011fer varsa &#8216;true&#8217; d\u00f6nd\u00fcrerek &#8216;out&#8217; olan ikinci parametresinde de cacheden datay\u0131 d\u00f6nd\u00fcr\u00fcr.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        public IActionResult GetCache()\r\n        {\r\n            if (_memoryCache.TryGetValue&lt;string&gt;(&quot;employeeName&quot;, out string data))\r\n            {\r\n                \/\/data burada elde edilmi\u015ftir\r\n            }\r\n            return View();\r\n        }\r\n<\/pre>\n<p><strong>GetOrCreate Fonksiyonu<\/strong><br \/>\nBelirtilen key de\u011ferinde data var m\u0131 kontrol eder, yoksa olu\u015fturur.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        public IActionResult GetCache()\r\n        {\r\n            string name = _memoryCache.GetOrCreate&lt;string&gt;(&quot;employeeName&quot;, entry =&gt;\r\n             {\r\n                 entry.SetValue(&quot;Muiddin Impatrino&quot;);\r\n                 Console.WriteLine(DateTime.Now);\r\n                 return entry.Value.ToString();\r\n             });\r\n\r\n            return View();\r\n        }\r\n<\/pre>\n<p><strong style=\"color:purple;\">Absolute&#038;Sliding Expiration<\/strong><br \/>\nCache&#8217;de tutulacak datan\u0131n ya\u015fam s\u00fcresini belirlememizi sa\u011flayan \u00f6zelliklerdir. Absolute, datan\u0131n cache&#8217;de tutulma s\u00fcresini belirlerken; Sliding, belirtilen s\u00fcre zarf\u0131nda cache&#8217;den data talep edilirse e\u011fer bir o kadar daha tutulma s\u00fcresini uzatacak aksi taktirde datay\u0131 silecektir. Her ikiside ayn\u0131 anda kullan\u0131ld\u0131\u011f\u0131 zaman sliding, absolute&#8217;te belirtilen s\u00fcre dolana kadar periyodik i\u015flevine devam edecektir.<\/p>\n<p>&#8216;GetOrCreate&#8217; metoduyla kullan\u0131m\u0131 a\u015fa\u011f\u0131daki gibidir;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        public void GetCache()\r\n        {\r\n            DateTime date = _memoryCache.GetOrCreate&lt;DateTime&gt;(&quot;date&quot;, entry =&gt;\r\n             {\r\n                 entry.AbsoluteExpiration = DateTime.Now.AddSeconds(30);\/\/Cache'de ki datan\u0131n \u00f6mr\u00fc 10 saniye olarak belirlenmi\u015ftir.\r\n                 entry.SlidingExpiration = TimeSpan.FromSeconds(5);\/\/Cache'de ki datan\u0131n \u00f6mr\u00fc 2 saniye olarak belirlenmi\u015ftir.\r\n                 \/\/2 saniye i\u00e7erisinde bir istek yap\u0131l\u0131rsa kal\u0131\u015f s\u00fcresi 2 saniye daha uzayacakt\u0131r.\r\n                 \/\/Absolute de\u011feri belirtildi\u011finden dolay\u0131 bu s\u00fcre\u00e7 totalde 2 saniye boyunca s\u00fcrecektir.\r\n                 DateTime value = DateTime.Now;\r\n                 Console.WriteLine($&quot;*** Set Cache : {value}&quot;);\r\n                 return value;\r\n             });\r\n\r\n            Console.WriteLine($&quot;Get Cache : {date}&quot;);\r\n        }\r\n<\/pre>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/04\/Redis-Yaz\u0131-Serisi-5-Asp.NET-Coreda-In-Memory-Cache-Kullan\u0131m\u0131.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/04\/Redis-Yaz\u0131-Serisi-5-Asp.NET-Coreda-In-Memory-Cache-Kullan\u0131m\u0131.gif\" alt=\"Redis Yaz\u0131 Serisi 5 - Asp.NET Core&#039;da In-Memory Cache Kullan\u0131m\u0131\" width=\"744\" height=\"420\" class=\"aligncenter size-full wp-image-15150\" \/><\/a><\/p>\n<p>&#8216;Set&#8217; metoduyla ise a\u015fa\u011f\u0131daki gibi &#8216;MemoryCacheEntryOptions&#8217; nesnesiyle kullanabilirsiniz;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        public IActionResult SetCache()\r\n        {\r\n            MemoryCacheEntryOptions options = new MemoryCacheEntryOptions();\r\n            options.AbsoluteExpiration = DateTime.Now.AddSeconds(30);\r\n            options.SlidingExpiration = TimeSpan.FromSeconds(5);\r\n            _memoryCache.Set(&quot;date&quot;, DateTime.Now, options);\r\n\r\n            return RedirectToAction(nameof(GetCache));\r\n        }\r\n        public IActionResult GetCache()\r\n        {\r\n            if (_memoryCache.TryGetValue&lt;DateTime&gt;(&quot;date&quot;, out DateTime date))\r\n            {\r\n                Console.WriteLine($&quot;Get Cache : {date}&quot;);\r\n            }\r\n            return View();\r\n        }\r\n<\/pre>\n<p><strong style=\"color:purple;\">Cache Priority<\/strong><br \/>\nYay\u0131n s\u00fcreci boyunca cache&#8217;e depolanan veriler memory&#8217;i haddinden fazla \u015fi\u015firebilir ve yeni veriler i\u00e7in sistem taraf\u0131ndan var olan veriler silinmek istenebilir. \u0130\u015fte b\u00f6yle bir durumda  cache&#8217;den silinecek olan verilerin \u00f6nceliklerini ve hangilerinin kal\u0131c\u0131 olaca\u011f\u0131n\u0131 Priority de\u011feri arac\u0131l\u0131\u011f\u0131yla belirlemekteyiz.<\/p>\n<p>Priority de\u011feri; <em>Low<\/em>, <em>Normal<\/em>, <em>High<\/em> ve <em>NeverRemove<\/em> olmak \u00fczere d\u00f6rt de\u011fer almaktad\u0131r. Bu de\u011ferleri s\u0131ras\u0131yla a\u00e7\u0131klarsak e\u011fer;<br \/>\n<em>Low<\/em> : \u00d6nem derecesi en d\u00fc\u015f\u00fck olan datad\u0131r. \u0130htiya\u00e7 do\u011frultusunda ilk silinecek datad\u0131r.<br \/>\n<em>Normal<\/em> : \u00d6nem derecesi Low&#8217;dan sonra gelen datad\u0131r.<br \/>\n<em>High<\/em> : \u00d6nemli veridir. \u00c7ok zaruri oldu\u011fu taktirde cache&#8217;den silinecektir.<br \/>\n<em>NeverRemove<\/em> : Kesinlikle silinmemesi gereken datad\u0131r. S\u0131n\u0131ra gelinen bir memory&#8217;de Priority de\u011feri NeverRemove olan datalarla s\u0131n\u0131r a\u015f\u0131l\u0131rsa exception f\u0131rlat\u0131l\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        public void SetCache()\r\n        {\r\n            MemoryCacheEntryOptions options = new MemoryCacheEntryOptions();\r\n            options.Priority = CacheItemPriority.High;\r\n            _memoryCache.Set(&quot;date&quot;, DateTime.Now, options);\r\n        }\r\n<\/pre>\n<p><strong style=\"color:orange;\">RegisterPostEvictionCallback Olay\u0131<\/strong><br \/>\nCachelenmi\u015f bir datan\u0131n hangi sebepten dolay\u0131 memory&#8217;den silindi\u011fine dair bilgi edinmemizi sa\u011flayan olay\u0131 f\u0131rlatan bir fonksiyondur.<br \/>\nParametre olarak<br \/>\n<code style=\"color:red;\">public delegate void PostEvictionDelegate(object key, object value, EvictionReason reason, object state)<\/code><br \/>\nimzas\u0131na sahip bir delegate almaktad\u0131r. Bu delegate arac\u0131l\u0131\u011f\u0131yla temsil edilen fonksiyonun &#8216;key&#8217; parametresine cachelenmi\u015f datan\u0131n keyini, &#8216;value&#8217; parametresine de\u011ferini, &#8216;reason&#8217; parametresine ise silinme sebebini d\u00f6nd\u00fcrmektedir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        public void GetCache()\r\n        {\r\n            DateTime date = _memoryCache.GetOrCreate&lt;DateTime&gt;(&quot;date&quot;, entry =&gt;\r\n            {\r\n                entry.RegisterPostEvictionCallback((key, value, reason, state) =&gt;\r\n                {\r\n                    Console.WriteLine($&quot;Key : {key}\\nValue : {value}\\nReason : {reason}\\nState : {state}&quot;);\r\n                });\r\n                DateTime value = DateTime.Now;\r\n                Console.WriteLine($&quot;*** Set Cache : {value}&quot;);\r\n                return value;\r\n            });\r\n\r\n            Console.WriteLine($&quot;Get Cache : {date}&quot;);\r\n        }\r\n<\/pre>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/04\/Redis-Yaz\u0131-Serisi-5-Asp.NET-Coreda-In-Memory-Cache-Kullan\u0131m\u0131.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/04\/Redis-Yaz\u0131-Serisi-5-Asp.NET-Coreda-In-Memory-Cache-Kullan\u0131m\u0131.jpg\" alt=\"Redis Yaz\u0131 Serisi 5 - Asp.NET Core&#039;da In-Memory Cache Kullan\u0131m\u0131\" width=\"256\" height=\"84\" class=\"aligncenter size-full wp-image-15164\" \/><\/a><\/p>\n<p>Evet&#8230; B\u00f6ylece Asp.NET Core uygulamalar\u0131nda In-Memory Caching&#8217;in nas\u0131l yap\u0131ld\u0131\u011f\u0131n\u0131 san\u0131r\u0131m yeterince g\u00f6rm\u00fc\u015f, incelemi\u015f olduk. Bu i\u00e7eri\u011fimizden sonra art\u0131k yaz\u0131 serimizde Redis ile ilgili birebir i\u00e7erikler olu\u015fturarak esas konumuza temas edebiliriz. <\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Redis yaz\u0131 serisinin bu be\u015finci makalesinde Redis mimarisinin temellerini daha iyi atabilmek i\u00e7in \u00f6ncelikle Asp.NET Core mimarisinde In-Memory Cache kullan\u0131m\u0131n\u0131 inceleyece\u011fiz. B\u00f6ylece uygun temellendirmeyi yapt\u0131\u011f\u0131m\u0131z s\u00fcrece makale serimizin sonraki makalelerinde Distributed Caching sistemi&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":15045,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3383],"tags":[3407,3406,2679,2867,3409,2865,2866,2869,3384,3410,3408],"class_list":["post-15131","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-redis","tag-absolute-expiration","tag-addmemorycache","tag-asp-net-core","tag-asp-net-core-in-memory-cache","tag-cache-priority","tag-imemorycache","tag-in-memory-cache","tag-memorycacheentryoptions","tag-redis","tag-registerpostevictioncallback","tag-sliding-expiration"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/15131","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=15131"}],"version-history":[{"count":31,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/15131\/revisions"}],"predecessor-version":[{"id":15167,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/15131\/revisions\/15167"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/15045"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=15131"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=15131"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=15131"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}