全部產品
Search
文件中心

Tair:Cpc

更新時間:Jul 16, 2024

TairCpc是基於CPC(Compressed Probability Counting)壓縮演算法開發的資料結構,支援僅佔用很小的記憶體空間對採樣資料進行高效能運算。

背景資訊

在巨量資料即時決策情境中,通常會將業務日誌流入Realtime Compute系統完成計算,然後將計算結果儲存至線上儲存系統,最終由即時規則或決策系統進行決策,例如:

  • 防控信用卡欺詐交易:快速判斷刷卡環境是否可信,若發現異常則需第一時間攔截交易。

  • 防控黃牛團夥惡意牟利:即時識別並阻止通過虛擬設備、虛假地址等方式損害平台利益的行為。

您可以利用TairCpc將即時資料,按不同的去重維度,結構化地儲存到Tair資料庫中,即可在高速的訪問情境中直接獲得結果,實現儲存、計算一體化。同時TairCpc提供多重彙總運算,可以在納秒級彙總資料結果,具備即時風控的能力。

TairCpc簡介

CPC是一種高效能資料去重演算法,可以將不同的值作為資料流進行計數,支援將多個資料區塊合并、去重,獲得去重後的總計數。相比HLL(Hyperloglog)演算法,在相同精度下,CPC大約可節省40%記憶體空間。

同時,TairCpc在開源CPC演算法的基礎上,將誤差率最佳化至0.008%(開源CPC為0.67%;HLL誤差率為1.95%)。

主要特徵

  • 記憶體佔用低,支援增量讀寫,實現IO最小化。

  • 高效能去重,同時擁有超高去重精度。

  • 誤差率穩定收斂。

典型情境

  • 銀行安全系統

  • 秒殺限購

  • 防控使用者(或黃牛團夥)惡意牟利

前提條件

執行個體為Tair

說明

最新小版本將提供更豐富的功能與穩定的服務,建議將執行個體的小版本升級到最新,具體操作請參見升級小版本。如果您的執行個體為叢集執行個體或讀寫分離架構,請將代理節點的小版本也升級到最新,否則可能出現命令無法識別的情況。

注意事項

操作對象為Tair執行個體中的TairCpc資料。

命令列表

表 1. TairCpc命令

命令

文法

說明

CPC.UPDATE

CPC.UPDATE key item [EX|EXAT|PX|PXAT time]

在指定TairCpc中添加item。若TairCpc不存在則自動建立,若待添加的item已存在於目標TairCpc中,則不會進行操作。

CPC.ESTIMATE

CPC.ESTIMATE key

擷取指定TairCpc去重後的基數估算值,傳回值的資料類型為double類型,您可以僅取整數部分(忽略小數點後的資料)。

CPC.UPDATE2EST

CPC.UPDATE2EST key item [EX|EXAT|PX|PXAT time]

在指定TairCpc中添加item,返回更新後的基數估算值。若TairCpc不存在則自動建立。

CPC.UPDATE2JUD

CPC.UPDATE2JUD key item [EX|EXAT|PX|PXAT time]

在指定TairCpc中添加item,並返回更新後的基數估算值和其與更新前的差值。若返回的差值為1則表示寫入成功且不存在重複;若為0則表示已存在當前item。若TairCpc不存在則自動建立。

CPC.ARRAY.UPDATE

CPC.ARRAY.UPDATE key timestamp item [EX|EXAT|PX|PXAT time] [SIZE size] [WIN window_length]

在指定TairCpc中,向目標timestamp對應的時間視窗添加item。若TairCpc不存在則自動建立,SIZE為時間視窗個數,WIN為時間視窗的長度(單位為毫秒)。隨著流式資料的寫入,TairCpc會持續向前更新並儲存SIZE * WIN時間範圍內的資料,超過該時間範圍的資料會被覆蓋、刪除。SIZEWIN屬性僅在建立TairCpc的時生效。

說明

例如目標key為計算近10分鐘內每分鐘的資料:可以設定SIZE為10(10個時間視窗)、WIN為60000(每個時間視窗為1分鐘)。當目標key中寫入第11分鐘的資料時,第1分鐘的資料會逐漸被覆蓋、刪除。

CPC.ARRAY.ESTIMATE

CPC.ARRAY.ESTIMATE key timestamp

擷取指定TairCpc中目標timestamp所在時間視窗的基數估算值。

CPC.ARRAY.ESTIMATE.RANGE

CPC.ARRAY.ESTIMATE.RANGE key start_time end_time

擷取指定TairCpc的指定時間段內(包含指定時間點)各個時間視窗的基數估算值。

