TairCpc, sıkıştırılmış olasılık sayımı (CPC) taslağı üzerine inşa edilmiş bir veri yapısıdır. HyperLogLog (HLL) ile karşılaştırıldığında çok daha az bellek kullanarak yüksek doğrulukta kardinalite tahmini sunar; bu da onu yüksek aktarım hızına sahip veri akışlarında gerçek zamanlı yinelenen öğe eleme için ideal kılar.
Arka Plan
Gerçek zamanlı karar sistemleri iş olaylarını geldikleri anda işler, sonuçları hızlı erişim için saklar ve anında harekete geçmek üzere kuralları uygular. Düşük gecikme süresi gerektiren kardinalite sayımının kritik olduğu iki örnek aşağıda verilmiştir:
Kredi kartı dolandırıcılığının önlenmesi: Bir kartın şüpheli bir bağlamda kullanılıp kullanılmadığını belirleyin ve şüpheli işlemleri en erken aşamada durdurun.
Bilet karaborsacılığının engellenmesi: Envanteri ele geçirmeden önce sanal cihazlar ve sahte IP adresleri kullanan botları tespit edin ve engelleyin.
TairCpc, gelen verileri boyuta göre yinelemesiz hale getirmenize, taslağı bir Tair örneğinde depolamanıza ve nanosaniyeler içinde toplama sorguları çalıştırmanıza olanak tanır; böylece depolama ve hesaplama tek bir katmanda birleştirilir.
Genel Bakış
CPC bir veri akışındaki farklı değerleri sayar ve birleşik toplamı elde etmek için birden fazla taslağın birleştirilmesini destekler. CPC, HLL ile aynı doğruluğu yaklaşık %40 daha az bellek kullanarak sağlar.
TairCpc, açık kaynaklı CPC uygulamasını genişletir ve hata oranını standart CPC için %0,67 ve HLL için %1,95 iken %0.008'e düşürür.
TairCpc'yi, benzersiz öğeleri saymak için Set yapısına bellek açısından daha verimli bir alternatif olarak düşünebilirsiniz:
| İşlem | Set eşdeğeri | TairCpc eşdeğeri |
|---|---|---|
| Öğe ekleme | SADD key item |
CPC.UPDATE key item |
| Benzersiz öğeleri sayma | SCARD key |
CPC.ESTIMATE key |
Set'in aksine TairCpc ham öğeleri depolamaz; bunun yerine sayımı yaklaşık olarak temsil eden kompakt bir taslak saklar. Bu dengeleme, devasa ölçekte milisaniye altı toplama işlemlerini mümkün kılar.
Temel özellikler
Artımlı okuma ve yazma ile düşük bellek ayak izi ve minimum G/Ç
Yüksek performanslı, ultra yüksek doğruluklu yinelenen öğe eleme
Açık kaynaklı CPC için %0,67 ve HLL için %1,95 iken %0.008'e düşürülmüş hata oranı
Kullanım senaryoları
Banka güvenlik sistemleri: Son bir dakika içinde belirli bir eylemi gerçekleştiren kaç farklı hesap veya cihaz var?
Flash satışlar: Mevcut zaman aralığında bu ürünü satın almaya çalışan kaç benzersiz kullanıcı var?
Bilet karaborsacılığının engellenmesi: Son 10 saniye içinde bu oturumdan istek gönderen kaç farklı IP adresi var?
Ön Koşullar
Başlamadan önce örneğinizin aşağıdaki Tair serisi türlerinden biri olduğundan emin olun:
DRAM tabanlı örnek. Örnek Redis 5.0 ile uyumluysa küçük sürüm 1.7.20 veya üzeri olmalıdır.
Küçük sürümü 1.2.3.3 veya üzeri olan Kalıcı bellek optimize edilmiş örnek.
En fazla özellik ve en yüksek kararlılık için örneğinizi en son küçük sürümde tutun. Yükseltme talimatları için bkz. Örneğin küçük sürümünü güncelleme . Küme örnekleri ve okuma/yazma ayrıştırma örnekleri için de tüm komutların beklendiği gibi çalışması amacıyla proxy düğümlerini en son küçük sürüme yükseltin.
Kullanım notları
TairCpc verileri bir Tair örneğinde depolanır.
Desteklenen komutlar
| Komut | Sözdizimi | Açıklama |
|---|---|---|
| CPC.UPDATE | CPC.UPDATE key item [EX|EXAT|PX|PXAT time] |
Bir anahtara öğe ekler. Anahtar yoksa oluşturur. Öğe zaten varsa işlem yapılmaz. |
| CPC.ESTIMATE | CPC.ESTIMATE key |
Bir anahtar için yinelenmeyen kardinalite tahminini DOUBLE olarak döndürür. |
| CPC.UPDATE2EST | CPC.UPDATE2EST key item [EX|EXAT|PX|PXAT time] |
Bir öğe ekler ve güncellenmiş DOUBLE tahminini döndürür. Anahtar yoksa oluşturur. |
| CPC.UPDATE2JUD | CPC.UPDATE2JUD key item [EX|EXAT|PX|PXAT time] |
Bir öğe ekler ve güncellenmiş tahmini artı farkı döndürür. Yinelenenleri tespit etmek için farkı kullanın: 1 = yeni öğe, 0 = yinelenen. |
| CPC.ARRAY.UPDATE | CPC.ARRAY.UPDATE key timestamp item [EX|EXAT|PX|PXAT time] [SIZE size] [WIN window_length] |
Belirtilen zaman damgasına karşılık gelen zaman penceresine bir öğe ekler. |
| CPC.ARRAY.ESTIMATE | CPC.ARRAY.ESTIMATE key timestamp |
Belirtilen zaman damgasına karşılık gelen zaman penceresi için kardinalite tahminini döndürür. |
| CPC.ARRAY.ESTIMATE.RANGE | CPC.ARRAY.ESTIMATE.RANGE key start_time end_time |
Bir zaman aralığında (kapalı aralık) pencere başına kardinalite tahminlerini döndürür. |
| CPC.ARRAY.ESTIMATE.RANGE.MERGE | CPC.ARRAY.ESTIMATE.RANGE.MERGE key timestamp range |
Bir zaman damgasından başlayarak geriye doğru N zaman penceresini kapsayan birleştirilmiş, yinelenmeyen tahmini döndürür. |
| CPC.ARRAY.UPDATE2EST | CPC.ARRAY.UPDATE2EST key timestamp item [EX|EXAT|PX|PXAT time] [SIZE size] [WIN window_length] |
Bir öğeyi bir zaman penceresine ekler ve o pencere için güncellenmiş tahmini döndürür. |
| CPC.ARRAY.UPDATE2JUD | CPC.ARRAY.UPDATE2JUD key timestamp item [EX|EXAT|PX|PXAT time] [SIZE size] [WIN window_length] |
Bir öğeyi bir zaman penceresine ekler ve o pencere için güncellenmiş tahmini ve farkı döndürür. |
| DEL | DEL key [key ...] |
Bir veya daha fazla TairCpc anahtarını siler. |
Sözdizimi kuralları
BÜYÜK HARF: komut anahtar sözcüğü_italik_: değişken[seçenek]: isteğe bağlı parametreA|B: birbirini dışlayan seçenekler — yalnızca birini belirtin...: önceki parametre tekrarlanabilir
CPC.UPDATE
Bir TairCpc anahtarına öğe ekler. Anahtar yoksa oluşturur. Öğe zaten varsa komut işlem yapmaz.
Sözdizimi
CPC.UPDATE key item [EX|EXAT|PX|PXAT time]
Zaman karmaşıklığı O(1)
Parametreler
| Parametre | Açıklama |
|---|---|
key |
Güncellenecek TairCpc anahtarı. |
item |
Eklenecek öğe. |
EX time |
Saniye cinsinden göreli sona erme süresi. Belirtilmezse anahtarın süresi dolmaz. |
EXAT time |
Saniye cinsinden UNIX zaman damgası olarak mutlak sona erme süresi. Belirtilmezse anahtarın süresi dolmaz. |
PX time |
Milisaniye cinsinden göreli sona erme süresi. Belirtilmezse anahtarın süresi dolmaz. |
PXAT time |
Milisaniye cinsinden UNIX zaman damgası olarak mutlak sona erme süresi. Belirtilmezse anahtarın süresi dolmaz. |
Dönüş değeri
Başarılı olursa
OK.Diğer durumlarda bir hata mesajı.
Örnek
CPC.UPDATE foo f1 EX 3600
OK
CPC.ESTIMATE
Yinelenen öğeler elendikten sonra bir TairCpc anahtarının kardinalite tahminini döndürür. Dönüş değeri bir DOUBLE'dur; kullanılabilir bir sayım için en yakın tam sayıya yuvarlayın.
Sözdizimi
CPC.ESTIMATE key
Zaman karmaşıklığı: O(1)
Parametreler
| Parametre | Açıklama |
|---|---|
key |
Sorgulanacak TairCpc anahtarı. |
Dönüş değeri
Başarılı olursa DOUBLE türünde kardinalite tahmini.
Diğer durumlarda bir hata mesajı.
Örnek
CPC.ESTIMATE foo
"19.000027716212127"
CPC.UPDATE2EST
Tek bir gidiş-dönüşte bir TairCpc anahtarına öğe ekler ve güncellenmiş kardinalite tahminini döndürür. Anahtar yoksa oluşturur.
Sözdizimi
CPC.UPDATE2EST key item [EX|EXAT|PX|PXAT time]
Zaman karmaşıklığı: O(1)
Parametreler
| Parametre | Açıklama |
|---|---|
key |
Güncellenecek TairCpc anahtarı. |
item |
Eklenecek öğe. |
EX time |
Saniye cinsinden göreli sona erme süresi. Belirtilmezse anahtarın süresi dolmaz. |
EXAT time |
Saniye cinsinden UNIX zaman damgası olarak mutlak sona erme süresi. Belirtilmezse anahtarın süresi dolmaz. |
PX time |
Milisaniye cinsinden göreli sona erme süresi. Belirtilmezse anahtarın süresi dolmaz. |
PXAT time |
Milisaniye cinsinden UNIX zaman damgası olarak mutlak sona erme süresi. Belirtilmezse anahtarın süresi dolmaz. |
Dönüş değeri
Başarılı olursa güncellemeden sonraki DOUBLE türünde kardinalite tahmini.
Diğer durumlarda bir hata mesajı.
Örnek
CPC.UPDATE2EST foo f3
"3.0000004768373003"
CPC.UPDATE2JUD
Bir TairCpc anahtarına öğe ekler ve hem güncellenmiş kardinalite tahminini hem de önceki tahminden farkı döndürür. Ayrı bir okuma komutu olmadan öğenin yeni mi yoksa zaten var mı olduğunu belirlemek için farkı kullanın.
1 farkı döndürülürse öğe yenidir (yinelenen yok).
0 farkı döndürülürse öğe zaten vardır (yinelenen algılandı).
Anahtar yoksa oluşturur.
Sözdizimi
CPC.UPDATE2JUD key item [EX|EXAT|PX|PXAT time]
Zaman karmaşıklığı: O(1)
Parametreler
| Parametre | Açıklama |
|---|---|
key |
Güncellenecek TairCpc anahtarı. |
item |
Eklenecek öğe. |
EX time |
Saniye cinsinden göreli sona erme süresi. Belirtilmezse anahtarın süresi dolmaz. |
EXAT time |
Saniye cinsinden UNIX zaman damgası olarak mutlak sona erme süresi. Belirtilmezse anahtarın süresi dolmaz. |
PX time |
Milisaniye cinsinden göreli sona erme süresi. Belirtilmezse anahtarın süresi dolmaz. |
PXAT time |
Milisaniye cinsinden UNIX zaman damgası olarak mutlak sona erme süresi. Belirtilmezse anahtarın süresi dolmaz. |
Dönüş değeri
Başarılı olursa: iki DOUBLE değeri — yeni kardinalite tahmini, ardından yeni ve önceki tahminler arasındaki fark.
Diğer durumlarda bir hata mesajı.
Örnek
CPC.UPDATE2JUD foo f20
1) "20.000027716212127" // New cardinality estimate: 20
2) "1.0000014901183398" // Difference: 20 - 19 = 1 (new item)
CPC.ARRAY.UPDATE
Belirtilen zaman damgasının düştüğü zaman penceresi içinde bir TairCpc dizi anahtarına öğe ekler. Anahtar yoksa oluşturur.
Bir TairCpc dizi anahtarı, CPC taslaklarından oluşan kayan bir pencereyi korur. Her çağrı, zaman damgasına karşılık gelen zaman penceresine veri yazar. Toplam gözlemlenebilir zaman aralığı SIZE × WIN milisaniyedir. Bu aralığın dışındaki veriler, yeni veriler geldiğinde üzerine yazılır.
SIZEveWINyalnızca anahtar ilk oluşturulduğunda uygulanır. Aynı anahtara yapılan sonraki yazma işlemleri, oluşturma sırasında ayarlanan değerleri kullanır.
Örnek: Son 10 dakika içindeki dakika başına benzersiz olayları izlemek için SIZE değerini 10 ve WIN değerini 60000 olarak ayarlayın. 11. dakikadan veri geldiğinde ilk dakikanın verisi üzerine yazılır.
Sözdizimi
CPC.ARRAY.UPDATE key timestamp item [EX|EXAT|PX|PXAT time] [SIZE size] [WIN window_length]
Zaman karmaşıklığı: O(1)
Parametreler
| Parametre | Açıklama |
|---|---|
key |
Güncellenecek TairCpc dizi anahtarı. |
timestamp |
Hangi zaman penceresine yazılacağını belirten milisaniye cinsinden UNIX zaman damgası. |
item |
Eklenecek öğe. |
EX time |
Saniye cinsinden göreli sona erme süresi. Belirtilmezse anahtarın süresi dolmaz. |
EXAT time |
Saniye cinsinden UNIX zaman damgası olarak mutlak sona erme süresi. Belirtilmezse anahtarın süresi dolmaz. |
PX time |
Milisaniye cinsinden göreli sona erme süresi. Belirtilmezse anahtarın süresi dolmaz. |
PXAT time |
Milisaniye cinsinden UNIX zaman damgası olarak mutlak sona erme süresi. Belirtilmezse anahtarın süresi dolmaz. |
SIZE size |
Zaman penceresi sayısı. Varsayılan: 10. Geçerli aralık: 1–1000. Tipik iş yükleri için 120'nin altında tutun. |
WIN window_length |
Her bir zaman penceresinin milisaniye cinsinden uzunluğu. Varsayılan: 60000 (1 dakika). |
Dönüş değeri
Başarılı olursa
OK.Diğer durumlarda bir hata mesajı.
Örnek
CPC.ARRAY.UPDATE foo 1645584510000 f1 SIZE 120 WIN 10000
OK
CPC.ARRAY.ESTIMATE
Belirtilen zaman damgasının düştüğü zaman penceresi için kardinalite tahminini döndürür.
Sözdizimi
CPC.ARRAY.ESTIMATE key timestamp
Zaman karmaşıklığı: O(1)
Parametreler
| Parametre | Açıklama |
|---|---|
key |
Sorgulanacak TairCpc dizi anahtarı. |
timestamp |
Sorgulanacak zaman penceresini belirleyen milisaniye cinsinden UNIX zaman damgası. |
Dönüş değeri
Başarılı olursa eşleşen zaman penceresi için kardinalite tahmini.
Diğer durumlarda bir hata mesajı.
Örnek
CPC.ARRAY.ESTIMATE foo 1645584532000
"2"
CPC.ARRAY.ESTIMATE.RANGE
Belirtilen bir zaman aralığındaki (kapalı aralık) tüm zaman pencereleri için pencere başına kardinalite tahminlerini döndürür. Yanıttaki her değer bir zaman penceresine karşılık gelir.
Sözdizimi
CPC.ARRAY.ESTIMATE.RANGE key start_time end_time
Zaman karmaşıklığı: O(1)
Parametreler
| Parametre | Açıklama |
|---|---|
key |
Sorgulanacak TairCpc dizi anahtarı. |
start_time |
Milisaniye cinsinden UNIX zaman damgası olarak zaman aralığının başlangıcı. |
end_time |
Milisaniye cinsinden UNIX zaman damgası olarak zaman aralığının bitişi. |
Dönüş değeri
Başarılı olursa aralıktaki her zaman penceresi için birer tane olmak üzere kardinalite tahminlerinin listesi.
Diğer durumlarda bir hata mesajı.
Örnek
CPC.ARRAY.ESTIMATE.RANGE foo 1645584510000 1645584550000
1) "2"
2) "0"
3) "1"
4) "0"
5) "0"
CPC.ARRAY.ESTIMATE.RANGE.MERGE
Belirtilen zaman damgasından başlayarak geriye doğru N zaman penceresini birleştirerek tek bir birleştirilmiş ve yinelenmeyen kardinalite tahmini döndürür.
Pencere başına sayılar yerine birden fazla zaman penceresinde birleştirilmiş benzersiz bir sayıma ihtiyaç duyduğunuzda bu komutu kullanın; örneğin, son 5 dakikadaki toplam benzersiz kullanıcı sayısı.
Sözdizimi
CPC.ARRAY.ESTIMATE.RANGE.MERGE key timestamp range
Zaman karmaşıklığı: O(1)
Parametreler
| Parametre | Açıklama |
|---|---|
key |
Sorgulanacak TairCpc dizi anahtarı. |
timestamp |
Milisaniye cinsinden UNIX zaman damgası olarak sorgunun başlangıç noktası. |
range |
Zaman damgasından geriye doğru sayılan birleştirilecek zaman penceresi sayısı. |
Dönüş değeri
Başarılı olursa birleştirilmiş, yinelenmeyen kardinalite tahmini.
Diğer durumlarda bir hata mesajı.
Örnek
CPC.ARRAY.ESTIMATE.RANGE.MERGE foo 1645584510000 3
"6"
CPC.ARRAY.UPDATE2EST
Belirtilen zaman damgasına karşılık gelen zaman penceresine bir öğe ekler ve tek bir gidiş-dönüşte o pencere için güncellenmiş kardinalite tahminini döndürür. Anahtar yoksa oluşturur.
CPC.ARRAY.UPDATE ile aynı anahtar oluşturma parametrelerini kullanır.
Sözdizimi
CPC.ARRAY.UPDATE2EST key timestamp item [EX|EXAT|PX|PXAT time] [SIZE size] [WIN window_length]
Zaman karmaşıklığı: O(1)
Parametreler
| Parametre | Açıklama |
|---|---|
key |
Güncellenecek TairCpc dizi anahtarı. |
timestamp |
Hedef zaman penceresini belirleyen milisaniye cinsinden UNIX zaman damgası. |
item |
Eklenecek öğe. |
EX time |
Saniye cinsinden göreli sona erme süresi. Belirtilmezse anahtarın süresi dolmaz. |
EXAT time |
Saniye cinsinden UNIX zaman damgası olarak mutlak sona erme süresi. Belirtilmezse anahtarın süresi dolmaz. |
PX time |
Milisaniye cinsinden göreli sona erme süresi. Belirtilmezse anahtarın süresi dolmaz. |
PXAT time |
Milisaniye cinsinden UNIX zaman damgası olarak mutlak sona erme süresi. Belirtilmezse anahtarın süresi dolmaz. |
SIZE size |
Zaman penceresi sayısı. Varsayılan: 10. Geçerli aralık: 1–1000. Tipik iş yükleri için 120'nin altında tutun. |
WIN window_length |
Her bir zaman penceresinin milisaniye cinsinden uzunluğu. Varsayılan: 60000 (1 dakika). |
Dönüş değeri
Başarılı olursa zaman penceresi için güncellenmiş DOUBLE kardinalite tahmini.
Diğer durumlarda bir hata mesajı.
Örnek
CPC.ARRAY.UPDATE2EST foo 1645584530000 f3
"3"
CPC.ARRAY.UPDATE2JUD
Belirtilen zaman damgasına karşılık gelen zaman penceresine bir öğe ekler ve hem güncellenmiş kardinalite tahminini hem de o pencere için önceki tahminden farkı döndürür. Anahtar yoksa oluşturur.
1 farkı döndürülürse öğe yenidir (bu pencerede yinelenen yok).
0 farkı döndürülürse öğe bu pencerede zaten vardır.
CPC.ARRAY.UPDATE ile aynı anahtar oluşturma parametrelerini kullanır.
Sözdizimi
CPC.ARRAY.UPDATE2JUD key timestamp item [EX|EXAT|PX|PXAT time] [SIZE size] [WIN window_length]
Zaman karmaşıklığı: O(1)
Parametreler
| Parametre | Açıklama |
|---|---|
key |
Güncellenecek TairCpc dizi anahtarı. |
timestamp |
Hedef zaman penceresini belirleyen milisaniye cinsinden UNIX zaman damgası. |
item |
Eklenecek öğe. |
EX time |
Saniye cinsinden göreli sona erme süresi. Belirtilmezse anahtarın süresi dolmaz. |
EXAT time |
Saniye cinsinden UNIX zaman damgası olarak mutlak sona erme süresi. Belirtilmezse anahtarın süresi dolmaz. |
PX time |
Milisaniye cinsinden göreli sona erme süresi. Belirtilmezse anahtarın süresi dolmaz. |
PXAT time |
Milisaniye cinsinden UNIX zaman damgası olarak mutlak sona erme süresi. Belirtilmezse anahtarın süresi dolmaz. |
SIZE size |
Zaman penceresi sayısı. Varsayılan: 10. Geçerli aralık: 1–1000. Tipik iş yükleri için 120'nin altında tutun. |
WIN window_length |
Her bir zaman penceresinin milisaniye cinsinden uzunluğu. Varsayılan: 60000 (1 dakika). |
Dönüş değeri
Başarılı olursa: iki değer — zaman penceresi için güncellenmiş kardinalite tahmini, ardından yeni ve önceki tahminler arasındaki fark.
Diğer durumlarda bir hata mesajı.
Örnek
CPC.ARRAY.UPDATE2JUD foo 1645584530000 f7
1) "8" // New cardinality estimate for this window: 8
2) "1" // Difference: 8 - 7 = 1 (new item)