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ı

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.
u1000flwyerineuser:1000:followersyazmak ç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:idiyi bir başlangıçtır. Birden fazla kelimeden oluşan alanlar için nokta veya tire kullanılır:comment:4321:reply.toya dacomment: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.
| Anahtar | Değerlendirme |
|---|---|
| u1000flw | Kısa ama ne tuttuğu anlaşılmıyor |
| user:1000:followers | Tip, kimlik ve alan açıkça okunuyor |
| comment:4321:reply.to | Çok kelimeli alan nokta ile ayrılmış |
| 1024 baytlık bir metin | Bellek 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:
SINTER group:1 group:2
SINTER {group}:1 {group}:2EXISTS 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:
> set mykey hello
OK
> exists mykey
(integer) 1
> del mykey
(integer) 1
> exists mykey
(integer) 0EXISTS 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:
> SET key1 "Hello"
OK
> SET key2 "World"
OK
> DEL key1 key2 key3
(integer) 2UNLINK: belleği arka planda geri almak
![UNLINK: belleği arka planda geri almak: DEL key [key ...], UNLINK key [key ...], EXISTS key [key ...]](/assets/blog/redis-anahtar-isimlendirme-ve-keyspace-b5.webp)
UNLINK, DEL ile hemen hemen aynı işi yapar ve aynı şekilde var olmayan anahtarları yok sayar. Fark, belleğin geri alınmasındadır: DEL bu işi komut sırasında yaptığı için engelleyicidir, UNLINK ise anahtarları anahtar uzayından koparır ve asıl bellek temizliğini ayrı bir iş parçacığında, daha sonra yapar. Komutun adı da buradan gelir.
redis> SET key1 "Hello"
OK
redis> SET key2 "World"
OK
redis> UNLINK key1 key2 key3
(integer) 2Pratikte bu fark, büyük değerler taşıyan anahtarları silerken önem kazanır. Milyonlarca elemanlı bir listeyi veya hash’i DEL ile silmek, bellek serbest bırakılana kadar sunucunun diğer komutlara yanıt vermesini geciktirebilir. Küçük anahtarlarda ise iki komutun gözle görülür bir farkı yoktur. Büyük anahtarları nasıl bulacağınızı bellek kullanımı yazısında anlatıyoruz.
| Komut | Döndürdüğü | Bellek temizliği |
|---|---|---|
| DEL key [key ...] | Silinen anahtar sayısı | Komut sırasında, engelleyici |
| UNLINK key [key ...] | Koparılan anahtar sayısı | Ayrı iş parçacığında, sonradan |
| EXISTS key [key ...] | Var olan anahtar sayısı (tekrarlar ayrı sayılır) | Yok |
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:
> set mykey x
OK
> type mykey
string
> del mykey
(integer) 1
> type mykey
noneBazı 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.
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:
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:
SET dolly "sheep"
COPY dolly clone
GET cloneBu ö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

- Önek kullanmamak: Uygulamanın iki bölümü aynı adı farklı tipler için kullanınca
WRONGTYPEhatası 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;
UNLINKtercih edin. - RENAME ile habersizce üzerine yazmak: Hedef anahtar varsa silinir. Emin değilseniz
RENAMENXkullanı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