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 Set Veri Türü | Unique Collections ve Set Operations | Kubilay Bozak
Redis Set Veri Türü
2025-07-13
17 min
Redis Sets ile unique collections, set operations ve membership testing. SADD, SREM, SINTER komutları ile mathematical set operations.
Redis
Set
Unique
Operations
Collections
Redis'in sunduğu en güçlü veri yapılarından biri olan Set, benzersiz elemanlardan oluşan bir koleksiyon türüdür. Matematikteki küme kavramına benzer şekilde çalışan Set yapısı, aynı değerin birden fazla kez saklanmasına izin vermez ve elemanları belirli bir sırada tutmaz. Bu özelliği sayesinde tekrarlanan verilerin filtrelenmesi, benzersiz kullanıcı listeleri oluşturulması ve çeşitli küme işlemleri (birleşim, kesişim, fark) için idealdir. Modern web uygulamalarında kullanıcı etkileşimlerinden analitik verilerine, etiket sistemlerinden sosyal medya takip listelerine kadar geniş bir kullanım alanı bulan Set veri türü, Redis'in en verimli ve esnek yapılarından biridir.
📋 Redis Set Veri Türü Özellikleri Tablosu
Ö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
🎯 Redis Set Kullanım Senaryoları
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"
Set veri türünün en büyük avantajlarından biri, küme teorisi operasyonlarını doğrudan desteklemesidir. İki farklı kullanıcının ortak arkadaşlarını bulmak, benzer ilgi alanlarına sahip kullanıcıları tespit etmek ya da farklı kategorilerdeki ürünleri karşılaştırmak gibi işlemler, Set'in sunduğu 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.
Redis Set yapısının bir diğer önemli özelliği ise performansıdır. Eleman ekleme (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.
🧩 1. Set Veri Türü Temelleri
Redis'teki 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.
🔧 Temel Özellikler
Benzersizlik: Aynı değer iki kez bulunamaz
Sırasızlık: Elemanların ekleme sırası korunmaz
Maksimum eleman sayısı: 2^32 - 1 (yaklaşık 4 milyar eleman)
String tabanlı: Tüm elemanlar string olarak saklanır
🔧 Temel Set Komutları ve Açıklamaları
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"
🧪 SADD Komutunu İnceleyelim
Redis'te bir Set'e eleman eklemek için kullanılan temel komuttur. Eğer eleman zaten varsa, tekrar eklenmez.
text
127.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.
📌 Dikkat Edilmesi Gereken Noktalar
SADD komutu eklenen yeni eleman sayısını döndürür
Eğer eleman zaten varsa, o eleman için sayaç artmaz:
text
127.0.0.1:6379> SADD test "a" "b" "a" "c" // "a" elemanı iki kez veriliyor.
(integer) 3 // Sadece 3 benzersiz eleman eklendi.
Set yoksa otomatik olarak oluşturulur
İlk SADD komutu çalıştırıldığında, verilen key ile yeni bir Set oluşturulur.
Büyük/küçük harf duyarlıdır"Ahmet" ve "ahmet" farklı elemanlar olarak kabul edilir:
text
127.0.0.1:6379> SADD isimler "Ahmet" "ahmet" // İki farklı eleman olarak eklenir.
(integer) 2 // Her ikisi de başarıyla eklendi.
Farklı veri türündeki key'e SADD kullanılamaz
Eğer key başka bir veri türünde (String, List, Hash) tanımlıysa hata alırsınız:
text
127.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
🧪 SMEMBERS Komutunu İnceleyelim
Set içindeki tüm elemanları görmek için kullanılır. Elemanlar rastgele sırada döndürülür.
Elemanlar rastgele sırada döndürülür
Set sırasız bir yapı olduğu için, SMEMBERS her çalıştırıldığında elemanlar farklı sırada gelebilir.
Büyük Set'lerde performans sorunu yaratabilir
Milyonlarca eleman içeren Set'lerde 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.
Set yoksa boş array döner
text
127.0.0.1:6379> SMEMBERS olmayan_set // Var olmayan set sorgulanıyor.
(empty array) // Boş array döndürülüyor.
🧪 SREM Komutunu İnceleyelim
Set'ten bir veya birden fazla elemanı silmek için kullanılır.
text
127.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"
📌 Dikkat Edilmesi Gereken Noktalar
Silinen eleman sayısı döndürülür
Komut, gerçekten silinen eleman sayısını verir. Var olmayan elemanlar sayılmaz.
Set boşsa veya key yoksa 0 döner
text
127.0.0.1:6379> SREM bos_set "element" // Var olmayan set'ten silme.
(integer) 0 // Hiçbir şey silinmedi.
🧪 SCARD Komutunu İnceleyelim
Set'teki eleman sayısını verir. List'teki LLEN komutunun Set versiyonudur.
text
127.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.
📌 Dikkat Edilmesi Gereken Noktalar
O(1) zaman karmaşıklığında çalışır
Set ne kadar büyük olursa olsun, SCARD komutu her zaman sabit zamanda sonuç verir.
Set yoksa 0 döner
text
127.0.0.1:6379> SCARD olmayan_set // Var olmayan set sorgulanıyor.
(integer) 0 // 0 eleman döndürülüyor.
🧪 SISMEMBER Komutunu İnceleyelim
Belirli bir elemanın Set'te olup olmadığını kontrol eder. Bu komut Set'in en güçlü özelliklerinden biri olan hızlı üyelik sorgusunu sağlar.
text
127.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)
📌 Dikkat Edilmesi Gereken Noktalar
Sonuç 1 (true) veya 0 (false) olarak döner
1: Eleman set'te mevcut
0: Eleman set'te mevcut değil veya set yok
Çok hızlı çalışır (O(1))
Milyonlarca elemanlı set'lerde bile anlık sonuç verir.
Büyük/küçük harf duyarlıdır
text
127.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ı.
🧪 SPOP Komutunu İnceleyelim
Set'ten rastgele bir veya birden fazla elemanı çıkarır ve siler. Çıkarılan elemanlar artık set'te bulunmaz.
text
127.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ı.
📌 Dikkat Edilmesi Gereken Noktalar
Çıkarılan elemanlar geri alınamazSPOP komutu elemanları kalıcı olarak siler. Sadece görmek istiyorsanız SRANDMEMBER kullanın.
Sonucu yeni bir set'e kaydetmek için SUNIONSTORE kullanılır
text
127.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"
🧪 Küme İşlemleri - SINTER Komutunu İnceleyelim
İki veya daha fazla Set'in kesişimini (intersection) döndürür. Matematik'teki ∩ (kesişim) işlemidir.
text
127.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.
📌 Dikkat Edilmesi Gereken Noktalar
Sadece her iki set'te de bulunan elemanlar döner
Kesişim işlemi, ortak elemanları bulmak için kullanılır.
Eğer kesişim boşsa, boş array döner
text
127.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.
Üç veya daha fazla set ile çalışabilir
text
127.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.
🧪 Küme İşlemleri - SDIFF Komutunu İnceleyelim
İlk Set'te olup diğer Set'lerde olmayan elemanları döndürür. Matematik'teki fark (difference) işlemidir.
text
127.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.
📌 Dikkat Edilmesi Gereken Noktalar
Sıra önemlidirSDIFF A B ile SDIFF B A farklı sonuçlar verir:
text
127.0.0.1:6379> SDIFF aktif_kullanicilar tum_kullanicilar // Ters sıra ile kontrol.
(empty array) // Aktifde olup tümde olmayan yok.
Birden fazla set'ten fark alınabilir
text
127.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.
Sonucu yeni set'e kaydetmek için SDIFFSTORE kullanılır
Bir elemanı bir Set'ten çıkarıp başka bir Set'e taşır. Atomik bir işlemdir.
text
127.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ı.
📌 Dikkat Edilmesi Gereken Noktalar
Atomik işlemdir
Eleman bir anda hem çıkarılır hem de eklenir. Yarım kalan durum olmaz.
Eleman kaynak set'te yoksa 0 döner
text
127.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ü.
Hedef set'te eleman varsa, kaynak set'ten yine silinir
text
127.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ı.
Redis Set veri türü, benzersiz elemanlardan oluşan güçlü bir koleksiyon yapısıdır. Hızlı üyelik kontrolü, küme işlemleri ve atomik operasyonlar sayesinde modern uygulamalarda vazgeçilmez bir araçtır.
Bu bölümde 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.