TairCpc是基于CPC(Compressed Probability Counting)壓縮算法開發的數據結構,支持僅占用很小的內存空間對采樣數據進行高性能計算。
背景信息
在大數據實時決策場景中,通常會將業務日志流入實時計算系統完成計算,然后將計算結果存儲至在線存儲系統,最終由實時規則或決策系統進行決策,例如:
您可以利用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 時間范圍內的數據,超過該時間范圍的數據會被覆蓋、刪除。SIZE 和WIN 屬性僅在新建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數據。 |
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時間戳),單位為毫秒 ,不傳此參數表示不過期。
|
返回值 | |
示例 | 命令示例: CPC.UPDATE foo f1 EX 3600
返回示例: OK
|
CPC.ESTIMATE
類別 | 說明 |
語法 | CPC.ESTIMATE key
|
時間復雜度 | O(1) |
命令描述 | 獲取指定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時間戳),單位為毫秒 ,不傳此參數表示不過期。
|
返回值 | |
示例 | 命令示例: 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時間戳),單位為毫秒 ,不傳此參數表示不過期。
|
返回值 | |
示例 | 命令示例: 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 時間范圍內的數據,超過該時間范圍的數據會被覆蓋、刪除。SIZE 和WIN 屬性僅在新建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分鐘)。
|
返回值 | |
示例 | 命令示例: CPC.ARRAY.UPDATE foo 1645584510000 f1 SIZE 120 WIN 10000
返回示例: OK
|
CPC.ARRAY.ESTIMATE
類別 | 說明 |
語法 | CPC.ARRAY.ESTIMATE key timestamp
|
時間復雜度 | O(1) |
命令描述 | 獲取指定TairCpc中目標timestamp所在時間窗口的基數估算值。 |
選項 | |
返回值 | 執行成功:返回對應時間窗口的基數估算值。 其它情況返回相應的異常信息。
|
示例 | 命令示例: 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(含當前窗口)個時間窗口內,時間窗口合并、去重后的基數估算值。 |
選項 | |
返回值 | |
示例 | 命令示例: 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
|