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 時間範圍內的資料,超過該時間範圍的資料會被覆蓋、刪除。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
|