Not içeriği yükleniyor...
// Markdown dosyası okunuyor
// İçerik işleniyor
// Syntax highlighting hazırlanıyor
// Markdown dosyası okunuyor
// İçerik işleniyor
// Syntax highlighting hazırlanıyor
Redis Hashes ile object storage, field-value mapping ve memory optimization. HSET, HGET, HMGET komutları ile structured data management.
Ö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 |
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" |
HGET user:123 name
komutu ile direkt erişim sağlayabilirsiniz.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.2^32 - 1
(yaklaşık 4 milyar field)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" |
text127.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.
text127.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>
HSET
komutu çalıştırıldığında yeni bir Hash oluşturulur.text127.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"
text127.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ı.
127.0.0.1:6379> HSET user:123 Name "Kubilay" name "Kubilay" // İki farklı field.
(integer) 2
(nil)
döner, application kodunda handle edilmelidir.text127.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.
HSET
komutu artık multiple field desteklediği için HMSET
kullanımı önerilmez.HGET
komutları yerine HMGET
kullanmak network round-trip'i azaltır.text127.0.0.1:6379> HGETALL user:456 // Tüm field-value çiftlerini getir. 1) "name" // 1. field. 2) "Samet" // 1. value. 3) "age" // 2. field. 4) "28" // 2. value. 5) "city" // 3. field. 6) "Ankara" // 3. value. 7) "job" // 4. field. 8) "Engineer" // 4. value. 127.0.0.1:6379> HGETALL empty:hash // Boş hash sorgulanıyor. (empty array) // Boş sonuç.
HGETALL
yavaş çalışabilir.HSCAN
komutu tercih edilmelidir.text127.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"
text127.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.
text127.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).
HEXISTS
kullanın.text127.0.0.1:6379> HKEYS product:789 // Tüm field'ları listele. 1) "name" // 1. field. 2) "price" // 2. field. 3) "category" // 3. field. 127.0.0.1:6379> HVALS product:789 // Tüm value'ları listele. 1) "Phone" // 1. value. 2) "800" // 2. value. 3) "Electronics" // 3. value.
HGETALL
gibi büyük hash'lerde yavaş çalışabilir.text127.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.
text127.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.
text127.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.
created_at
gibi bir kez set edilmesi gereken field'lar için mükemmeldir.text127.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.
text127.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
text127.0.0.1:6379> HSET app:config database_url "redis://localhost:6379" debug_mode "true" // Config ayarları. (integer) 2 127.0.0.1:6379> HSET app:config max_connections "100" timeout "30" // Performance ayarları. (integer) 2 127.0.0.1:6379> HGET app:config debug_mode // Debug modunu kontrol ediyoruz. "true" 127.0.0.1:6379> HSETNX app:config cache_enabled "false" // Default cache ayarı ekliyoruz. (integer) 1 127.0.0.1:6379> HMGET app:config debug_mode max_connections timeout // Birden fazla config çekiyoruz. 1) "true" 2) "100" 3) "30" 127.0.0.1:6379> HKEYS app:config // Tüm config anahtarlarını listele. 1) "database_url" 2) "debug_mode" 3) "max_connections" 4) "timeout" 5) "cache_enabled"
text127.0.0.1:6379> HSET analytics:today page_views "1000" unique_visitors "250" // Günlük analitik. (integer) 2 127.0.0.1:6379> HINCRBY analytics:today page_views 50 // Yeni sayfa görüntülemesi. (integer) 1050 127.0.0.1:6379> HINCRBY analytics:today unique_visitors 5 // Yeni benzersiz ziyaretçi. (integer) 255 127.0.0.1:6379> HSET analytics:today bounce_rate "0" conversion_rate "2.5" // İlave metrikler. (integer) 2 127.0.0.1:6379> HINCRBYFLOAT analytics:today bounce_rate 0.1 // Bounce rate artışı. "0.1" 127.0.0.1:6379> HGETALL analytics:today // Dashboard için tüm verileri çek. 1) "page_views" 2) "1050" 3) "unique_visitors" 4) "255" 5) "bounce_rate" 6) "0.1" 7) "conversion_rate" 8) "2.5"
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: