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 Sets ile unique collections, set operations ve membership testing. SADD, SREM, SINTER komutları ile mathematical set operations.
Özellik | Açıklama | Örnek |
---|---|---|
Benzersizlik | Aynı değer birden fazla kez eklenemez | {apple, banana} ≠ {apple, apple, banana} |
Sırasızlık | Elemanların belirli bir sırası yoktur | {1, 2, 3} = {3, 1, 2} |
Hızlı üyelik sorgusu | Bir elemanın set içinde olup olmadığını O(1) zamanda bulur | SISMEMBER users:active "user123" |
Küme işlemleri | Birleşim, kesişim, fark işlemlerini destekler | SUNION set1 set2 |
Rastgele eleman seçimi | Set'ten rastgele eleman(lar) seçebilir | SRANDMEMBER lottery 3 |
Atomik işlemler | Tüm set işlemleri atomik olarak gerçekleşir | SADD ve SREM thread-safe |
Kullanım Alanı | Açıklama | Redis Komutu Örneği |
---|---|---|
Kullanıcı takip sistemi | Kullanıcının takip ettiği diğer kullanıcılar | SADD following:user123 user456 |
Etiket yönetimi | Blog yazılarının etiketleri | SADD tags:post1 "redis" "database" |
Online kullanıcı takibi | Şu anda aktif olan kullanıcılar | SADD online:users "user123" |
Benzersiz ziyaretçi sayımı | Günlük benzersiz ziyaretçiler | SADD visitors:today "192.168.1.1" |
Yetki ve rol yönetimi | Kullanıcının sahip olduğu roller | SADD user:123:roles "admin" "editor" |
Blacklist/Whitelist | Engellenmiş IP adresleri | SADD blacklist:ips "192.168.1.100" |
Çok seçenekli anket sonuçları | Kullanıcının seçtiği seçenekler | SADD poll:123:user456 "option1" |
Sosyal medya beğenileri | Bir postu beğenen kullanıcılar | SADD likes:post789 "user123" |
SUNION
(birleşim), SINTER
(kesişim) ve SDIFF
(fark) komutlarıyla oldukça kolay ve performanslı hale gelir. Bu özellik, özellikle recommendation engine, sosyal ağ analitiği ve veri madenciliği uygulamalarında büyük avantaj sağlar.SADD
), silme (SREM
) ve üyelik kontrolü (SISMEMBER
) işlemleri O(1) zaman karmaşıklığında çalışır. Bu da Set boyutu ne olursa olsun, bu temel işlemlerin sabit zamanda tamamlanacağı anlamına gelir. Dolayısıyla milyonlarca kullanıcı içeren sistemlerde bile hızlı yanıt süreleri elde edebilirsiniz.Set
, benzersiz string elemanlarından oluşan, sırasız bir koleksiyondur. Aynı değer birden fazla kez eklense bile, Set içinde yalnızca bir kez bulunur. Bu özellik, veri tekrarını otomatik olarak engeller ve temiz veri yapıları oluşturmanızı sağlar.2^32 - 1
(yaklaşık 4 milyar eleman)Komut | Açıklama | Örnek |
---|---|---|
SADD | Set'e bir veya birden fazla eleman ekler | SADD fruits "apple" "banana" |
SMEMBERS | Set'teki tüm elemanları listeler | SMEMBERS fruits |
SREM | Set'ten belirli elemanları siler | SREM fruits "apple" |
SCARD | Set'teki eleman sayısını verir | SCARD fruits |
SISMEMBER | Elemanın set'te olup olmadığını kontrol eder | SISMEMBER fruits "apple" |
SPOP | Set'ten rastgele eleman(lar) çıkarır | SPOP fruits 2 |
SRANDMEMBER | Set'ten rastgele eleman(lar) döndürür | SRANDMEMBER fruits 3 |
SUNION | İki veya daha fazla set'in birleşimini verir | SUNION fruits vegetables |
SINTER | İki veya daha fazla set'in kesişimini verir | SINTER fruits:red fruits:sweet |
SDIFF | İlk set'ten diğerlerinin farkını verir | SDIFF all:users banned:users |
SMOVE | Elemanı bir set'ten diğerine taşır | SMOVE oldset newset "element" |
text127.0.0.1:6379> SADD kullanicilar "ahmet" // "kullanicilar" set'ine "ahmet" kullanıcısını ekliyoruz. (integer) 1 // 1 yeni eleman eklendiği döndürülüyor. 127.0.0.1:6379> SADD kullanicilar "mehmet" // "kullanicilar" set'ine "mehmet" kullanıcısını ekliyoruz. (integer) 1 // 1 yeni eleman eklendiği döndürülüyor. 127.0.0.1:6379> SADD kullanicilar "ahmet" // Aynı elemanı tekrar eklemeye çalışıyoruz. (integer) 0 // Eleman zaten var, 0 yeni eleman eklendi. 127.0.0.1:6379> SADD kullanicilar "fatma" "ayse" "can" // Aynı anda birden fazla eleman ekliyoruz. (integer) 3 // 3 yeni eleman eklendiği döndürülüyor.
text127.0.0.1:6379> SADD test "a" "b" "a" "c" // "a" elemanı iki kez veriliyor. (integer) 3 // Sadece 3 benzersiz eleman eklendi.
SADD
komutu çalıştırıldığında, verilen key ile yeni bir Set oluşturulur."Ahmet"
ve "ahmet"
farklı elemanlar olarak kabul edilir:
text127.0.0.1:6379> SADD isimler "Ahmet" "ahmet" // İki farklı eleman olarak eklenir. (integer) 2 // Her ikisi de başarıyla eklendi.
text127.0.0.1:6379> SET mykey "string value" // String türünde key oluşturuyoruz. OK 127.0.0.1:6379> SADD mykey "element" // String key'e set elemanı eklemeye çalışıyoruz. (error) WRONGTYPE Operation against a key holding the wrong kind of value
text127.0.0.1:6379> SMEMBERS kullanicilar // "kullanicilar" set'indeki tüm elemanları listele. 1) "ahmet" // Set'teki 1. eleman. 2) "mehmet" // Set'teki 2. eleman. 3) "fatma" // Set'teki 3. eleman. 4) "ayse" // Set'teki 4. eleman. 5) "can" // Set'teki 5. eleman.
SMEMBERS
her çalıştırıldığında elemanlar farklı sırada gelebilir.SMEMBERS
komutu çok yavaş çalışabilir ve Redis'i bloke edebilir.
Bu durumda SSCAN
komutu kullanılması önerilir:
127.0.0.1:6379> SSCAN big_set 0 COUNT 10 // Büyük set'i sayfalı şekilde okuma.
text127.0.0.1:6379> SMEMBERS olmayan_set // Var olmayan set sorgulanıyor. (empty array) // Boş array döndürülüyor.
text127.0.0.1:6379> SMEMBERS kullanicilar // Mevcut durumu kontrol ediyoruz. 1) "ahmet" 2) "mehmet" 3) "fatma" 4) "ayse" 5) "can" 127.0.0.1:6379> SREM kullanicilar "mehmet" // "mehmet" kullanıcısını siliyoruz. (integer) 1 // 1 eleman silindiği döndürülüyor. 127.0.0.1:6379> SREM kullanicilar "ahmet" "fatma" // İki elemanı aynı anda siliyoruz. (integer) 2 // 2 eleman silindiği döndürülüyor. 127.0.0.1:6379> SREM kullanicilar "olmayan" // Var olmayan elemanı silmeye çalışıyoruz. (integer) 0 // Silinecek eleman yok, 0 döndürülüyor. 127.0.0.1:6379> SMEMBERS kullanicilar // Güncel durumu kontrol ediyoruz. 1) "ayse" // Sadece silinmeyen elemanlar kaldı. 2) "can"
text127.0.0.1:6379> SREM bos_set "element" // Var olmayan set'ten silme. (integer) 0 // Hiçbir şey silinmedi.
LLEN
komutunun Set versiyonudur.
text127.0.0.1:6379> SCARD kullanicilar // "kullanicilar" set'indeki eleman sayısı. (integer) 2 // Set'te 2 eleman var. 127.0.0.1:6379> SADD kullanicilar "yeni_kullanici" // Yeni bir eleman ekliyoruz. (integer) 1 // 1 yeni eleman eklendi. 127.0.0.1:6379> SCARD kullanicilar // Güncel eleman sayısını kontrol ediyoruz. (integer) 3 // Artık 3 eleman var.
SCARD
komutu her zaman sabit zamanda sonuç verir.text127.0.0.1:6379> SCARD olmayan_set // Var olmayan set sorgulanıyor. (integer) 0 // 0 eleman döndürülüyor.
text127.0.0.1:6379> SMEMBERS kullanicilar // Mevcut set elemanlarını görüyoruz. 1) "ayse" 2) "can" 3) "yeni_kullanici" 127.0.0.1:6379> SISMEMBER kullanicilar "ayse" // "ayse" set'te var mı kontrol ediyoruz. (integer) 1 // 1 = var (true) 127.0.0.1:6379> SISMEMBER kullanicilar "mehmet" // "mehmet" set'te var mı kontrol ediyoruz. (integer) 0 // 0 = yok (false)
1
: Eleman set'te mevcut0
: Eleman set'te mevcut değil veya set yoktext127.0.0.1:6379> SADD test_set "Redis" // "Redis" ekleyin. (integer) 1 127.0.0.1:6379> SISMEMBER test_set "redis" // Küçük harfle kontrol ediyoruz. (integer) 0 // Bulunamadı, çünkü büyük/küçük harf farklı.
text127.0.0.1:6379> SADD loto_numaralari 1 2 3 4 5 6 7 8 9 10 // Loto numaralarını ekliyoruz. (integer) 10 // 10 numara eklendi. 127.0.0.1:6379> SPOP loto_numaralari // Rastgele 1 numara çekiyoruz. "7" // Rastgele "7" seçildi ve çıkarıldı. 127.0.0.1:6379> SPOP loto_numaralari 3 // Rastgele 3 numara çekiyoruz. 1) "2" // Çıkarılan 1. numara. 2) "9" // Çıkarılan 2. numara. 3) "5" // Çıkarılan 3. numara. 127.0.0.1:6379> SCARD loto_numaralari // Kaç numara kaldığını kontrol ediyoruz. (integer) 6 // 10 - 1 - 3 = 6 numara kaldı.
SPOP
komutu elemanları kalıcı olarak siler. Sadece görmek istiyorsanız SRANDMEMBER
kullanın.text127.0.0.1:6379> SPOP bos_set // Boş set'ten eleman çıkarmaya çalışıyoruz. (nil) // Çıkarılacak eleman yok.
text127.0.0.1:6379> SCARD loto_numaralari // Set'te kaç eleman var? (integer) 6 // 6 eleman var. 127.0.0.1:6379> SPOP loto_numaralari 10 // 10 eleman istiyoruz ama sadece 6 var. 1) "1" // Mevcut tüm elemanlar döndürüldü. 2) "3" 3) "4" 4) "6" 5) "8" 6) "10" 127.0.0.1:6379> SCARD loto_numaralari // Set artık boş. (integer) 0
SPOP
'un silmeyen versiyonudur.
text127.0.0.1:6379> SADD renkler "kirmizi" "mavi" "yesil" "sari" "beyaz" // Renk set'i oluşturuyoruz. (integer) 5 // 5 renk eklendi. 127.0.0.1:6379> SRANDMEMBER renkler // Rastgele 1 renk seçiyoruz. "mavi" // "mavi" seçildi ama silinmedi. 127.0.0.1:6379> SRANDMEMBER renkler 3 // Rastgele 3 renk seçiyoruz. 1) "yesil" // Seçilen 1. renk. 2) "sari" // Seçilen 2. renk. 3) "kirmizi" // Seçilen 3. renk. 127.0.0.1:6379> SCARD renkler // Set boyutu değişmedi mi kontrol ediyoruz. (integer) 5 // Hâlâ 5 eleman var, hiçbiri silinmedi.
text127.0.0.1:6379> SRANDMEMBER renkler -3 // Tekrarlı rastgele seçim. 1) "mavi" // Aynı elemanlar tekrarlanabilir. 2) "mavi" 3) "yesil"
text127.0.0.1:6379> SRANDMEMBER renkler 3 // Benzersiz rastgele seçim. 1) "beyaz" // Her eleman en fazla bir kez. 2) "kirmizi" 3) "sari"
text127.0.0.1:6379> SADD meyve "elma" "armut" "muz" // Meyve set'i oluşturuyoruz. (integer) 3 // 3 meyve eklendi. 127.0.0.1:6379> SADD sebze "domates" "salatalik" "muz" // Sebze set'i oluşturuyoruz (muz ortak). (integer) 3 // 3 sebze eklendi. 127.0.0.1:6379> SUNION meyve sebze // İki set'in birleşimini alıyoruz. 1) "elma" // Birleşimdeki 1. eleman. 2) "armut" // Birleşimdeki 2. eleman. 3) "muz" // Ortak eleman bir kez gösteriliyor. 4) "domates" // Birleşimdeki 4. eleman. 5) "salatalik" // Birleşimdeki 5. eleman.
text127.0.0.1:6379> SADD icecek "su" "cay" "kahve" // İçecek set'i. (integer) 3 127.0.0.1:6379> SUNION meyve sebze icecek // Üç set'in birleşimi. 1) "elma" 2) "armut" 3) "muz" 4) "domates" 5) "salatalik" 6) "su" 7) "cay" 8) "kahve"
text127.0.0.1:6379> SUNIONSTORE butun_gidalar meyve sebze // Birleşimi yeni set'e kaydediyoruz. (integer) 5 // 5 benzersiz eleman birleşim set'ine kaydedildi. 127.0.0.1:6379> SMEMBERS butun_gidalar // Yeni set'i kontrol ediyoruz. 1) "elma" 2) "armut" 3) "muz" 4) "domates" 5) "salatalik"
text127.0.0.1:6379> SADD programlama_dilleri "python" "java" "javascript" "go" // Programlama dilleri. (integer) 4 127.0.0.1:6379> SADD web_dilleri "javascript" "php" "python" "ruby" // Web dilleri. (integer) 4 127.0.0.1:6379> SINTER programlama_dilleri web_dilleri // Ortak dilleri buluyoruz. 1) "python" // Her iki set'te de var. 2) "javascript" // Her iki set'te de var.
text127.0.0.1:6379> SADD mobil_dilleri "swift" "kotlin" "dart" // Mobil diller. (integer) 3 127.0.0.1:6379> SINTER web_dilleri mobil_dilleri // Web ve mobil diller arasında kesişim. (empty array) // Ortak eleman yok.
text127.0.0.1:6379> SADD backend_dilleri "python" "java" "go" "rust" // Backend diller. (integer) 4 127.0.0.1:6379> SINTER programlama_dilleri web_dilleri backend_dilleri // Üç set'in ortak elemanları. 1) "python" // Üç set'te de bulunan tek dil.
text127.0.0.1:6379> SADD tum_kullanicilar "ahmet" "mehmet" "fatma" "ayse" // Tüm kullanıcılar. (integer) 4 127.0.0.1:6379> SADD aktif_kullanicilar "ahmet" "fatma" // Aktif kullanıcılar. (integer) 2 127.0.0.1:6379> SDIFF tum_kullanicilar aktif_kullanicilar // Pasif kullanıcıları buluyoruz. 1) "mehmet" // Tümde var ama aktifde yok. 2) "ayse" // Tümde var ama aktifde yok.
SDIFF A B
ile SDIFF B A
farklı sonuçlar verir:
text127.0.0.1:6379> SDIFF aktif_kullanicilar tum_kullanicilar // Ters sıra ile kontrol. (empty array) // Aktifde olup tümde olmayan yok.
text127.0.0.1:6379> SADD premium_kullanicilar "fatma" // Premium kullanıcılar. (integer) 1 127.0.0.1:6379> SDIFF tum_kullanicilar aktif_kullanicilar premium_kullanicilar // Hem aktif hem premium olmayan. 1) "mehmet" // Ne aktif ne de premium. 2) "ayse" // Ne aktif ne de premium.
text127.0.0.1:6379> SDIFFSTORE pasif_kullanicilar tum_kullanicilar aktif_kullanicilar (integer) 2 // 2 pasif kullanıcı bulundu ve kaydedildi.
text127.0.0.1:6379> SADD bekleyen_isler "email_gonder" "rapor_olustur" "backup_al" // Bekleyen işler. (integer) 3 127.0.0.1:6379> SADD tamamlanan_isler "sistem_guncelle" // Tamamlanan işler. (integer) 1 127.0.0.1:6379> SMOVE bekleyen_isler tamamlanan_isler "email_gonder" // İşi tamamlandı olarak taşıyoruz. (integer) 1 // Başarıyla taşındı. 127.0.0.1:6379> SMEMBERS bekleyen_isler // Bekleyen işleri kontrol ediyoruz. 1) "rapor_olustur" // "email_gonder" artık yok. 2) "backup_al" 127.0.0.1:6379> SMEMBERS tamamlanan_isler // Tamamlanan işleri kontrol ediyoruz. 1) "sistem_guncelle" 2) "email_gonder" // Başarıyla taşındı.
text127.0.0.1:6379> SMOVE bekleyen_isler tamamlanan_isler "olmayan_is" // Var olmayan işi taşımaya çalışıyoruz. (integer) 0 // İşlem başarısız, 0 döndürüldü.
text127.0.0.1:6379> SADD bekleyen_isler "sistem_guncelle" // Zaten tamamlanmış işi tekrar ekliyoruz. (integer) 1 127.0.0.1:6379> SMOVE bekleyen_isler tamamlanan_isler "sistem_guncelle" // Aynı elemanı taşıyoruz. (integer) 1 // Başarılı, tekrardan kaçınıldı.
SADD
, SMEMBERS
, SREM
, SCARD
, SISMEMBER
gibi temel komutları; SPOP
, SRANDMEMBER
gibi rastgele seçim komutlarını; ve SUNION
, SINTER
, SDIFF
gibi küme işlemlerini detaylı örneklerle öğrendik.
Set veri türünü artık güvenle kullanabilirsin! Hazırsan bir sonraki paylaşımda Sorted Set (ZSet) veri türüne geçebiliriz - bu da score bazlı sıralama ile Set'in bir üst versiyonu olacak.