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.
# 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ığı |