Redis’te sakladığınız her veri nesnesinin kendine ait, benzersiz bir anahtarı (key) vardır; anahtar ile ona bağlı değer birlikte anahtar-değer çiftini oluşturur. İyi bir anahtar adı nesne-tipi:id şemasına uyar (örneğin user:1000), okunabilir kadar açık ama gereksiz uzun değildir ve uygulamanızın farklı bölümlerinin aynı adı başka bir veri için kullanmasını önler. Anahtarları yönetmek için de her tipte çalışan EXISTS, DEL, UNLINK, TYPE, RENAME ve COPY gibi genel komutlar kullanılır.

Bu yazıda resmî “Keys and values” sayfasındaki adlandırma önerilerini, hashtag kavramını ve anahtar uzayını (keyspace) değiştiren komutları örneklerle anlatıyoruz. Anahtarlara süre vermek ayrı bir konu olduğu için EXPIRE ve TTL, anahtarları listelemek ve taramak için de SCAN ve KEYS farkı yazısına ayırdık. Serinin tamamı için Redis öğrenme rehberine bakabilirsiniz.

Anahtar nedir, içinde ne olabilir?

Anahtar, komutlara verdiğiniz ve karşılığındaki nesneyi okumanızı ya da değiştirmenizi sağlayan bir stringdir. Programlama dillerindeki değişken adlarından farklı olarak Redis anahtarlarının biçimine çok az kısıtlama getirir: boşluk veya noktalama işareti içeren anahtarlar da çoğu zaman sorunsuz çalışır. Belgede bunun için "1st Attempt" ve "% of price in $" örnekleri verilir.

Anahtarlar genellikle metindir ama Redis anahtarları aslında ikili güvenlidir (binary-safe). Yani herhangi bir bayt dizisi, örneğin bir JPEG dosyasının içeriği ya da uygulamanızdaki bir yapının ikili gösterimi bile geçerli bir anahtar olabilir. Boş string de geçerli bir anahtardır. Bir anahtarın izin verilen en büyük boyutu 512 MB’tır. Bu sınırlar pratikte bir kısıtlama olmaktan çok, anahtar adını sizin tasarlamanız gerektiğini gösterir.

Anahtar adlandırma kuralları

Anahtar adlandırma kuralları: Çok uzun anahtarlardan kaçının., Çok kısa anahtarlardan da kaçının., Bir şemaya bağlı kalın., Boyut sınırını bilin.

Redis’te ad alanı (namespace) veya kategori kavramı yoktur; bütün anahtarlar aynı düz uzayda durur. Bu yüzden ad çakışmalarını önlemek sizin sorumluluğunuzdadır. Yaygın gelenek, anahtarı iki nokta üst üste (:) ile bölümlere ayırmaktır: person:1, person:2, office:London, office:NewYork:1 gibi. Bu, anahtarları kendi kafanızda ve araçlarınızda kategorilere ayırmanın basit bir yoludur. Belgenin önerileri şöyle özetlenebilir:

  • Çok uzun anahtarlardan kaçının. 1024 baytlık bir anahtar yalnızca bellek açısından değil, arama sırasında maliyetli anahtar karşılaştırmaları gerektirebileceği için de kötü bir fikirdir. Büyük bir değerin varlığını anahtar olarak kullanmanız gerekiyorsa değerin SHA1 gibi bir özetini (hash) almak bellek ve bant genişliği açısından daha iyidir.
  • Çok kısa anahtarlardan da kaçının. u1000flw yerine user:1000:followers yazmak çok daha okunaklıdır. Eklenen birkaç bayt, anahtar nesnesinin ve değer nesnesinin kapladığı alanın yanında küçük kalır. Doğru dengeyi bulmak size kalmıştır.
  • Bir şemaya bağlı kalın. nesne-tipi:id iyi bir başlangıçtır. Birden fazla kelimeden oluşan alanlar için nokta veya tire kullanılır: comment:4321:reply.to ya da comment:4321:reply-to.
  • Boyut sınırını bilin. Anahtar en fazla 512 MB olabilir; ama yukarıdaki nedenlerle bu sınıra yaklaşmanız için hiçbir neden yoktur.
