{"id":11,"date":"2026-09-23T20:36:59","date_gmt":"2026-09-23T20:36:59","guid":{"rendered":"https:\/\/www.akifsen.com.tr\/blog\/?p=11"},"modified":"2026-09-23T20:36:59","modified_gmt":"2026-09-23T20:36:59","slug":"redis-cache-aside-stampede-invalidation","status":"publish","type":"post","link":"https:\/\/www.akifsen.com.tr\/blog\/2026\/09\/23\/redis-cache-aside-stampede-invalidation\/","title":{"rendered":"Redis Eklemek Performans Problemini \u00c7\u00f6zmez: Cache Tasar\u0131m\u0131nda As\u0131l Zor K\u0131s\u0131m"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Cache h\u0131zl\u0131d\u0131r. Cache tasar\u0131m\u0131 ise zordur.<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bir endpoint yava\u015flad\u0131\u011f\u0131nda en kolay \u00f6nerilerden biri \u015fudur:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Redis koyal\u0131m.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Bazen ger\u00e7ekten do\u011fru \u00e7\u00f6z\u00fcmd\u00fcr. Ancak cache eklemek problemi \u00e7\u00f6zmek yerine sisteme yeni bir consistency problemi de ekleyebilir.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c7\u00fcnk\u00fc as\u0131l soru veriyi Redis&#8217;e nas\u0131l koyaca\u011f\u0131n\u0131z de\u011fil, <strong>hangi veriyi ne kadar s\u00fcreyle do\u011fru kabul edece\u011finizdir.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En s\u0131k kullan\u0131lan modellerden biri cache-aside&#8217;d\u0131r. Uygulama \u00f6nce Redis&#8217;e bakar. Veri yoksa ana veritaban\u0131ndan okur ve sonucu cache&#8217;e yazar. Redis&#8217;in resmi dok\u00fcmantasyonu da cache-aside modelini \u00f6zellikle tekrar eden read operasyonlar\u0131nda database y\u00fck\u00fcn\u00fc azaltmak i\u00e7in konumland\u0131r\u0131yor.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Basit haliyle:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GET \/products\/42\n\n1. Redis GET product:42\n2. Cache hit  \u2192 response\n3. Cache miss \u2192 PostgreSQL SELECT\n4. Redis SET product:42 EX 300\n5. response<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Buraya kadar kolay.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sorun 300 saniye sonra ba\u015fl\u0131yor.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Cache stampede<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>product:42<\/code> \u00e7ok pop\u00fcler bir kay\u0131t olsun.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">TTL doldu\u011fu anda ayn\u0131 milisaniyede 500 request gelirse 500 request de cache miss g\u00f6rebilir. Bu durumda tamam\u0131 database&#8217;e gider ve ayn\u0131 sorguyu \u00e7al\u0131\u015ft\u0131r\u0131r.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cache&#8217;in database&#8217;i korumas\u0131 gerekirken tam tersine y\u00fck patlamas\u0131n\u0131n sebebi olur.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Redis dok\u00fcmantasyonu da pop\u00fcler bir key expire oldu\u011funda ayn\u0131 kayd\u0131 isteyen \u00e7ok say\u0131da process&#8217;in ayn\u0131 anda database&#8217;e y\u00f6nelmesini cache stampede olarak ele al\u0131yor.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bunu azaltmak i\u00e7in TTL jitter, request coalescing, distributed lock veya stale-while-revalidate gibi teknikler kullan\u0131labilir.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00d6rne\u011fin her key&#8217;i tam 300 saniyede expire etmek yerine:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>long ttl = 300 + ThreadLocalRandom.current().nextLong(0, 30);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">gibi k\u00fc\u00e7\u00fck bir da\u011f\u0131l\u0131m bile toplu expiration dalgalar\u0131n\u0131 azaltabilir.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">En zor problem: invalidation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Cache ile ana veri kayna\u011f\u0131 aras\u0131nda iki farkl\u0131 ger\u00e7eklik olu\u015fur.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bir kullan\u0131c\u0131 ad\u0131n\u0131 database&#8217;de de\u011fi\u015ftirdi\u011finiz halde Redis&#8217;teki veri be\u015f dakika daha eski kal\u0131yorsa sisteminiz teknik olarak h\u0131zl\u0131d\u0131r ama yanl\u0131\u015f veri d\u00f6nmektedir.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bu nedenle her cache i\u00e7in \u015fu sorunun cevab\u0131 verilmelidir:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Bu verinin ka\u00e7 saniye eski olmas\u0131 kabul edilebilir?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00dcr\u00fcn katalogunda 30 saniye kabul edilebilir olabilir.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Banka bakiyesinde olmayabilir.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Authorization bilgisinde ise baz\u0131 durumlarda birka\u00e7 saniyelik stale veri bile g\u00fcvenlik problemi olu\u015fturabilir.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bu y\u00fczden TTL teknik bir parametre de\u011fil, asl\u0131nda i\u015f kural\u0131d\u0131r.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Cache hit ratio tek ba\u015f\u0131na yeterli de\u011fildir<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Cache sistemini de\u011ferlendirirken yaln\u0131zca hit ratio&#8217;ya bakmak yan\u0131lt\u0131c\u0131 olabilir.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">%99 hit ratio \u00e7ok iyi g\u00f6r\u00fcnebilir. Ama kalan %1 miss database&#8217;i \u00e7\u00f6kerten birka\u00e7 hot key&#8217;den olu\u015fuyorsa sistem yine sorunludur.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ben a\u015fa\u011f\u0131daki sinyalleri birlikte izlerdim:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">cache hit\/miss oran\u0131, P95\/P99 cache latency, database query hacmi, hot key da\u011f\u0131l\u0131m\u0131, eviction say\u0131s\u0131 ve expiration sonras\u0131 olu\u015fan y\u00fck.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cache optimizasyonunun ba\u015far\u0131s\u0131 \u201cRedis \u00e7al\u0131\u015f\u0131yor\u201d de\u011fildir.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ba\u015far\u0131l\u0131 cache tasar\u0131m\u0131, Redis devre d\u0131\u015f\u0131 kald\u0131\u011f\u0131nda veya bir anda y\u00fczlerce key expire oldu\u011funda sistemin nas\u0131l davranaca\u011f\u0131n\u0131 da bilmektir.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c7\u00fcnk\u00fc cache performans katman\u0131d\u0131r.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ana veri kayna\u011f\u0131 de\u011fildir.<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cache h\u0131zl\u0131d\u0131r. Cache tasar\u0131m\u0131 ise zordur. Bir endpoint yava\u015flad\u0131\u011f\u0131nda en kolay \u00f6nerilerden biri \u015fudur: Redis koyal\u0131m. Bazen ger\u00e7ekten do\u011fru \u00e7\u00f6z\u00fcmd\u00fcr. Ancak cache eklemek problemi \u00e7\u00f6zmek yerine sisteme yeni bir consistency problemi de ekleyebilir. \u00c7\u00fcnk\u00fc as\u0131l soru veriyi Redis&#8217;e nas\u0131l koyaca\u011f\u0131n\u0131z de\u011fil, hangi veriyi ne kadar s\u00fcreyle do\u011fru kabul edece\u011finizdir. En s\u0131k kullan\u0131lan modellerden biri cache-aside&#8217;d\u0131r. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"class_list":["post-11","post","type-post","status-publish","format-standard","hentry","category-mimari"],"_links":{"self":[{"href":"https:\/\/www.akifsen.com.tr\/blog\/wp-json\/wp\/v2\/posts\/11","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.akifsen.com.tr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.akifsen.com.tr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.akifsen.com.tr\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.akifsen.com.tr\/blog\/wp-json\/wp\/v2\/comments?post=11"}],"version-history":[{"count":1,"href":"https:\/\/www.akifsen.com.tr\/blog\/wp-json\/wp\/v2\/posts\/11\/revisions"}],"predecessor-version":[{"id":12,"href":"https:\/\/www.akifsen.com.tr\/blog\/wp-json\/wp\/v2\/posts\/11\/revisions\/12"}],"wp:attachment":[{"href":"https:\/\/www.akifsen.com.tr\/blog\/wp-json\/wp\/v2\/media?parent=11"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.akifsen.com.tr\/blog\/wp-json\/wp\/v2\/categories?post=11"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.akifsen.com.tr\/blog\/wp-json\/wp\/v2\/tags?post=11"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}