Redis Key Yönetimi

Mustafa İleri
2 min readJan 14, 2017

--

“There are only two hard things in Computer Science: cache invalidation and naming things.”
Phil Karlton

Phil Carlton’ a göre bilgisayar bilimlerinde en zor iki işten bir tanesidir “cache invalidation”.

Bu yazıda sizler ile “Redis” üzerinde tuttuğumuz “cache” lerin etiketlenmesi ve yönetimine dair bazı ipuçları paylaşmaya çalışacağım.

Problem: Herhangi bir ön bellekleme mekanizması kullanıyorsunuz.Süper. Harika bir şekilde veritabanı sorgularını azalttınız. Ekibiniz sizinle gurur duyuyor. Kodu “deploy” ettiniz. Fakat o da ne birden bazı sorunlar rapor edilmeye başlandı. Veri güncellendiği halde farklı gösterimlerde eski halde gösteriliyor.

Örneğin arama sayfalarını “cache” lediniz. Hepsini birden nasıl geçersiz kılacaksınız… Yada belli “cache” değerleriniz var bunları etiketleyerek, sonrasında etiket değerine göre geçersiz kılmak istiyorsunuz.

Redis üzerinde etiketleme gibi güzel özellikler maalesef henüz yok. Eğer isterseniz bunu ve bunun gibi şeyleri kendiniz uygulamanız gerekiyor.

Fakat Redis’te “key” ler üzerinde “expression” kullanabilirsiniz (https://redis.io/commands/keys) ve bu da elinizi çok kuvvetli hale getiriyor.

İlk olarak klasik veri saklama modelinde nasıl yaptığımız bir göz atalım.
ID değeri 15 olan bir ürünün verisinin anahtarı şu şekilde belirtiliyor:
“product_15”

Peki bu anahtar değerini istediğim değerler ile birlikte “json” olarak tutsam nasıl olur? Bu json içinde “cache key” in şu değerlerini tutabilirim:
“label”: Anahtarın değeri (product)
“incrementalValue”: Anahtarı hızlıca geçersiz kılmak için artan değer (varsayılan 0, eğer hızlıca geçersiz kılmak isterseniz 1 arttırılabilir.)
“ttl”: Anahtarın ön bellekleme sisteminde ne kadar tutulacağı bilgisi.
“tags”: Anahtarın sahip olduğu etiket değerleri.(mesela product için products şeklinde bir etiket değeri kullanilabilir.)
“parameters”: Değişken olan anahtarın parametrik değerleri bu alanda belirlenmeli. Örneğin “id” değeri 15 olan ürün için bu alana id: 15 şeklinde bir veri yazılmalı.

Buna göre şu veriler ile bir “cache key” oluşturuyorum:

label: product, incrementalValue:0, ttl:86400, tags: [products, top_products], parameters: 15

eski “cache key” ve yeni “cache key” değerlerine göz atarak bize ne gibi avantajlar sağladığına göz atalım.
Eski “cache key”: product_15

Yeni “cache key”:

{“label”: “product”, “incremental_value”: 0, “tags”: [“TAG_products”, “TAG_top_products”], “parameters”: {“id”: 15}}
(Etiketlet için “prefix” tanımladım. ttl i “cache key” e dahil etmedim. Çünkü anlamı yok. Bunu sadece “key” i yazarken bitiş süresini belirlemek için kullanıyorum.)

Sağladığı avantajlar:

  1. Bütün ürünlere ait değerleri yenilemek istiyorsak “incremental_value” değerini arttırmamız yeterli. “Redis” arayüzüne bağlanmamıza gerek yok.
  2. Etiket değerlerine göre bütün ön bellek değerlerine ulaşabilir ve geçersiz kılabilirim. Tabii bunun için etiket değerine göre silme gibi bir metod yazmış olmam gerekiyor.

İhtiyaca göre buraya farklı şeyler de ekleyebilirsiniz (mesela versiyon numarası gibi)

Bu “cache key” oluşturma işini tek bir yerden “generic” olarak yapabilirsiniz. Ayrıca Bütün bu “cache key” leri bir sınıf yaparak soyutladığınız “Redis Client” üzerinden sadece bu veri tipini kabul ederseniz tadından yenmez.

--

--

Mustafa İleri
Mustafa İleri

Written by Mustafa İleri

Tech Lead / Architect, Data Engineer, loves #python #symfony #django

Responses (1)