AnahtarDeğerlendirme
u1000flwKısa ama ne tuttuğu anlaşılmıyor
user:1000:followersTip, kimlik ve alan açıkça okunuyor
comment:4321:reply.toÇok kelimeli alan nokta ile ayrılmış
1024 baytlık bir metinBellek ve karşılaştırma maliyeti yüksek, özetini kullanın

Adlandırma şemasının bir faydası da hataları önlemesidir. Resmî hata sayfası, WRONGTYPE hatasının nedenlerinden birini uygulamanızın iki farklı bölümünün aynı anahtar adını farklı veriler için kullanması olarak sayar ve çözüm olarak her veri türüne kendi önekini vermeyi önerir; örneğin hash’ler için user:, listeler için queue:. Bu hatanın ayrıntısı Redis hata mesajları yazısında.

Hashtag: anahtarın yalnızca bir kısmını hash’lemek

Redis, bir anahtarın değerine hızlı ulaşmak için anahtarın baytlarından bir tamsayı indeks üretir (hash’leme) ve bu indeksi değerin bulunduğu hash slot’u belirlemek için kullanır. Normalde anahtarın tamamı hesaba katılır. Ancak süslü parantez çifti {...} ile anahtarın yalnızca bir bölümünün hash’lenmesini sağlayabilirsiniz; bu bölüme hashtag denir. Örneğin person:1 ve person:2 farklı indeksler üretir, ama {person}:1 ve {person}:2 aynı indeksi üretir çünkü yalnızca parantez içindeki person hesaba katılır.

Hashtag’lerin en yaygın kullanımı, cluster ortamında birden fazla anahtar alan komutları çalıştırabilmektir. Redis, cluster bir veritabanında çoğu çok anahtarlı işleme ancak bütün anahtarlar aynı indeksi üretiyorsa izin verir. Belgedeki örnekte iki kümenin kesişimini alan komutun ilk biçimi cluster’da çalışmaz, ikincisi çalışır:

text
SINTER group:1 group:2
SINTER {group}:1 {group}:2

EXISTS ve DEL: var mı, sil

Anahtar uzayıyla çalışan komutlar belirli bir veri tipine bağlı değildir; her tipteki anahtarla kullanılabilir. En temel ikisi EXISTS ve DEL komutlarıdır. Belgedeki oturum ikisinin birlikte nasıl çalıştığını gösterir:

text
> set mykey hello
OK
> exists mykey
(integer) 1
> del mykey
(integer) 1
> exists mykey
(integer) 0

EXISTS aslında bir sayı döndürür: argüman olarak verdiğiniz anahtarlardan kaç tanesinin var olduğunu. Birden fazla anahtar verebilirsiniz. Dikkat edilecek bir ayrıntı, aynı anahtarı birden fazla kez yazarsanız her birinin ayrı sayılmasıdır: somekey varsa EXISTS somekey somekey 2 döndürür. Uygulamanızda “bu anahtarların hepsi var mı?” diye kontrol ediyorsanız listeyi tekrarsız tutun ya da sonucu benzersiz anahtar sayısıyla karşılaştırın.

DEL de silinen anahtar sayısını döndürür; var olmayan anahtarlar sessizce yok sayılır. Belgedeki örnekte üç anahtar silinmek isteniyor ama yalnızca ikisi var:

text
> SET key1 "Hello"
OK
> SET key2 "World"
OK
> DEL key1 key2 key3
(integer) 2

TYPE: anahtarın tipini öğrenmek

TYPE bir anahtarın taşıdığı değerin tipini string olarak döndürür. Belgeye göre dönebilecek değerler string, list, set, zset, hash, stream ve vectorset değerleridir; anahtar yoksa yanıt none olur:

