TairTS是基于Redis Module開發的時序數據結構,提供低時延、高并發的內存讀寫訪問,及快速地過濾、聚合查詢功能,集存儲與計算為一體,在簡化了處理時序數據流程的同時,大幅度提高了性能。
TairTS簡介
相比RedisTimeSeries,TairTS提供了更豐富的功能:
通過Pkey(額外一層Hash結構)結構,輕松實現Pkey級別(多時間線)聚合查詢。
例如您可以在foo(Pkey)中創建以各項指標名稱與設備ID命名的Skey,例如temperature:1、pressure:1、distance:1等,可通過TairTS自帶的EXTS.S.MRANGE命令輕松獲取設備ID為1的自定義監控信息,而使用RedisTimeSeries則需要在業務邏輯代碼中嵌入大量數據聚合運算才能實現該功能。
TairTS數據結構解析:
Pkey(一組時間線):TairTS數據結構,可包含多個Skey。
Skey(一條時間線):可包含多個固定容量的Chunk,每個Skey可設置不同的Label(標簽),可通過Label在海量數據中快速過濾目標Skey。
Chunk(數據塊):可存儲多個DataPoint。
Chunk的容量支持自定義,最多包含256個DataPoint。
Chunk為最小的過期單元,即單個Chunk中所有Datapoint都過期后才會刪除該Chunk。
DataPoint(時序數據):包含一個時間戳和一個value數據(double類型)。
支持降采樣、屬性過濾、分批查詢、多種數值函數等條件下的聚合操作,將批量查詢與聚合計算集成到單條命令中,減少網絡交互,實現毫秒級響應。
支持對歷史時序數據的更新或累加。
支持時間線級別的TTL設定,保證每條時間線都可以按時間窗口自動滾動。
采用高效的Gorilla壓縮算法與特定存儲,極大降低存儲成本。
典型場景
監控數據的存儲與計算
APM秒級監控
IoT(物聯網)數據分析與處理
限流風控
熱點消息的緩存
時間窗口函數
最佳實踐
前提條件
注意事項
操作對象為Tair實例中的TairTS數據。
TairTS的優勢為實時、高并發的寫入與查詢性能,缺陷為存儲容量有限,請合理設置TTL,及時淘汰過期數據。
為節省內存空間,關于設置
CHUNK_SIZE
的建議如下:若Skey(時間線)的平均數據點大于5,000個,設置
CHUNK_SIZE
為256(默認值)。若Skey(時間線)的平均數據點小于5,000個,設置
CHUNK_SIZE
為平均數據點個數 / 20。例如某Skey的平均數據點為1,000,可以設置CHUNK_SIZE
為50。
Breaking Change公告:
2024年07月22日發布Tair內存型(兼容Redis 6.0)24.7.0.0版本,該版本中新增了ts-auto-del-empty-skey-enable參數,默認為yes,表示當Skey中的所有數據點都過期時,會自動刪除Skey。但在Tair內存型(兼容Redis 6.0)24.7.0.0之前的版本中,默認不會刪除數據點已過期的Skey。
在Tair內存型(兼容Redis 6.0)實例使用TairTS前,建議將實例升級至24.7.0.0及以上版本,并確認、手動調整ts-auto-del-empty-skey-enable參數的策略,避免因默認行為的改變對業務產生影響。
命令列表
表 1. TairTS命令
類型 | 命令 | 語法 | 說明 |
基礎寫操作 |
| 創建一個新的Pkey(TairTS數據結構),若Pkey已存在則創建失敗。 | |
| 在指定的Pkey中創建一個Skey,若Pkey不存在則會自動創建,若Skey已經存在則創建失敗。 說明 您可以在創建Skey時設置其相關屬性,例如過期時間、是否開啟壓縮等。 | ||
| 修改指定Skey的元數據信息,當前僅支持修改過期時間(DATA_ET)。 | ||
| 向Skey中插入一條Datapoint數據。若Pkey或Skey不存在則會自動創建,屬性(過期時間、是否開啟壓縮等)僅在Skey不存在并自動創建的情況下生效。 | ||
| 在指定Pkey的多個Skey分中別插入一條Datapoint數據。若Pkey或Skey不存在則會自動創建,屬性(過期時間、是否開啟壓縮等)僅在Skey不存在并自動創建的情況下生效。 | ||
| 向Skey中插入一條Datapoint數據,該命令中的value將與Skey中最近Datapoint的value值相加實現遞增,也可以指定該命令中的value為負數實現遞減。若Pkey或Skey不存在則會自動創建,默認初始值為0,屬性(過期時間、是否開啟壓縮等)僅在Skey不存在并自動創建的情況下生效。 | ||
| 在指定Pkey的多個Skey分別插入一條Datapoint數據,該命令中的value將分別與各個Skey中最近Datapoint的value值相加實現遞增,也可以指定該命令中的value為負數實現相減。若Pkey或Skey不存在則會自動創建,默認初始值為0,屬性(過期時間、是否開啟壓縮等)僅在Skey不存在并自動創建的情況下生效。 | ||
| 刪除指定Pkey中的單個Skey,并刪除目標Skey中所有的Datapoint數據。 | ||
基礎讀操作 |
| 查詢指定Skey中最新的Datapoint數據。 | |
| 查詢指定Skey的元數據信息,包含Datapoint數量、最近Datapoint的時間戳與value值、Skey的標簽信息等信息。 | ||
| 在Pkey中自定義過濾條件(filter),查詢目標Skey。 | ||
聚合操作 |
| 在Skey中查詢指定時間內(包含指定時間點)的Datapoint數據。 | |
| 在Skey中自定義過濾條件(filter)與查詢時間點(包含指定時間點),查詢目標Datapoint數據。 | ||
| 在Pkey層級對符合過濾條件(filter)的Datapoint數據進行聚合,若您指定了Skey層級的聚合,則會優先進行Skey層級聚合(效果與EXTS.S.MRANGE命令相同),再從Pkey層級對第一次聚合結果進行二次聚合。 | ||
并發寫操作 |
| 修改指定Skey中Datapoint數據的value值。若Pkey或Skey不存在則會自動創建,屬性(過期時間、是否開啟壓縮等)僅在Skey不存在并自動創建的情況下生效。 | |
| 批量修改多個指定Skey中Datapoint數據的value值。若Pkey或Skey不存在則會自動創建,屬性(過期時間、是否開啟壓縮等)僅在Skey不存在并自動創建的情況下生效。 | ||
| 該命令中的value值會與指定Skey中Datapoint數據的value相加實現遞增,也可以指定該命令中的value為負數實現遞減。若Pkey或Skey不存在則會自動創建,默認初始值為0,屬性(過期時間、是否開啟壓縮等)僅在Skey不存在并自動創建的情況下生效。 | ||
| 批量修改多個指定Skey中Datapoint數據的value值,該命令中的value值會與指定Skey中Datapoint數據的value相加實現遞增,也可以指定該命令中的value為負數實現遞減。若Pkey或Skey不存在則會自動創建,屬性(過期時間、是否開啟壓縮等)僅在Skey不存在并自動創建的情況下生效。 | ||
通用 |
| 使用原生Redis的DEL命令可以刪除一條或多條TairTS數據。 |
本文的命令語法定義如下:
大寫關鍵字
:命令關鍵字。斜體
:變量。[options]
:可選參數,不在括號中的參數為必選。A|B
:該組參數互斥,請進行二選一或多選一。...
:前面的內容可重復。
EXTS.P.CREATE
類別 | 說明 |
語法 |
|
時間復雜度 | O(1) |
命令描述 | 創建一個新的Pkey(TairTS數據結構),若Pkey已存在則創建失敗。 |
選項 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
EXTS.S.CREATE
類別 | 說明 |
語法 |
|
時間復雜度 | O(1) |
命令描述 | 在指定的Pkey中創建一個Skey,若Pkey不存在則會自動創建,若Skey已經存在則創建失敗。 說明 您可以在創建Skey時設置其相關屬性,例如過期時間、是否開啟壓縮等。 |
選項 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
EXTS.S.ALTER
類別 | 說明 |
語法 |
|
時間復雜度 | O(1) |
命令描述 | 修改指定Skey的元數據信息,當前僅支持修改過期時間(DATA_ET)。 |
選項 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
EXTS.S.ADD
類別 | 說明 |
語法 |
|
時間復雜度 | O(1) |
命令描述 | 向Skey中插入一條Datapoint數據。若Pkey或Skey不存在則會自動創建,屬性(過期時間、是否開啟壓縮等)僅在Skey不存在并自動創建的情況下生效。 |
選項 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
EXTS.S.MADD
類別 | 說明 |
語法 |
|
時間復雜度 | O(n),其中n為keynumber。 |
命令描述 | 在指定Pkey的多個Skey分中別插入一條Datapoint數據。若Pkey或Skey不存在則會自動創建,屬性(過期時間、是否開啟壓縮等)僅在Skey不存在并自動創建的情況下生效。 |
選項 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
EXTS.S.INCRBY
類別 | 說明 |
語法 |
|
時間復雜度 | O(1) |
命令描述 | 向Skey中插入一條Datapoint數據,該命令中的value將與Skey中最近Datapoint的value值相加實現遞增,也可以指定該命令中的value為負數實現遞減。若Pkey或Skey不存在則會自動創建,默認初始值為0,屬性(過期時間、是否開啟壓縮等)僅在Skey不存在并自動創建的情況下生效。 |
選項 |
|
返回值 |
|
示例 | 提前執行 命令示例:
返回示例:
若此時執行
|
EXTS.S.MINCRBY
類別 | 說明 |
語法 |
|
時間復雜度 | O(n),其中n為keynumber。 |
命令描述 | 在指定Pkey的多個Skey分別插入一條Datapoint數據,該命令中的value將分別與各個Skey中最近Datapoint的value值相加實現遞增,也可以指定該命令中的value為負數實現相減。若Pkey或Skey不存在則會自動創建,默認初始值為0,屬性(過期時間、是否開啟壓縮等)僅在Skey不存在并自動創建的情況下生效。 |
選項 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
EXTS.S.DEL
類別 | 說明 |
語法 |
|
時間復雜度 | O(1) |
命令描述 | 刪除指定Pkey中的單個Skey,并刪除目標Skey中所有的Datapoint數據。 |
選項 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
EXTS.S.GET
類別 | 說明 |
語法 |
|
時間復雜度 | O(1) |
命令描述 | 查詢指定Skey中最新的Datapoint數據。 |
選項 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
EXTS.S.INFO
類別 | 說明 |
語法 |
|
時間復雜度 | O(1) |
命令描述 | 查詢指定Skey的元數據信息,包含Datapoint數量、最近Datapoint的時間戳與value值、Skey的標簽信息等信息。 |
選項 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
EXTS.S.QUERYINDEX
類別 | 說明 |
語法 |
|
時間復雜度 | O(n),其中n為過濾條件中的最大集合數。 |
命令描述 | 在Pkey中自定義過濾條件(filter),查詢目標Skey。 |
選項 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
EXTS.S.RANGE
類別 | 說明 |
語法 |
|
時間復雜度 | O(n),其中n為目標Datapoint的數據塊個數。 |
命令描述 | 在Skey中查詢指定時間內(包含指定時間點)的Datapoint數據。 |
選項 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
EXTS.S.MRANGE
類別 | 說明 |
語法 |
|
時間復雜度 | O(n),其中n為目標Datapoint的數據塊個數。 |
命令描述 | 在Skey中自定義過濾條件(filter)與查詢時間點(包含指定時間點),查詢目標Datapoint數據。 |
選項 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
EXTS.P.RANGE
類別 | 說明 |
語法 |
|
時間復雜度 | O(n),其中n為目標Datapoint的數據塊個數。 |
命令描述 | 在Pkey層級對符合過濾條件(filter)的Datapoint數據進行聚合,若您指定了Skey層級的聚合,則會優先進行Skey層級聚合(效果與EXTS.S.MRANGE命令相同),再從Pkey層級對第一次聚合結果進行二次聚合。 |
選項 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
EXTS.S.RAW_MODIFY
類別 | 說明 |
語法 |
|
時間復雜度 | O(1) |
命令描述 | 修改指定Skey中Datapoint數據的value值。若Pkey或Skey不存在則會自動創建,屬性(過期時間、是否開啟壓縮等)僅在Skey不存在并自動創建的情況下生效。 |
選項 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
EXTS.S.RAW_MMODIFY
類別 | 說明 |
語法 |
|
時間復雜度 | O(n),其中n為keynumber。 |
命令描述 | 批量修改多個指定Skey中Datapoint數據的value值。若Pkey或Skey不存在則會自動創建,屬性(過期時間、是否開啟壓縮等)僅在Skey不存在并自動創建的情況下生效。 |
選項 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
EXTS.S.RAW_INCRBY
類別 | 說明 |
語法 |
|
時間復雜度 | O(1) |
命令描述 | 該命令中的value值會與指定Skey中Datapoint數據的value相加實現遞增,也可以指定該命令中的value為負數實現遞減。若Pkey或Skey不存在則會自動創建,默認初始值為0,屬性(過期時間、是否開啟壓縮等)僅在Skey不存在并自動創建的情況下生效。 |
選項 |
|
返回值 |
|
示例 | 提前執行 命令示例:
返回示例:
若此時執行
|
EXTS.S.RAW_MINCRBY
類別 | 說明 |
語法 |
|
時間復雜度 | O(n),其中n為keynumber。 |
命令描述 | 批量修改多個指定Skey中Datapoint數據的value值,該命令中的value值會與指定Skey中Datapoint數據的value相加實現遞增,也可以指定該命令中的value為負數實現遞減。若Pkey或Skey不存在則會自動創建,屬性(過期時間、是否開啟壓縮等)僅在Skey不存在并自動創建的情況下生效。 |
選項 |
|
返回值 |
|
示例 | 命令示例:
返回示例:
|
索引過濾語法
您可以根據Skey的標簽(LABELS)過濾目標Skey。過濾條件(filter)的語法如下:
構造filter時,支持如下所有命令及組合使用,但必須存在EQ、CONTAINS、LIST_MATCH邏輯中的任意一個。
filter命令 | 說明 | 邏輯 |
| 標簽L等于V。 | EQ(equals) |
| 標簽L不為NULL, 即目標Skey包含標簽L。 | CONTAINS |
| 標簽L為v1或v2等。 | LIST_TMATCH |
| 標簽L不等于V。 | NOEQ(equals) |
| 標簽L為NULL, 即目標Skey不包含標簽L。 | NOCONTAINS |
| 標簽L不為v1和v2等。 | LIST_NOTMATCH |
聚合功能語法
聚合操作會對采集間隔(timeBucket)范圍內的數據進行聚合,支持如下聚合類型:
MAX
:最大值MIN
:最小值AVG
:平均值SUM
:求和FIRST
:第一個值LAST
:最后一個值RANGE
:范圍(最大值 - 最小值)COUNT
:value數量STD.P
:總體方差STD.S
:樣本方差VAR.P
:總體標準差VAR.S
:樣本標準差