asyncfunctionrenderPage(){const data =awaitgetPageDatas();return data;}
Bileşenler hazırlanıyor...
Not içeriği yükleniyor...
// Markdown dosyası okunuyor
// İçerik işleniyor
// Syntax highlighting hazırlanıyor
Redis Hash Veri Türü | Object Storage ve Field Mapping | Kubilay Bozak
Redis Hash Veri Türü
2025-07-15
18 min
Redis Hashes ile object storage, field-value mapping ve memory optimization. HSET, HGET, HMGET komutları ile structured data management.
Redis
Hash
Object
Key-Value
Storage
Redis'in sunduğu en esnek ve object-oriented veri yapılarından biri olan Hash, field-value çiftlerinden oluşan bir koleksiyon türüdür. Hash veri türü, programlama dillerindeki dictionary, map veya object yapılarına benzer şekilde çalışır ve her bir key altında birden fazla field-value çifti saklayabilir. Bu özelliği sayesinde Redis'te structured data modelleme, user profilleri yönetimi, configuration ayarları ve product katalogları gibi karmaşık veri yapılarını verimli şekilde tutabilirsiniz. Hash yapısı, JSON benzeri verileri Redis'te native olarak saklamanın en optimize yolu olup, memory kullanımı açısından da oldukça verimlidir.
📋 Redis Hash Veri Türü Özellikleri Tablosu
Özellik
Açıklama
Örnek
Field-Value yapısı
Her field bir value ile eşleştirilir
user:123 → {name: "Kubilay", age: "30"}
Object modelleme
Structured data'yı doğrudan modelleyebilir
User profile, product details
Selective retrieval
Sadece istenen fieldları çekebilir
HGET user:123 name
Atomic operations
Field bazlı atomik güncellemeler
HINCRBY user:123 login_count 1
Memory efficient
Küçük hashler için optimize edilmiş encoding
Small hash threshold configuration
Flexible schema
İhtiyaç halinde yeni fieldlar eklenebilir
Dynamic field addition
Batch operations
Birden fazla field'ı aynı anda işleyebilir
HMGET user:123 name email age
String-only values
Tüm field ve value'lar string olarak saklanır
Numeric values stored as strings
🎯 Redis Hash Kullanım Senaryoları
Kullanım Alanı
Açıklama
Redis Komutu Örneği
User profilleri
Kullanıcı bilgilerini structured şekilde
HSET user:123 name "Kubilay" age "30"
Product katalogları
Ürün detaylarını organize etme
HSET product:456 name "Laptop" price "1500"
Configuration ayarları
Uygulama konfigürasyonları
HSET app:config debug "true" timeout "30"
Session data
Kullanıcı session bilgileri
HSET session:abc123 user_id "456"
Shopping cart
E-ticaret sepet içeriği
HSET cart:789 product_1 "2" product_2 "1"
Real-time metrics
Anlık metric değerleri
HSET metrics:server cpu "75" memory "60"
Form data storage
Geçici form verileri
HSET form:temp name "John" email "@"
Feature flags
Dinamik özellik kontrolü
HSET features:user123 premium "true"
Cache objects
Complex object caching
HSET cache:api_response data "{...}"
Multi-language content
Dil bazlı içerik yönetimi
HSET content:123 tr "Merhaba" en "Hello"
Hash veri türünün en büyük avantajlarından biri, selective field access özelliğidir. Traditional key-value storage'da tüm objeyi almak zorunda kalırken, Hash ile sadece ihtiyacınız olan field'ları çekebilirsiniz. Bu özellik, özellikle large objects ve network optimization gerektiren uygulamalarda büyük performans kazanımları sağlar. Örneğin, bir user profile'ından sadece kullanıcı adını almak için tüm profile'ı çekmek yerine, HGET user:123 name komutu ile direkt erişim sağlayabilirsiniz.
Hash yapısının bir diğer önemli özelliği ise memory efficiency'sidir. Redis, küçük hash'ler için özel olarak optimize edilmiş encoding algoritmaları kullanır. ziplist encoding sayesinde, belirli eleman sayısının altındaki hash'ler çok az memory tüketir. Bu özellik, milyonlarca küçük object saklayan sistemlerde muazzam memory tasarrufu sağlar ve cost optimization açısından kritik öneme sahiptir.
🧩 1. Hash Veri Türü Temelleri
Redis'teki Hash, field-value çiftlerinin bir araya geldiği, structured data saklama yapısıdır. Her Redis key'i altında birden fazla field tanımlanabilir ve her field'ın kendine ait value'su bulunur. Hash yapısı, SQL database'lerdeki row'lara veya NoSQL document'lere benzer şekilde çalışır.
🔧 Temel Özellikler
Field-Value mapping: Her field benzersizdir ve bir value ile eşleşir
String storage: Tüm field ve value'lar string olarak saklanır
Dynamic schema: Runtime'da yeni field'lar eklenebilir
Maksimum field sayısı: 2^32 - 1 (yaklaşık 4 milyar field)
Atomic operations: Single field operations atomiktir
🔧 Temel Hash Komutları ve Açıklamaları
Komut
Açıklama
Örnek
HSET
Hash'e field-value çifti ekler veya günceller
HSET user:123 name "Kubilay"
HGET
Belirli field'ın value'sunu getirir
HGET user:123 name
HMSET
Birden fazla field-value çifti ekler
HMSET user:123 name "Kubilay" age "30"
HMGET
Birden fazla field'ın value'sunu getirir
HMGET user:123 name age
HGETALL
Hash'teki tüm field-value çiftlerini getirir
HGETALL user:123
HDEL
Belirli field'ları siler
HDEL user:123 age
HEXISTS
Field'ın var olup olmadığını kontrol eder
HEXISTS user:123 name
HKEYS
Hash'teki tüm field'ları listeler
HKEYS user:123
HVALS
Hash'teki tüm value'ları listeler
HVALS user:123
HLEN
Hash'teki field sayısını verir
HLEN user:123
HINCRBY
Numeric field'ı integer değer kadar artırır
HINCRBY user:123 login_count 1
HINCRBYFLOAT
Numeric field'ı float değer kadar artırır
HINCRBYFLOAT user:123 score 1.5
HSETNX
Field yoksa ekler, varsa işlem yapmaz
HSETNX user:123 created_at "now"
🧪 HSET Komutunu İnceleyelim
Hash'e field-value çifti eklemek veya mevcut field'ı güncellemek için kullanılır.
text
127.0.0.1:6379> HSET user:123 name "Kubilay" // "user:123" hash'ine "name" field'ını ekliyoruz.
(integer) 1 // 1 yeni field eklendi.
127.0.0.1:6379> HSET user:123 email "Kubilaybozak@gmail.com" // "email" field'ını ekliyoruz.
(integer) 1 // 1 yeni field eklendi.
127.0.0.1:6379> HSET user:123 name "Kubilay Bozak" // Mevcut "name" field'ını güncelliyoruz.
(integer) 0 // Mevcut field güncellendi, yeni field eklenmedi.
127.0.0.1:6379> HSET user:123 age "30" city "Istanbul" // Aynı anda iki field ekliyoruz.
(integer) 2 // 2 yeni field eklendi.
📌 Dikkat Edilmesi Gereken Noktalar
HSET eklenen yeni field sayısını döndürür
Mevcut field güncellendiyse sayaç artmaz:
text
127.0.0.1:6379> HSET product:456 name "Laptop" name "Gaming Laptop" // Aynı field iki kez veriliyor.
(integer) 1 // Sadece 1 field eklendi (son değer geçerli).
127.0.0.1:6379>
Hash yoksa otomatik olarak oluşturulur
İlk HSET komutu çalıştırıldığında yeni bir Hash oluşturulur.
Tüm değerler string olarak saklanır
Numeric değerler de string representation olarak tutulur:
text
127.0.0.1:6379> HSET user:123 age 30 // Integer gönderiliyor.
(integer) 1
127.0.0.1:6379> HGET user:123 age // String olarak döndürülüyor.
"30"
🧪 HGET Komutunu İnceleyelim
Hash'ten belirli bir field'ın value'sunu getirir.
text
127.0.0.1:6379> HGET user:123 name // "name" field'ının değerini getir.
"Kubilay Bozak" // Field'ın value'su.
127.0.0.1:6379> HGET user:123 phone // Var olmayan field sorgulanıyor.
(nil) // Field bulunamadı.
127.0.0.1:6379> HGET nonexistent:key field // Var olmayan hash sorgulanıyor.
(nil) // Hash bulunamadı.
📌 Dikkat Edilmesi Gereken Noktalar
O(1) zaman karmaşıklığında çalışır
Hash boyutu ne olursa olsun field access sabit zamanda gerçekleşir.
Case-sensitive field names
Field isimleri büyük/küçük harf duyarlıdır:
127.0.0.1:6379> HSET user:123 Name "Kubilay" name "Kubilay" // İki farklı field.
(integer) 2
Nil response handling
Field veya hash bulunamadığında (nil) döner, application kodunda handle edilmelidir.
🧪 HMGET ve HMSET Komutlarını İnceleyelim
Birden fazla field ile toplu işlem yapmak için kullanılır.
text
127.0.0.1:6379> HMSET user:456 name "Samet" age "28" city "Ankara" job "Engineer" // Birden fazla field ekliyoruz.
OK // İşlem başarılı.
127.0.0.1:6379> HMGET user:456 name age job // Birden fazla field getiriyoruz.
1) "Samet" // name field'ının değeri.
2) "28" // age field'ının değeri.
3) "Engineer" // job field'ının değeri.
127.0.0.1:6379> HMGET user:456 name phone country // Var olan ve olmayan field'ları karışık istiyoruz.
1) "Samet" // name var.
2) (nil) // phone yok.
3) (nil) // country yok.
📌 Dikkat Edilmesi Gereken Noktalar
HMSET Redis 4.0+ sürümünde deprecatedHSET komutu artık multiple field desteklediği için HMSET kullanımı önerilmez.
HMGET sonuçları field sırasını korur
İstenen field'ların sırası response'da korunur.
Performans avantajı
Tek tek HGET komutları yerine HMGET kullanmak network round-trip'i azaltır.
Büyük hash'lerde performans sorunu yaratabilir
Çok fazla field içeren hash'lerde HGETALL yavaş çalışabilir.
Field-value çiftleri halinde döner
Sonuç array'inde çift indeksler field, tek indeksler value'dur.
Production'da dikkatli kullanın
Büyük hash'ler için HSCAN komutu tercih edilmelidir.
🧪 HDEL Komutunu İnceleyelim
Hash'ten bir veya birden fazla field'ı siler.
text
127.0.0.1:6379> HGETALL user:456 // Mevcut durumu görelim.
1) "name"
2) "Samet"
3) "age"
4) "28"
5) "city"
6) "Ankara"
7) "job"
8) "Engineer"
127.0.0.1:6379> HDEL user:456 age // "age" field'ını siliyoruz.
(integer) 1 // 1 field silindi.
127.0.0.1:6379> HDEL user:456 city job // İki field'ı aynı anda siliyoruz.
(integer) 2 // 2 field silindi.
127.0.0.1:6379> HDEL user:456 nonexistent // Var olmayan field'ı silmeye çalışıyoruz.
(integer) 0 // Silinecek field yok.
127.0.0.1:6379> HGETALL user:456 // Güncel durumu kontrol ediyoruz.
1) "name" // Sadece silmeyen field kaldı.
2) "Samet"
📌 Dikkat Edilmesi Gereken Noktalar
Silinen field sayısı döndürülür
Gerçekten silinen field sayısını verir.
Tüm field'lar silinirse hash de silinir
text
127.0.0.1:6379> HDEL user:456 name // Son field'ı da siliyoruz.
(integer) 1
127.0.0.1:6379> EXISTS user:456 // Hash hâlâ var mı?
(integer) 0 // Hash artık yok.
🧪 HEXISTS ve HLEN Komutlarını İnceleyelim
Field varlığını kontrol etmek ve hash boyutunu öğrenmek için kullanılır.
text
127.0.0.1:6379> HSET product:789 name "Phone" price "800" category "Electronics" // Ürün bilgileri ekliyoruz.
(integer) 3
127.0.0.1:6379> HEXISTS product:789 name // "name" field'ı var mı?
(integer) 1 // 1 = var (true).
127.0.0.1:6379> HEXISTS product:789 discount // "discount" field'ı var mı?
(integer) 0 // 0 = yok (false).
127.0.0.1:6379> HLEN product:789 // Hash'te kaç field var?
(integer) 3 // 3 field bulunuyor.
127.0.0.1:6379> HLEN nonexistent:hash // Var olmayan hash sorgulanıyor.
(integer) 0 // 0 field (hash yok).
📌 Dikkat Edilmesi Gereken Noktalar
Her iki komut da O(1) performansında
Hash boyutundan bağımsız olarak sabit zamanda çalışır.
Sıralama garantisi yok
Field ve value'lar rastgele sırada döndürülebilir.
Büyük hash'lerde performans sorunuHGETALL gibi büyük hash'lerde yavaş çalışabilir.
Schema analysis için kullanışlıdır
Dynamic schema yapılarında mevcut field'ları görmek için idealdir.
🧪 HINCRBY ve HINCRBYFLOAT Komutlarını İnceleyelim
Hash field'larında numeric değerleri artırmak/azaltmak için kullanılır.
text
127.0.0.1:6379> HSET analytics:page views "100" unique_visitors "50" // Analitik verileri ekliyoruz.
(integer) 2
127.0.0.1:6379> HINCRBY analytics:page views 10 // Views'ı 10 artırıyoruz.
(integer) 110 // Yeni değer döndürülüyor.
127.0.0.1:6379> HINCRBY analytics:page views -5 // Views'ı 5 azaltıyoruz.
(integer) 105 // Azaltılmış değer.
127.0.0.1:6379> HINCRBY analytics:page new_metric 1 // Var olmayan field'ı 1 değeri ile oluşturuyoruz.
(integer) 1 // Field oluşturuldu ve 1 değeri atandı.
127.0.0.1:6379> HSET ratings:product average "4.5" // Rating verisi ekliyoruz.
(integer) 1
127.0.0.1:6379> HINCRBYFLOAT ratings:product average 0.3 // Rating'i 0.3 artırıyoruz.
"4.8" // Yeni float değer.
127.0.0.1:6379> HINCRBYFLOAT ratings:product average -0.1 // Rating'i 0.1 azaltıyoruz.
"4.7" // Azaltılmış float değer.
📌 Dikkat Edilmesi Gereken Noktalar
Atomik işlemlerdir
Increment/decrement işlemleri tek seferde tamamlanır.
Non-numeric field'larda hata verir
text
127.0.0.1:6379> HSET user:123 name "Kubilay"
(integer) 1
127.0.0.1:6379> HINCRBY user:123 name 1 // String field'ı increment etmeye çalışıyoruz.
(error) ERR hash value is not an integer // Hata: değer integer değil.
Counter ve metrics için idealdir
Real-time analytics, rate limiting, scoring sistemleri için mükemmeldir.
🧪 HSETNX Komutunu İnceleyelim
Field yoksa ekler, varsa hiçbir işlem yapmaz ("set if not exists").
text
127.0.0.1:6379> HSETNX user:999 created_at "2024-01-15" // Yeni field ekliyoruz.
(integer) 1 // Field başarıyla eklendi.
127.0.0.1:6379> HSETNX user:999 created_at "2024-01-20" // Aynı field'ı tekrar eklemeye çalışıyoruz.
(integer) 0 // İşlem yapılmadı, field zaten var.
127.0.0.1:6379> HGET user:999 created_at // Mevcut değeri kontrol ediyoruz.
"2024-01-15" // İlk değer korunmuş.
127.0.0.1:6379> HSETNX user:999 updated_at "2024-01-20" // Yeni bir field ekliyoruz.
(integer) 1 // Başarıyla eklendi.
📌 Dikkat Edilmesi Gereken Noktalar
Conditional setting için idealdir
Default value'lar, initialization logic'i için kullanılır.
Race condition'ları önler
Concurrent işlemlerde field'ın varlığını garanti eder.
Timestamp tracking için kullanışlıdırcreated_at gibi bir kez set edilmesi gereken field'lar için mükemmeldir.
🔄 Hash ile Gerçek Dünya Senaryoları
👤 Senaryo 1: User Profile Management
text
127.0.0.1:6379> HSET user:12345 name "Süleyman Çakır" email "Süleyman@example.com" role "admin" // User profili oluşturuyoruz.
(integer) 3
127.0.0.1:6379> HSET user:12345 last_login "2024-01-20T10:30:00Z" login_count "0" // Login bilgileri ekliyoruz.
(integer) 2
127.0.0.1:6379> HINCRBY user:12345 login_count 1 // Login sayısını artırıyoruz.
(integer) 1
127.0.0.1:6379> HSET user:12345 last_login "2024-01-20T15:45:00Z" // Son login zamanını güncelliyoruz.
(integer) 0
127.0.0.1:6379> HMGET user:12345 name email login_count // Belirli bilgileri çekiyoruz.
1) "Kubilay Çakır"
2) "kubilay@example.com"
3) "1"
127.0.0.1:6379> HEXISTS user:12345 premium // Premium member mi kontrol ediyoruz.
(integer) 0 // Premium değil.
🛒 Senaryo 2: Shopping Cart Management
text
127.0.0.1:6379> HSET cart:user789 product_123 "2" product_456 "1" // Sepete ürün ekliyoruz.
(integer) 2
127.0.0.1:6379> HINCRBY cart:user789 product_123 1 // Ürün miktarını artırıyoruz.
(integer) 3
127.0.0.1:6379> HSET cart:user789 product_999 "1" // Yeni ürün ekliyoruz.
(integer) 1
127.0.0.1:6379> HGETALL cart:user789 // Tüm sepet içeriğini gösteriyoruz.
1) "product_123"
2) "3"
3) "product_456"
4) "1"
5) "product_999"
6) "1"
127.0.0.1:6379> HDEL cart:user789 product_456 // Ürünü sepetten çıkarıyoruz.
(integer) 1
127.0.0.1:6379> HLEN cart:user789 // Sepette kaç çeşit ürün var?
(integer) 2
Redis Hash veri türü, field-value çiftleri ile structured data saklama konusunda Redis'in en esnek ve güçlü araçlarından biridir. Object-oriented veri modelleme imkanı sunarken, selective field access ve memory efficiency özellikleri ile performans açısından da optimize edilmiş bir çözümdür.
Bu bölümde HSET, HGET, HMGET, HGETALL gibi temel komutları; HINCRBY, HSETNX gibi advanced komutları; ve gerçek dünya senaryolarında Hash kullanımını detaylı örneklerle öğrendik.
Hash'in field-value mapping, selective access, atomic operations ve memory efficiency özellikleri özellikle:
User profile management
Shopping cart systems
Configuration management
Session storage
Real-time analytics
Product catalogs
Form data handling
gibi senaryolarda vazgeçilmez bir araçtır.
Hash veri türü, structured data ihtiyaçlarınız için Redis'te en uygun çözümü sunar. Object mapping, schema flexibility ve performance optimization üçlüsü, modern web uygulamalarının karmaşık veri gereksinimlerini karşılamak için mükemmel bir kombinasyon oluşturur.
Bu bölümde öğrendiğiniz komutlar ve senaryolar ile artık:
User profilleri ve session verilerini etkin yönetebilir
E-ticaret sepet sistemleri geliştirebilir
Dynamic configuration sistemleri tasarlayabilir
Real-time analytics dashboard'ları oluşturabilir
Structured caching stratejileri uygulayabilirsiniz
Hash'leri projelerinizde etkin kullanarak, kullanıcılarınıza hızlı, güvenilir ve scalable deneyimler sunabilirsiniz.
Sırada ne var? Bir sonraki yazımızda Redis'in Bitmap veri türünü derinlemesine inceleyeceğiz. Bitmap'ler, bit-level operations ile memory-efficient boolean arrays oluşturabilen, analytics, user tracking ve permission systems için ideal olan özel bir veri türüdür. Milyonlarca kullanıcıya ait boolean bilgileri nasıl minimum memory ile saklayabileceğimizi ve bunlar üzerinde hızlı set operations nasıl yapabileceğimizi öğreneceğiz.