text
> set mykey x
OK
> type mykey
string
> del mykey
(integer) 1
> type mykey
none

Bazı yapıların başka bir tipin üzerine kurulduğunu unutmayın. Bitmap ve bitfield’lar string, coğrafi indeksler sorted set olarak saklanır; bu yüzden TYPE bir coğrafi indeks için zset döndürür. Bu ayrıntı, SCAN komutunun TYPE filtresini kullanırken de karşınıza çıkar. Hangi tipin hangi iş için uygun olduğunu veri tipi seçimi yazısında anlatıyoruz.

RENAME ve RENAMENX: anahtarın adını değiştirmek

RENAME key newkey, anahtarın adını değiştirir ve OK döndürür. Kaynak anahtar yoksa hata döner. Hedef ad zaten varsa üzerine yazılır; bu durumda komut örtük bir DEL çalıştırır. Belge burada önemli bir uyarı yapar: RENAME normalde sabit zamanlı bir işlemdir, ama silinen hedef anahtar çok büyük bir değer taşıyorsa bu örtük silme yüksek gecikmeye yol açabilir.

text
redis> SET mykey "Hello"
OK
redis> RENAME mykey myotherkey
OK
redis> GET myotherkey
"Hello"

Hedefin üzerine yazmak istemiyorsanız RENAMENX kullanın. Bu komut yalnızca yeni ad henüz yoksa adı değiştirir; başarılı olursa 1, hedef zaten varsa 0 döndürür ve hiçbir şeyi değiştirmez:

text
redis> SET mykey "Hello"
OK
redis> SET myotherkey "World"
OK
redis> RENAMENX mykey myotherkey
(integer) 0
redis> GET myotherkey
"World"

İki ayrıntıyı bilmekte fayda var. Birincisi süreyle ilgilidir: EXPIRE sayfasına göre adı değiştirilen anahtarın kalan yaşam süresi yeni ada taşınır. RENAME Key_B Key_A gibi bir çağrıyla var olan bir anahtarın üzerine yazılırsa, eski Key_A anahtarının süresi olsun olmasın yeni Key_A, Key_B anahtarının bütün özelliklerini devralır. İkincisi cluster ile ilgilidir: cluster modunda iki ad aynı hash slot’ta olmalıdır, bu da pratikte yalnızca aynı hashtag’i taşıyan anahtarların güvenle yeniden adlandırılabileceği anlamına gelir.

COPY: değeri başka bir anahtara kopyalamak

COPY source destination, kaynak anahtardaki değeri hedef anahtara kopyalar. Hedef varsayılan olarak bağlantının kullandığı mantıksal veritabanında oluşturulur; DB seçeneğiyle başka bir veritabanı numarası verebilirsiniz. Hedef anahtar zaten varsa komut hiçbir şey yapmaz ve 0 döndürür; REPLACE seçeneği hedefi önce silip sonra kopyalar. Başarılı kopyada yanıt 1 olur. Belgedeki örnek komutlar şunlardır:

text
SET dolly "sheep"
COPY dolly clone
GET clone

Bu örnekte clone yeni bir anahtar olduğu için COPY 1 döndürür ve GET clone kaynakla aynı değeri okur. RENAME ile farkı, kaynağın yerinde kalmasıdır. Bir anahtarın şemasını değiştirmeden önce yedeğini almak ya da bir şablon nesneyi çoğaltmak gibi işlerde kullanışlıdır.

Diğer anahtar uzayı komutları ve numaralı veritabanları

Birkaç küçük komut daha anahtar uzayıyla ilgilidir. TOUCH bir veya daha fazla anahtarın son erişim zamanını günceller ve var olan anahtar sayısını döndürür. DBSIZE seçili veritabanındaki anahtar sayısını verir. RANDOMKEY seçili veritabanından rastgele bir anahtar adı döndürür; veritabanı boşsa boş yanıt verir.