CPC.ARRAY.ESTIMATE.RANGE.MERGE

CPC.ARRAY.ESTIMATE.RANGE.MERGE key timestamp range

擷取指定TairCpc在指定時間點至往前range(含當前視窗)個時間視窗內,時間視窗合并、去重後的基數估算值。

CPC.ARRAY.UPDATE2EST

CPC.ARRAY.UPDATE2EST key timestamp item [EX|EXAT|PX|PXAT time] [SIZE size] [WIN window_length]

在指定TairCpc中,向目標timestamp對應的時間視窗添加item,並返回該時間視窗更新後的基數估算值。若TairCpc不存在則自動建立,建立參數用法與CPC.ARRAY.UPDATE一致。

CPC.ARRAY.UPDATE2JUD

CPC.ARRAY.UPDATE2JUD key timestamp item [EX|EXAT|PX|PXAT time] [SIZE size] [WIN window_length]

在指定TairCpc中,向目標timestamp對應的時間視窗添加item,並返回該時間視窗更新後的基數估算值和其與更新前的差值。若返回的差值為1,則表示寫入成功且不存在重複;若為0則表示已存在當前item。若TairCpc不存在則自動建立,建立參數用法與CPC.ARRAY.UPDATE一致。

DEL

DEL key [key ...]

使用原生Redis的DEL命令可以刪除一條或多條TairCpc資料。

說明

本文的命令文法定義如下:

  • 大寫關鍵字:命令關鍵字。

  • 斜體:變數。

  • [options]:選擇性參數,不在括弧中的參數為必選。

  • A|B:該組參數互斥,請進行二選一或多選一。

  • ...:前面的內容可重複。

CPC.UPDATE

類別

說明

文法

CPC.UPDATE key item [EX|EXAT|PX|PXAT time]

時間複雜度

O(1)

命令描述

在指定TairCpc中添加item。若TairCpc不存在則自動建立,若待添加的item已存在於目標TairCpc中,則不會進行操作。

選項

  • key:Key名稱(TairCpc資料結構),用於指定命令調用的TairCpc對象。

  • item:待添加的資料。

  • EX:指定key的相對到期時間,單位為秒,不傳此參數表示不到期。

  • EXAT:指定key的絕對到期時間(Unix時間戳記),單位為秒,不傳此參數表示不到期。

  • PX:指定key的相對到期時間,單位為毫秒,不傳此參數表示不到期。

  • PXAT:指定key的絕對到期時間(Unix時間戳記),單位為毫秒 ,不傳此參數表示不到期。

傳回值

  • OK:表示執行成功。

  • 其它情況返回相應的異常資訊。

樣本

命令樣本:

CPC.UPDATE foo f1 EX 3600

返回樣本:

OK

CPC.ESTIMATE

類別

說明

文法

CPC.ESTIMATE key

時間複雜度

O(1)

命令描述

擷取指定TairCpc去重後的基數估算值,傳回值的資料類型為double類型,您可以僅取整數部分(忽略小數點後的資料)。

選項

  • key:Key名稱(TairCpc資料結構)。

傳回值

  • 執行成功:返回估算值,資料類型為double類型。

  • 其它情況返回相應的異常資訊。

樣本

命令樣本:

CPC.ESTIMATE foo

返回樣本:

"19.000027716212127"

CPC.UPDATE2EST

類別

說明

文法

CPC.UPDATE2EST key item [EX|EXAT|PX|PXAT time]

時間複雜度

O(1)

命令描述

在指定TairCpc中添加item,返回更新後的基數估算值。若TairCpc不存在則自動建立。

選項

  • key:Key名稱(TairCpc資料結構),用於指定命令調用的TairCpc對象。

  • item:待添加的資料。

  • EX:指定key的相對到期時間,單位為秒,不傳此參數表示不到期。

  • EXAT:指定key的絕對到期時間(Unix時間戳記),單位為秒,不傳此參數表示不到期。

  • PX:指定key的相對到期時間,單位為毫秒,不傳此參數表示不到期。

  • PXAT:指定key的絕對到期時間(Unix時間戳記),單位為毫秒 ,不傳此參數表示不到期。

傳回值

  • 執行成功:返回更新後的估算值,資料類型為double類型。

  • 其它情況返回相應的異常資訊。

樣本

命令樣本:

CPC.UPDATE2EST foo f3

返回樣本:

"3.0000004768373003"

CPC.UPDATE2JUD

類別

說明

文法

CPC.UPDATE2JUD key item [EX|EXAT|PX|PXAT time]

