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 Bitmap | Bit Operations ve Analytics Rehberi | Kubilay Bozak
Redis Bitmap Veri Türü
2025-07-16
15 min
Redis Bitmaps ile bit-level operations, analytics ve space-efficient storage. SETBIT, GETBIT komutları ile binary data manipulation.
Redis
Bitmap
Bit Operations
Analytics
Binary
Redis'in sunduğu en memory-efficient veri yapılarından biri olan Bitmap, bit düzeyinde boolean verileri saklayan özelleşmiş bir veri türüdür. Bitmap, aslında Redis'te string olarak saklanır ancak bit manipulation işlemleri için optimize edilmiş komutlar sunar. Her bit 0 veya 1 değerini temsil eder ve milyonlarca boolean değeri minimum memory kullanımı ile saklayabilir. Bu özelliği sayesinde kullanıcı aktivite tracking, daily active users hesaplama, feature flags yönetimi ve real-time analytics gibi senaryolarda muazzam performans ve memory tasarrufu sağlar. Bir bitmap, teorik olarak 2^32 bit (512MB) kapasitesine sahiptir ve her bitin pozisyonu benzersiz bir ID'yi temsil edebilir.
📋 Redis Bitmap Veri Türü Özellikleri Tablosu
Özellik
Açıklama
Örnek
Bit-level storage
Her bit 0 veya 1 değerini tutar
bit[123] = 1 (user 123 active)
Extreme memory efficiency
Milyonlarca boolean değeri minimal memory ile
1M user → ~125KB memory
Fast bit operations
Set, get, count işlemleri O(1) zamanda
SETBIT active_users 123 1
Bitwise operations
AND, OR, XOR, NOT işlemleri desteklenir
BITOP AND result bitmap1 bitmap2
Population count
Set edilmiş bit sayısını hızla hesaplar
BITCOUNT daily_active_users
Range operations
Belirli aralıklarda işlem yapabilir
BITCOUNT users 0 100
Sparse bitmap support
Boş alanlar için memory optimizasyonu
Sadece set bitler memory kullanır
String compatibility
String komutları ile de manipüle edilebilir
GET, SET komutları çalışır
🎯 Redis Bitmap Kullanım Senaryoları
Kullanım Alanı
Açıklama
Redis Komutu Örneği
Daily Active Users (DAU)
Günlük aktif kullanıcı takibi
SETBIT dau:2024-01-20 user_123 1
Feature flags
Kullanıcı bazlı özellik kontrolü
SETBIT feature:premium user_456 1
Permission systems
Role-based access control
SETBIT perm:admin user_789 1
A/B testing
Test gruplarını belirleme
SETBIT test:group_a user_111 1
Real-time analytics
Instant user activity tracking
SETBIT active:now user_222 1
Bloom filter implementation
Probabilistic membership testing
Custom bloom filter logic
Session tracking
Online/offline status tracking
SETBIT online:users user_333 1
Content engagement
Like, view, share tracking
SETBIT likes:post123 user_444 1
Inventory management
Available/unavailable product tracking
SETBIT available:products product_555 1
Rate limiting
Request tracking per user/IP
SETBIT requests:hour:user123 minute_30 1
Bitmap'in en büyük gücü, set operations performansındadır. BITOP komutu ile birden fazla bitmap üzerinde AND, OR, XOR ve NOT işlemlerini milyonlarca bit için saniyeler içinde gerçekleştirebilirsiniz. Bu özellik, complex analytics queries ve multi-criteria filtering işlemleri için muazzam avantaj sağlar. Örneğin, "bugün aktif olan ve premium member olan kullanıcıları bul" gibi bir sorguyu iki bitmap'in AND işlemi ile anlık olarak çözebilirsiniz.
Bitmap'in bir diğer önemli özelliği ise sparse optimization'dır. Redis, sadece set edilmiş bitleri memory'de tutar, bu sayede büyük ID aralıklarında bile minimal memory kullanımı sağlar. Örneğin, 1 milyon kullanıcınız varsa ancak sadece 10.000'i aktifse, bitmap sadece aktif kullanıcılar için memory kullanır. Bu özellik, cost-effective scaling ve efficient resource utilization açısından kritik öneme sahiptir.
🧩 1. Bitmap Veri Türü Temelleri
Redis'teki Bitmap, bit array olarak çalışan, her pozisyonda 0 veya 1 değeri saklayan veri yapısıdır. Aslında Redis string'i olarak tutulur ancak bit düzeyinde manipülasyon için özel komutlar sunar. Her bit pozisyonu genellikle bir user ID, product ID veya time slot gibi benzersiz identifier'ı temsil eder.
🔧 Temel Özellikler
Bit positions: Her pozisyon 0'dan başlayarak numaralandırılır
Binary values: Her bit sadece 0 (false) veya 1 (true) değeri alabilir
Maximum size: 2^32 bit (yaklaşık 512MB)
Memory efficiency: 8 bit = 1 byte (8 boolean değer)
Atomic operations: Bit set/get işlemleri atomiktir
🔧 Temel Bitmap Komutları ve Açıklamaları
Komut
Açıklama
Örnek
SETBIT
Belirli pozisyondaki biti set eder
SETBIT users 123 1
GETBIT
Belirli pozisyondaki bit değerini getirir
GETBIT users 123
BITCOUNT
Set edilmiş bit sayısını hesaplar
BITCOUNT users
BITPOS
İlk 0 veya 1 bitinin pozisyonunu bulur
BITPOS users 1
BITOP
Bitwise operations (AND, OR, XOR, NOT)
BITOP AND result bitmap1 bitmap2
BITFIELD
Multiple bit operations in single command
BITFIELD mykey SET u8 0 100
STRLEN
Bitmap'in byte cinsinden boyutunu verir
STRLEN users
🧪 SETBIT Komutunu İnceleyelim
Bitmap'te belirli pozisyondaki biti set etmek için kullanılır.
text
127.0.0.1:6379> SETBIT active_users 123 1 // User 123'ü aktif olarak işaretle.
(integer) 0 // Önceki değer (0 = daha önce set edilmemiş).
127.0.0.1:6379> SETBIT active_users 456 1 // User 456'yı aktif olarak işaretle.
(integer) 0 // Önceki değer.
127.0.0.1:6379> SETBIT active_users 123 0 // User 123'ü pasif yap.
(integer) 1 // Önceki değer (1 = daha önce aktifti).
127.0.0.1:6379> SETBIT active_users 789 1 // User 789'u aktif yap.
(integer) 0 // İlk kez set ediliyor.
📌 Dikkat Edilmesi Gereken Noktalar
SETBIT önceki değeri döndürür
Bit'in eski değerini (0 veya 1) response olarak alırsınız. (Yani önce response döner sonra değer değişir gibi düşünebilirsiniz.)
Bitmap yoksa otomatik oluşturulur
İlk SETBIT komutu ile yeni bitmap oluşturulur.
Büyük pozisyonlar memory expansion yaratır
text
127.0.0.1:6379> SETBIT test 1000000 1 // 1 milyon pozisyonunda bit set ediyoruz.
(integer) 0 // Bitmap 125KB memory kullanacak.
127.0.0.1:6379>
Pozisyon sırası önemli değil
Rastgele pozisyonlarda bit set edebilirsiniz:
text
127.0.0.1:6379> SETBIT users 5000 1 // Yüksek pozisyon.
127.0.0.1:6379> SETBIT users 10 1 // Düşük pozisyon.
🧪 GETBIT Komutunu İnceleyelim
Bitmap'ten belirli pozisyondaki bit değerini okur.
text
127.0.0.1:6379> GETBIT active_users 123 // User 123'ün durumunu kontrol et.
(integer) 0 // 0 = pasif (daha önce 0'a set ettik).
127.0.0.1:6379> GETBIT active_users 456 // User 456'nın durumunu kontrol et.
(integer) 1 // 1 = aktif.
127.0.0.1:6379> GETBIT active_users 999 // Hiç set edilmemiş pozisyon.
(integer) 0 // Default değer 0.
127.0.0.1:6379> GETBIT nonexistent_bitmap 100 // Var olmayan bitmap.
(integer) 0 // Yine 0 döner.
📌 Dikkat Edilmesi Gereken Noktalar
Set edilmemiş bitler 0 değerini döndürür
Hiç dokunulmamış pozisyonlar otomatik olarak 0'dır.
O(1) performance
Bitmap boyutundan bağımsız olarak sabit zamanda çalışır.
Boundary check yok
Bitmap sınırları dışındaki pozisyonlar da 0 döndürür.
🧪 BITCOUNT Komutunu İnceleyelim
Bitmap'te set edilmiş (1 değerindeki) bit sayısını hesaplar.
text
127.0.0.1:6379> SETBIT dau:2024-01-20 100 1 // Günlük aktif kullanıcı bitmapia veri ekliyoruz.
(integer) 0
127.0.0.1:6379> SETBIT dau:2024-01-20 200 1
(integer) 0
127.0.0.1:6379> SETBIT dau:2024-01-20 300 1
(integer) 0
127.0.0.1:6379> SETBIT dau:2024-01-20 150 1
(integer) 0
127.0.0.1:6379> BITCOUNT dau:2024-01-20 // Günlük aktif kullanıcı sayısı.
(integer) 4 // 4 aktif kullanıcı.
127.0.0.1:6379> BITCOUNT dau:2024-01-20 0 10 // İlk 10 byte'taki aktif kullanıcı sayısı.
(integer) 2 // İlk aralıktaki kullanıcılar.
127.0.0.1:6379> BITCOUNT empty_bitmap // Boş bitmap.
(integer) 0 // Hiç set bit yok.
📌 Dikkat Edilmesi Gereken Noktalar
Range parametresi byte bazındadırBITCOUNT key 0 10 → ilk 11 byte'ı kontrol eder (0-10 inclusive).
Çok hızlı çalışır
Redis'te optimize edilmiş population count algoritması kullanır.
Analytics için idealdir
DAU, MAU, engagement metrics hesaplama için mükemmeldir.
🧪 BITPOS Komutunu İnceleyelim
Bitmap'te belirli değerdeki (0 veya 1) ilk bitin pozisyonunu bulur.
text
127.0.0.1:6379> SETBIT test_bitmap 10 1 // Test verisi ekliyoruz.
(integer) 0
127.0.0.1:6379> SETBIT test_bitmap 20 1
(integer) 0
127.0.0.1:6379> SETBIT test_bitmap 30 1
(integer) 0
127.0.0.1:6379> BITPOS test_bitmap 1 // İlk 1 bitinin pozisyonu.
(integer) 10 // 10. pozisyonda ilk 1 bulundu.
127.0.0.1:6379> BITPOS test_bitmap 0 // İlk 0 bitinin pozisyonu.
(integer) 0 // 0. pozisyon 0 değerinde.
127.0.0.1:6379> BITPOS test_bitmap 1 2 // 2. byte'tan itibaren ilk 1.
(integer) 20 // 20. pozisyonda bulundu.
127.0.0.1:6379> BITPOS all_ones_bitmap 0 // Tüm bitler 1 olan bitmap'te 0 ara.
(integer) -1 // Bulunamadı.
📌 Dikkat Edilmesi Gereken Noktalar
Range parametresi byte bazındadır
Bit pozisyonu değil, byte aralığı belirtilir.
Bulunamadığında -1 döner
Aranan değerde bit yoksa -1 response gelir.
First occurrence bulur
Sadece ilk bulunan pozisyonu döndürür.
🧪 BITOP Komutunu İnceleyelim
Birden fazla bitmap üzerinde bitwise operations yapar.
text
127.0.0.1:6379> SETBIT group_a 100 1 // A grubu kullanıcıları.
127.0.0.1:6379> SETBIT group_a 200 1
127.0.0.1:6379> SETBIT group_a 300 1
127.0.0.1:6379> SETBIT premium_users 100 1 // Premium kullanıcılar.
127.0.0.1:6379> SETBIT premium_users 150 1
127.0.0.1:6379> SETBIT premium_users 200 1
127.0.0.1:6379> BITOP AND premium_group_a group_a premium_users // A grubundaki premium kullanıcılar.
(integer) 38 // Sonuç bitmap'in byte boyutu.
127.0.0.1:6379> BITCOUNT premium_group_a // Kaç premium A grubu kullanıcısı var?
(integer) 2 // 100 ve 200 pozisyonları.
127.0.0.1:6379> BITOP OR all_target_users group_a premium_users // A grubu VEYA premium kullanıcılar.
(integer) 38
127.0.0.1:6379> BITCOUNT all_target_users // Toplam hedef kullanıcı sayısı.
(integer) 4 // Tüm benzersiz kullanıcılar.
127.0.0.1:6379> BITOP XOR exclusive_users group_a premium_users // Sadece birinde olan kullanıcılar.
(integer) 38
127.0.0.1:6379> BITCOUNT exclusive_users // Exclusive kullanıcı sayısı.
(integer) 2 // 150 ve 300 pozisyonları.
127.0.0.1:6379> BITOP NOT inverted_group_a group_a // A grubunun tersi.
(integer) 38
📌 Dikkat Edilmesi Gereken Noktalar
Sonuç yeni bir bitmap olarak saklanır
İşlem sonucu belirttiğiniz key'e yazılır.
Farklı boyutlardaki bitmap'ler desteklenir
Küçük bitmap otomatik olarak 0'larla genişletilir.
Complex counters için idealdir
Multiple metrics'i tek key'de verimli şekilde saklayabilirsiniz.
🔄 Bitmap ile Gerçek Dünya Senaryoları
📊 Senaryo 1: Daily Active Users (DAU) Tracking
text
127.0.0.1:6379> SETBIT dau:2024-01-20 user_123 1 // 20 Ocak'ta aktif olan kullanıcılar.
127.0.0.1:6379> SETBIT dau:2024-01-20 user_456 1
127.0.0.1:6379> SETBIT dau:2024-01-20 user_789 1
127.0.0.1:6379> SETBIT dau:2024-01-21 user_123 1 // 21 Ocak'ta aktif olan kullanıcılar.
127.0.0.1:6379> SETBIT dau:2024-01-21 user_999 1
127.0.0.1:6379> SETBIT dau:2024-01-21 user_456 1
127.0.0.1:6379> BITCOUNT dau:2024-01-20 // 20 Ocak DAU.
(integer) 3
127.0.0.1:6379> BITCOUNT dau:2024-01-21 // 21 Ocak DAU.
(integer) 3
127.0.0.1:6379> BITOP AND returning_users:2024-01-21 dau:2024-01-20 dau:2024-01-21 // Arka arkaya gelen kullanıcılar.
(integer) 125
127.0.0.1:6379> BITCOUNT returning_users:2024-01-21 // Returning user sayısı.
(integer) 2 // user_123 ve user_456.
127.0.0.1:6379> BITOP OR mau:2024-01 dau:2024-01-20 dau:2024-01-21 // Monthly active users.
(integer) 125
127.0.0.1:6379> BITCOUNT mau:2024-01 // MAU sayısı.
(integer) 4 // Tüm benzersiz kullanıcılar.
🎯 Senaryo 2: A/B Testing ve Feature Flags
text
127.0.0.1:6379> SETBIT feature:new_ui user_100 1 // Yeni UI özelliğine erişimi olan kullanıcılar.
127.0.0.1:6379> SETBIT feature:new_ui user_200 1
127.0.0.1:6379> SETBIT feature:new_ui user_300 1
127.0.0.1:6379> SETBIT test:group_a user_100 1 // A test grubundaki kullanıcılar.
127.0.0.1:6379> SETBIT test:group_a user_150 1
127.0.0.1:6379> SETBIT test:group_a user_200 1
127.0.0.1:6379> GETBIT feature:new_ui user_100 // User 100'ün yeni UI erişimi var mı?
(integer) 1 // Evet, erişimi var.
127.0.0.1:6379> BITOP AND feature_a_users feature:new_ui test:group_a // A grubunda yeni UI'ya erişimi olan kullanıcılar.
(integer) 38
127.0.0.1:6379> BITCOUNT feature_a_users // Kaç kullanıcı hem A grubunda hem yeni UI'ya erişiyor?
(integer) 2 // user_100 ve user_200.
127.0.0.1:6379> SETBIT premium:users user_100 1 // Premium kullanıcılar.
127.0.0.1:6379> SETBIT premium:users user_400 1
127.0.0.1:6379> BITOP AND premium_feature_users feature:new_ui premium:users // Premium kullanıcılarda yeni UI.
(integer) 50
127.0.0.1:6379> BITCOUNT premium_feature_users // Premium'da yeni UI kullanan sayısı.
(integer) 1 // Sadece user_100.
🔐 Senaryo 3: Permission System Implementation
text
127.0.0.1:6379> SETBIT perm:read user_123 1 // Read permission.
127.0.0.1:6379> SETBIT perm:read user_456 1
127.0.0.1:6379> SETBIT perm:read user_789 1
127.0.0.1:6379> SETBIT perm:write user_123 1 // Write permission.
127.0.0.1:6379> SETBIT perm:write user_456 1
127.0.0.1:6379> SETBIT perm:admin user_123 1 // Admin permission.
127.0.0.1:6379> GETBIT perm:admin user_123 // User 123 admin mi?
(integer) 1 // Evet, admin.
127.0.0.1:6379> GETBIT perm:write user_789 // User 789 yazabilir mi?
(integer) 0 // Hayır, write yetkisi yok.
127.0.0.1:6379> BITOP AND read_write_users perm:read perm:write // Hem okuyup hem yazabilen kullanıcılar.
(integer) 99
127.0.0.1:6379> BITCOUNT read_write_users // Kaç kullanıcının hem read hem write yetkisi var?
(integer) 2 // user_123 ve user_456.
127.0.0.1:6379> BITOP AND full_access_users perm:read perm:write perm:admin // Tüm yetkilere sahip kullanıcılar.
(integer) 99
127.0.0.1:6379> BITCOUNT full_access_users // Full access kullanıcı sayısı.
(integer) 1 // Sadece user_123.
📈 Senaryo 4: Real-time Analytics ve Engagement Tracking
text
127.0.0.1:6379> SETBIT engagement:like:post123 user_100 1 // Post 123'ü beğenen kullanıcılar.
127.0.0.1:6379> SETBIT engagement:like:post123 user_200 1
127.0.0.1:6379> SETBIT engagement:like:post123 user_300 1
127.0.0.1:6379> SETBIT engagement:share:post123 user_100 1 // Post 123'ü paylaşan kullanıcılar.
127.0.0.1:6379> SETBIT engagement:share:post123 user_200 1
127.0.0.1:6379> SETBIT engagement:comment:post123 user_100 1 // Post 123'e yorum yapan kullanıcılar.
127.0.0.1:6379> SETBIT engagement:comment:post123 user_400 1
127.0.0.1:6379> BITCOUNT engagement:like:post123 // Kaç kişi beğendi?
(integer) 3
127.0.0.1:6379> BITCOUNT engagement:share:post123 // Kaç kişi paylaştı?
(integer) 2
127.0.0.1:6379> BITCOUNT engagement:comment:post123 // Kaç kişi yorum yaptı?
(integer) 2
127.0.0.1:6379> BITOP AND high_engagement:post123 engagement:like:post123 engagement:share:post123 engagement:comment:post123 // Üçünü de yapan kullanıcılar.
(integer) 50
127.0.0.1:6379> BITCOUNT high_engagement:post123 // High engagement kullanıcı sayısı.
(integer) 1 // Sadece user_100.
127.0.0.1:6379> BITOP OR total_engagement:post123 engagement:like:post123 engagement:share:post123 engagement:comment:post123 // Herhangi bir şekilde engage olan kullanıcılar.
(integer) 50
127.0.0.1:6379> BITCOUNT total_engagement:post123 // Toplam engage olan kullanıcı sayısı.
(integer) 4 // Tüm benzersiz kullanıcılar.
Redis Bitmap veri türü, bit-level boolean data storage konusunda Redis'in en memory-efficient ve performance-optimized araçlarından biridir. Milyonlarca boolean değeri minimal memory kullanımı ile saklarken, bitwise operations ile complex analytics queries'i saniyeler içinde çözebilir.
Bu bölümde SETBIT, GETBIT, BITCOUNT, BITPOS gibi temel komutları; BITOP ile powerful set operations'ları; ve BITFIELD ile advanced multi-bit operations'ları detaylı örneklerle öğrendik.
Bitmap'in extreme memory efficiency, fast bit operations, bitwise operations ve sparse optimization özellikleri özellikle:
Daily/Monthly Active Users tracking
A/B testing ve feature flags
Permission ve role-based access systems
Real-time analytics ve engagement tracking
Rate limiting ve request tracking
Bloom filter implementations
gibi senaryolarda vazgeçilmez bir araçtır.
Bitmap veri türü, boolean analytics ihtiyaçlarınız için Redis'te en optimize çözümü sunar. Memory efficiency, bitwise performance ve set operations üçlüsü, modern uygulamaların büyük ölçekli boolean data requirements'larını karşılamak için mükemmel bir kombinasyon oluşturur.
Bu bölümde öğrendiğiniz komutlar ve senaryolar ile artık:
User activity tracking sistemleri geliştirebilir
Feature flag management sistemleri tasarlayabilir
Permission-based access control implementasyonları yapabilir
Real-time analytics dashboard'ları oluşturabilir
A/B testing altyapıları geliştirebilirsiniz
Bitmap'leri projelerinizde etkin kullanarak, kullanıcılarınıza memory-efficient, high-performance ve scalable boolean analytics deneyimleri sunabilirsiniz.
Sırada ne var? Bir sonraki yazımızda Redis'in HyperLogLog veri türünü derinlemesine inceleyeceğiz. HyperLogLog, probabilistic data structure ile cardinality estimation yapabilen, unique visitor counting ve distinct element approximation için ideal olan advanced bir veri türüdür. Milyarlarca elementin approximate unique count'unu sadece birkaç KB memory ile nasıl hesaplayabileceğimizi ve bunun big data analytics'teki kritik önemini öğreneceğiz.