Son olarak numaralı veritabanlarından söz edelim. SELECT sıfırdan başlayan numarasıyla bir mantıksal veritabanı seçer; yeni bağlantılar her zaman sıfır numaralı veritabanını kullanır. Belgeye göre bu veritabanları bir tür ad alanı gibidir: farklı veritabanlarında aynı adlı anahtarlar bulunabilir ama hepsi aynı RDB veya AOF dosyasında saklanır. Belge, veritabanlarını aynı uygulama içinde anahtarları ayırmak için kullanmayı, ilgisiz uygulamaları tek bir Redis örneğinde çalıştırmak için kullanmamayı önerir. Redis Cluster yalnızca sıfır numaralı veritabanını desteklediği için orada SELECT kullanılamaz. Seçili veritabanı bağlantının bir özelliği olduğundan, istemcinin onu takip edip yeniden bağlandığında tekrar seçmesi gerekir.

Sık yapılan hatalar

Sık yapılan hatalar: Önek kullanmamak, EXISTS sonucunu “evet/hayır” sanmak, Büyük anahtarı DEL ile silmek, RENAME ile habersizce üzerine yazmak
  • Önek kullanmamak: Uygulamanın iki bölümü aynı adı farklı tipler için kullanınca WRONGTYPE hatası alırsınız. Her veri türüne kendi önekini verin.
  • EXISTS sonucunu “evet/hayır” sanmak: Komut sayı döndürür ve tekrarlanan anahtarları ayrı sayar.
  • Büyük anahtarı DEL ile silmek: Büyük değerlerde engelleyici silme gecikmeye yol açabilir; UNLINK tercih edin.
  • RENAME ile habersizce üzerine yazmak: Hedef anahtar varsa silinir. Emin değilseniz RENAMENX kullanın.
  • Hashtag’i her yerde kullanmak: Tek slota yığılan anahtarlar cluster performansını düşürür.
  • Anahtarları listelemek için KEYS kullanmak: Üretim sunucusunda sunucuyu bloklayabilir; SCAN kullanın.

Sık Sorulan Sorular

Redis anahtarında boşluk veya Türkçe karakter kullanabilir miyim?

Evet. Anahtarlar ikili güvenlidir; boşluk, noktalama ve herhangi bir bayt dizisi kullanılabilir. Yine de okunabilirlik ve redis-cli’de tırnak ihtiyacını azaltmak için nesne:id:alan gibi sade bir şema seçmek işinizi kolaylaştırır.

Bir anahtar en fazla ne kadar uzun olabilir?

İzin verilen en büyük boyut 512 MB’tır. Ancak belge 1024 baytlık bir anahtarı bile kötü bir fikir olarak niteler; uzun bir değeri anahtar yapmanız gerekiyorsa onun özetini kullanın.

DEL ile UNLINK arasında hangisini seçmeliyim?

İkisi de aynı sayıyı döndürür. Küçük anahtarlarda fark yoktur; büyük değer taşıyan anahtarlarda bellek temizliğini arka plana bırakan UNLINK sunucuyu bloklamaz.

Anahtarın süresi RENAME sonrasında korunur mu?

Evet, kalan süre yeni ada taşınır. Süreyle ilgili bütün kurallar için EXPIRE ve TTL yazısına bakın.

Farklı uygulamaları numaralı veritabanlarıyla ayırabilir miyim?

Belge bunu önermez. Numaralı veritabanları aynı uygulama içinde anahtarları ayırmak içindir; hepsi aynı kalıcılık dosyasında durur ve Redis Cluster yalnızca sıfır numaralı veritabanını destekler. İlgisiz uygulamalar için ayrı Redis örnekleri kullanmak daha doğrudur.

Marka adları sahiplerine aittir. Bu yazı bağımsız bir teknik rehberdir; adı geçen kuruluşlarla bayilik veya ortaklık ilişkisi bulunduğu anlamına gelmez.

İlgili içerikler: Redis öğrenme rehberi · EXPIRE ve TTL · SCAN ve KEYS farkı · Cluster ve hash slot · Veri tipi seçimi