時間複雜度

O(1)

命令描述

在指定TairCpc中添加item,並返回更新後的基數估算值和其與更新前的差值。若返回的差值為1則表示寫入成功且不存在重複;若為0則表示已存在當前item。若TairCpc不存在則自動建立。

選項

  • key:Key名稱(TairCpc資料結構),用於指定命令調用的TairCpc對象。

  • item:待添加的資料。

  • EX:指定key的相對到期時間,單位為秒,不傳此參數表示不到期。

  • EXAT:指定key的絕對到期時間(Unix時間戳記),單位為秒,不傳此參數表示不到期。

  • PX:指定key的相對到期時間,單位為毫秒,不傳此參數表示不到期。

  • PXAT:指定key的絕對到期時間(Unix時間戳記),單位為毫秒 ,不傳此參數表示不到期。

傳回值

  • 執行成功:返回更新後的估算值和該值與更新前的差值,資料類型均為double類型。

  • 其它情況返回相應的異常資訊。

樣本

命令樣本:

CPC.UPDATE2JUD foo f20

返回樣本:

1) "20.000027716212127"    // 更新後,TairCpc的估算值為20。
2) "1.0000014901183398"    // 20 - 19 = 1

CPC.ARRAY.UPDATE

類別

說明

文法

CPC.ARRAY.UPDATE key timestamp item [EX|EXAT|PX|PXAT time] [SIZE size] [WIN window_length]

時間複雜度

O(1)

命令描述

在指定TairCpc中,向目標timestamp對應的時間視窗添加item。若TairCpc不存在則自動建立,SIZE為時間視窗個數,WIN為時間視窗的長度(單位為毫秒)。隨著流式資料的寫入,TairCpc會持續向前更新並儲存SIZE * WIN時間範圍內的資料,超過該時間範圍的資料會被覆蓋、刪除。SIZEWIN屬性僅在建立TairCpc的時生效。

說明

例如目標key為計算近10分鐘內每分鐘的資料:可以設定SIZE為10(10個時間視窗)、WIN為60000(每個時間視窗為1分鐘)。當目標key中寫入第11分鐘的資料時,第1分鐘的資料會逐漸被覆蓋、刪除。

選項

  • key:Key名稱(TairCpc資料結構),用於指定命令調用的TairCpc對象。

  • timestamp:指定的Unix時間戳記,單位為毫秒。

  • item:待添加的資料。

  • EX:指定key的相對到期時間,單位為秒,不傳此參數表示不到期。

  • EXAT:指定key的絕對到期時間(Unix時間戳記),單位為秒,不傳此參數表示不到期。

  • PX:指定key的相對到期時間,單位為毫秒,不傳此參數表示不到期。

  • PXAT:指定key的絕對到期時間(Unix時間戳記),單位為毫秒 ,不傳此參數表示不到期。

  • SIZE:時間視窗個數,預設為10,範圍為[1,1000],建議設定在120以內。

  • WIN:時間視窗的長度(單位為毫秒),預設為60000毫秒(1分鐘)。

傳回值

  • OK:表示執行成功。

  • 其它情況返回相應的異常資訊。

樣本

命令樣本:

CPC.ARRAY.UPDATE foo 1645584510000 f1 SIZE 120 WIN 10000

返回樣本:

OK

CPC.ARRAY.ESTIMATE

類別

說明

文法

CPC.ARRAY.ESTIMATE key timestamp

時間複雜度

O(1)

命令描述

擷取指定TairCpc中目標timestamp所在時間視窗的基數估算值。

選項

  • key:Key名稱(TairCpc資料結構),用於指定命令調用的TairCpc對象。

  • timestamp:指定的Unix時間戳記,單位為毫秒。

傳回值

  • 執行成功:返回對應時間視窗的基數估算值。

  • 其它情況返回相應的異常資訊。

樣本

命令樣本:

CPC.ARRAY.ESTIMATE foo 1645584532000

返回樣本:

"2"

CPC.ARRAY.ESTIMATE.RANGE

類別

說明

文法

CPC.ARRAY.ESTIMATE.RANGE key start_time end_time

時間複雜度

O(1)

命令描述

擷取指定TairCpc的指定時間段內(包含指定時間點)各個時間視窗的基數估算值。

選項

  • key:Key名稱(TairCpc資料結構),用於指定命令調用的TairCpc對象。

  • start_time:查詢的開始時間(Unix時間戳記),單位為毫秒。

  • end_time:查詢的結束時間(Unix時間戳記),單位為毫秒。

