RRedis Handbook

ORTA

HyperLogLog

Probabilistic veri yapısı. Unique eleman sayımı — 12KB sabit bellek ile milyarlarca unique değer sayabilir. Hata oranı: ~0.81%.

Kod örneği görünümü Bu sayfadaki eşleşen örnekleri seçilen istemciye göre gösterir.
1M Unique Kullanıcı Sayımı — Bellek Karşılaştırması SET ~64 MB (1M × 64B avg member) HLL 12 KB (sabit!) 5000× daha az bellek Tradeoff: ±0.81% hata, üyelik testi yok 10M unique → SET: 640MB / HLL: hâlâ 12KB
# Unique visitor sayımı
PFADD uv:2026-05-27 "user:1001" "user:1002" "user:1003"
PFADD uv:2026-05-27 "user:1001"    # duplicate — sayılmaz

PFCOUNT uv:2026-05-27               # ~3

# Birden fazla günü birleştir (haftalık unique)
PFMERGE uv:week:22 uv:2026-05-26 uv:2026-05-27

PFCOUNT uv:week:22                  # toplam haftalık unique
public class UniqueVisitorService
{
    private readonly IDatabase _redis;

    public UniqueVisitorService(IConnectionMultiplexer mux)
        => _redis = mux.GetDatabase();

    // Ziyaretçi kaydet
    public async Task TrackVisitorAsync(string userId)
    {
        var key = $"uv:{DateTime.UtcNow:yyyy-MM-dd}";
        await _redis.HyperLogLogAddAsync(key, userId);
        await _redis.KeyExpireAsync(key, TimeSpan.FromDays(90));
    }

    // Bugünkü unique ziyaretçi sayısı
    public async Task<long> GetTodayUniqueCountAsync()
    {
        var key = $"uv:{DateTime.UtcNow:yyyy-MM-dd}";
        return await _redis.HyperLogLogLengthAsync(key);
    }

    // Son N günün toplam unique ziyaretçisi
    public async Task<long> GetUniqueCountForDaysAsync(int days)
    {
        var keys = Enumerable.Range(0, days)
            .Select(i => (RedisKey)$"uv:{DateTime.UtcNow.AddDays(-i):yyyy-MM-dd}")
            .ToArray();

        // PFCOUNT birden fazla key ile çağrılınca merge + count yapar
        return await _redis.HyperLogLogLengthAsync(keys);
    }

    // Haftalık merge (raporlama için)
    public async Task MergeWeeklyAsync(int year, int week)
    {
        var destKey = $"uv:week:{year}:{week}";
        var startOfWeek = ISOWeek.ToDateTime(year, week, DayOfWeek.Monday);
        var sourceKeys = Enumerable.Range(0, 7)
            .Select(i => (RedisKey)$"uv:{startOfWeek.AddDays(i):yyyy-MM-dd}")
            .ToArray();

        await _redis.HyperLogLogMergeAsync(destKey, sourceKeys);
        await _redis.KeyExpireAsync(destKey, TimeSpan.FromDays(365));
    }

    // Unique event tracking (page, feature usage)
    public async Task TrackFeatureUsageAsync(string feature, string userId)
    {
        await _redis.HyperLogLogAddAsync($"feature:{feature}:users", userId);
    }
}
Yöntem Bellek Doğruluk Use Case
SET + SCARD O(N) — büyük %100 Küçük set'ler
HyperLogLog 12KB sabit ~%99.19 Milyonlarca unique
Bitmap 1 bit/user %100 Bilinen ID aralığı