傳回值

  • 執行成功:返回目標時間視窗的基數估算值。

  • 其它情況返回相應的異常資訊。

樣本

命令樣本:

CPC.ARRAY.ESTIMATE.RANGE foo 1645584510000 1645584550000

返回樣本:

1) "2"
2) "0"
3) "1"
4) "0"
5) "0"

CPC.ARRAY.ESTIMATE.RANGE.MERGE

類別

說明

文法

CPC.ARRAY.ESTIMATE.RANGE.MERGE key timestamp range

時間複雜度

O(1)

命令描述

擷取指定TairCpc在指定時間點至往前range(含當前視窗)個時間視窗內,時間視窗合并、去重後的基數估算值。

選項

  • key:Key名稱(TairCpc資料結構),用於指定命令調用的TairCpc對象。

  • timestamp:查詢的開始時間(Unix時間戳記),單位為毫秒。

  • range:查詢的時間視窗個數。

傳回值

  • 執行成功:返回目標key在指定時間段內去重後的基數估算值。

  • 其它情況返回相應的異常資訊。

樣本

命令樣本:

CPC.ARRAY.ESTIMATE.RANGE.MERGE foo 1645584510000 3

返回樣本:

"6"

CPC.ARRAY.UPDATE2EST

類別

說明

文法

CPC.ARRAY.UPDATE2EST key timestamp item [EX|EXAT|PX|PXAT time] [SIZE size] [WIN window_length]

時間複雜度

O(1)

命令描述

在指定TairCpc中,向目標timestamp對應的時間視窗添加item,並返回該時間視窗更新後的基數估算值。若TairCpc不存在則自動建立,建立參數用法與CPC.ARRAY.UPDATE一致。

選項

  • key:Key名稱(TairCpc資料結構),用於指定命令調用的TairCpc對象。

  • timestamp:指定的Unix時間戳記,單位為毫秒。

  • item:待添加的資料。

  • EX:指定key的相對到期時間,單位為秒,不傳此參數表示不到期。

  • EXAT:指定key的絕對到期時間(Unix時間戳記),單位為秒,不傳此參數表示不到期。

  • PX:指定key的相對到期時間,單位為毫秒,不傳此參數表示不到期。

  • PXAT:指定key的絕對到期時間(Unix時間戳記),單位為毫秒 ,不傳此參數表示不到期。

  • SIZE:時間視窗個數,預設為10,範圍為[1,1000],建議設定在120以內。

  • WIN:時間視窗的長度(單位為毫秒),預設為60000毫秒(1分鐘)。

傳回值

  • 執行成功:返回目標時間視窗更新後的估算值。

  • 其它情況返回相應的異常資訊。

樣本

命令樣本:

CPC.ARRAY.UPDATE2EST foo 1645584530000 f3

返回樣本:

"3"

CPC.ARRAY.UPDATE2JUD

類別

說明

文法

CPC.ARRAY.UPDATE2JUD key timestamp item [EX|EXAT|PX|PXAT time] [SIZE size] [WIN window_length]

時間複雜度

O(1)

命令描述

在指定TairCpc中,向目標timestamp對應的時間視窗添加item,並返回該時間視窗更新後的基數估算值和其與更新前的差值。若返回的差值為1,則表示寫入成功且不存在重複;若為0則表示已存在當前item。若TairCpc不存在則自動建立,建立參數用法與CPC.ARRAY.UPDATE一致。

選項

  • key:Key名稱(TairCpc資料結構),用於指定命令調用的TairCpc對象。

  • timestamp:指定的Unix時間戳記,單位為毫秒。

  • item:待添加的資料。

  • EX:指定key的相對到期時間,單位為秒,不傳此參數表示不到期。

  • EXAT:指定key的絕對到期時間(Unix時間戳記),單位為秒,不傳此參數表示不到期。

  • PX:指定key的相對到期時間,單位為毫秒,不傳此參數表示不到期。

  • PXAT:指定key的絕對到期時間(Unix時間戳記),單位為毫秒 ,不傳此參數表示不到期。

  • SIZE:時間視窗個數,預設為10,範圍為[1,1000],建議設定在120以內。

  • WIN:時間視窗的長度(單位為毫秒),預設為60000毫秒(1分鐘)。

傳回值

  • 執行成功:返回目標時間視窗更新後的估算值和該值與更新前的差值。

  • 其它情況返回相應的異常資訊。

樣本

命令樣本:

CPC.ARRAY.UPDATE2JUD foo 1645584530000 f7

返回樣本:

1) "8"            // 更新後,TairCpc的估算值為8。
2) "1"            // 8 - 7 = 1