Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Redis

RedisTimeSeries 1.6 Phát Hành: Tính Năng Mới Cho Chuỗi Thời Gian Hiệu Suất Cao

Hôm nay, chúng tôi vui mừng thông báo Sẵn Sàng Tổng Quát (General Availability) của RedisTimeSeries 1.6. Bài đăng blog này chi tiết các tính năng chính mới hiện đã có sẵn.

Giới Thiệu RedisTimeSeries

RedisTimeSeries là một cấu trúc dữ liệu chuỗi thời gian (time-series data structure) hiệu suất cao, ưu tiên bộ nhớ (memory-first) cho Redis. RedisTimeSeries hỗ trợ đa thuê (multi-tenancy) chuỗi thời gian (nó có thể giữ nhiều chuỗi thời gian cùng lúc) và có thể phục vụ nhiều client truy cập các chuỗi thời gian này cùng lúc. Nó hiện cũng có sẵn như một phần của Redis Stack.

Các Tính Năng Chính Mới Trong RedisTimeSeries 1.6

  • Khả năng truy vấn nâng cao (Enhanced querying capabilities)
    • Tổng hợp chéo chuỗi thời gian (Cross-time series aggregations)
    • Lọc kết quả theo dấu thời gian hoặc giá trị mẫu (Filtering results by timestamp or sample value)
    • Chọn nhãn nào để truy xuất (Selecting which labels to retrieve)
    • Căn chỉnh bucket tổng hợp (Aligning aggregation buckets)
    • Xóa mẫu (Deleting samples)
  • Hiệu suất cải thiện (Improved performance)
  • Thông báo keyspace (Keyspace notifications)
  • Hỗ trợ Redis Enterprise cho Redis on Flash

Khả Năng Truy Vấn Nâng Cao

Tổng Hợp Chéo Chuỗi Thời Gian (Cross-time series aggregations)

Trước phiên bản 1.6, chỉ có một loại tổng hợp (aggregation) là có thể:

  • Đối với một chuỗi thời gian đơn lẻ — tổng hợp các mẫu trên các khung thời gian equidurational (cùng độ dài).

Kể từ phiên bản 1.6, hai loại tổng hợp mới là có thể:

  • Đối với nhiều chuỗi thời gian — tổng hợp các mẫu có dấu thời gian bằng nhau (equal timestamps) trên tập hợp các chuỗi thời gian.
  • Đối với nhiều chuỗi thời gian — Trước tiên, tổng hợp mỗi chuỗi thời gian trên các khung thời gian equidurational, sau đó, cho mỗi khung thời gian, tổng hợp kết quả trên tập hợp các chuỗi thời gian.

Hãy chứng minh loại tổng hợp mới đầu tiên. Trước hết, hãy tạo hai cổ phiếu (stocks), và thêm giá của chúng tại 3 dấu thời gian khác nhau:

TS.CREATE stock:A LABELS type stock name A
TS.CREATE stock:B LABELS type stock name B
TS.MADD stock:A 1000 100 stock:A 1010 110 stock:A 1020 120
TS.MADD stock:B 1000 120 stock:B 1010 110 stock:B 1020 100

Bây giờ, chúng ta có thể truy xuất giá cổ phiếu tối đa (maximal stock price) cho mỗi dấu thời gian:

redis:6379> TS.MRANGE - + WITHLABELS FILTER type=stock GROUPBY type REDUCE max

1) 1) "type=stock"
 2) 1) 1) "type"
 2) "stock"
 2) 1) "__reducer__"
 2) "max"
 3) 1) "__source__"
 2) "stock:A,stock:B"
 3) 1) 1) (integer) 1000
 2) 120
 2) 1) (integer) 1010
 2) 110
 3) 1) (integer) 1020
 2) 120

Mệnh đề

FILTER type=stock
chỉ để lại cho chúng ta một chuỗi thời gian đơn lẻ đại diện cho giá cổ phiếu. Mệnh đề
GROUPBY type REDUCE max
chia chuỗi thời gian thành các nhóm với các giá trị type giống nhau, và sau đó, cho mỗi dấu thời gian, tổng hợp tất cả các chuỗi chia sẻ cùng giá trị type sử dụng bộ tổng hợp max (max aggregator).

FILTER label=value
được hỗ trợ bởi TS.MRANGE và TS.MREVRANGE. Các mệnh đề lọc bổ sung cũng được hỗ trợ (xem tài liệu).

Tiếp theo, chúng ta sẽ chứng minh loại tổng hợp mới thứ hai:

Trước hết, hãy tạo hai cổ phiếu, và thêm giá của chúng tại 9 dấu thời gian khác nhau.

TS.CREATE stock:A LABELS type stock name A
TS.CREATE stock:B LABELS type stock name B
TS.MADD stock:A 1000 100 stock:A 1010 110 stock:A 1020 120
TS.MADD stock:B 1000 120 stock:B 1010 110 stock:B 1020 100
TS.MADD stock:A 2000 200 stock:A 2010 210 stock:A 2020 220
TS.MADD stock:B 2000 220 stock:B 2010 210 stock:B 2020 200
TS.MADD stock:A 3000 300 stock:A 3010 310 stock:A 3020 320
TS.MADD stock:B 3000 320 stock:B 3010 310 stock:B 3020 300

Bây giờ, cho mỗi cổ phiếu, chúng ta sẽ tính giá cổ phiếu trung bình cho mỗi khung thời gian 1000 mili-giây, và sau đó truy xuất cổ phiếu có

trung bình tối đa cho khung thời gian đó:

redis:6379> TS.MRANGE - + WITHLABELS AGGREGATION avg 1000 FILTER type=stock GROUPBY type REDUCE max
1) 1) "type=stock"
 2) 1) 1) "type"
 2) "stock"
 2) 1) "__reducer__"
 2) "max"
 3) 1) "__source__"
 2) "stock:A,stock:B"
 3) 1) 1) (integer) 1000
 2) 110
 2) 1) (integer) 2000
 2) 210
 3) 1) (integer) 3000
 2) 310

GROUPBY label REDUCE reducer
được hỗ trợ bởi TS.MRANGE và TS.MREVRANGE.

Reducer có thể là sum, min hoặc max.

Lọc Kết Quả Theo Dấu Thời Gian Hoặc Giá Trị Mẫu

Khi sử dụng TS.RANGE, TS.REVRANGE, TS.MRANGE và TS.MREVRANGE, bạn không luôn muốn truy xuất hoặc tổng hợp tất cả các mẫu.

Sử dụng

[FILTER_BY_TS ts...]
bạn có thể lọc mẫu bằng một danh sách các dấu thời gian cụ thể.

Sử dụng

[FILTER_BY_VALUE min max]
bạn có thể lọc mẫu bằng giá trị tối thiểu và tối đa.

Xem xét, ví dụ, một chỉ số lấy mẫu (sampled metric) nơi các giá trị bình thường nằm giữa -100 và 100, nhưng giá trị 9999 được dùng làm chỉ báo của phép đo xấu (bad measurement).

TS.CREATE temp:TLV LABELS type temp location TLV
TS.MADD temp:TLV 1000 30 temp:TLV 1010 35 temp:TLV 1020 9999
temp:TLV 1030 40

Bây giờ, hãy truy xuất tất cả các giá trị, bỏ qua các giá trị ngoài phạm vi:

TS.RANGE temp:TLV - + FILTER_BY_VALUE -100 100

Hãy cũng truy xuất giá trị trung bình, bỏ qua các giá trị ngoài phạm vi:

TS.RANGE temp:TLV - + FILTER_BY_VALUE -100 100 AGGREGATION avg 1000

Chọn Nhãn Cần Truy Xuất

Khi sử dụng TS.MRANGE, TS.MREVRANGE và TS.MGET, chúng ta không luôn muốn giá trị của tất cả các nhãn liên kết với các chuỗi thời gian khớp, mà chỉ muốn giá trị của các nhãn được chọn.

SELECTED_LABELS
cho phép chọn nhãn nào để truy xuất. Cho các chuỗi thời gian và dữ liệu sau:

TS.CREATE temp:TLV LABELS type temp location TLV
TS.MADD temp:TLV 1000 30 temp:TLV 1010 35 temp:TLV 1020 9999
temp:TLV 1030 40

Để lấy tất cả các nhãn liên kết với chuỗi thời gian khớp, chúng ta sẽ dùng

WITHLABELS
:

redis:6379> TS.MGET WITHLABELS FILTER type=temp
1) 1) "temp:TLV"
 2) 1) 1) "type"
 2) "temp"
 2) 1) "location"
 2) "TLV"
 3) 1) (integer) 1030
 2) 40

Nhưng giả sử chúng ta chỉ muốn location (vị trí), chúng ta có thể dùng

SELECTED_LABELS:

redis:6379> TS.MGET SELECTED_LABELS location FILTER type=temp
1) 1) "temp:TLV"
 2) 1) 1) "location"
 2) "TLV"
 3) 1) (integer) 1030
 2) 40

Căn Chỉnh Bucket Tổng Hợp (Aligning Aggregation Buckets)

Giả sử chúng ta muốn nhận nhiệt độ trung bình hàng ngày, nhưng 'ngày' của chúng ta bắt đầu lúc 06:00. Trong trường hợp này, chúng ta muốn CĂN CHỈNH (ALIGN) các khoảng (intervals) đến 06:00 đến 05:59, thay vì 00:00 đến 23:59.

Khi sử dụng TS.RANGE, TS.REVRANGE, TS.MRANGE và TS.MREVRANGE, giờ có thể căn chỉnh các bucket tổng hợp với thời gian bắt đầu, kết thúc hoặc dấu thời gian cụ thể được yêu cầu — sử dụng

ALIGN
.

Để chứng minh căn chỉnh, hãy thêm dữ liệu sau:

TS.CREATE stock:A LABELS type stock name A
TS.MADD stock:A 1000 100 stock:A 1010 110 stock:A 1020 120
TS.MADD stock:A 1030 200 stock:A 1040 210 stock:A 1050 220
TS.MADD stock:A 1060 300 stock:A 1070 310 stock:A 1080 320

Tiếp theo, chúng ta sẽ tổng hợp mà không dùng

ALIGN
(có nghĩa là căn chỉnh mặc định: 0)

redis:6379> TS.RANGE stock:A - + AGGREGATION min 20
1) 1) (integer) 1000
 2) 100
2) 1) (integer) 1020
 2) 120
3) 1) (integer) 1040
 2) 210
4) 1) (integer) 1060
 2) 300
5) 1) (integer) 1080
 2) 320

Và bây giờ với

ALIGN
:

redis:6379> TS.RANGE stock:A – + ALIGN 10 AGGREGATION min 20
1) 1) (integer) 990
 2) 100
2) 1) (integer) 1010
 2) 110
3) 1) (integer) 1030
 2) 200
4) 1) (integer) 1050
 2) 220
5) 1) (integer) 1070
 2) 310

Thiết lập

ALIGN
thành 10 có nghĩa là một bucket nên bắt đầu tại thời gian 10, và tất cả các bucket (mỗi cái với độ dài 20 mili-giây) được căn chỉnh tương ứng.

Khi dấu thời gian bắt đầu cho truy vấn phạm vi được nêu rõ ràng (không phải '-'), cũng có thể thiết lập ALIGN thành thời gian đó bằng cách thiết lập align thành '-' hoặc '

start
'.

redis:6379> TS.RANGE stock:A 5 + ALIGN – AGGREGATION min 20
1) 1) (integer) 985
 2) 100
2) 1) (integer) 1005
 2) 110
3) 1) (integer) 1025
 2) 200
4) 1) (integer) 1045
 2) 220
5) 1) (integer) 1065
 2) 310

Tương tự, khi dấu thời gian kết thúc cho truy vấn phạm vi được nêu rõ ràng (không phải '+'), cũng có thể thiết lập

ALIGN
thành thời gian đó bằng cách thiết lập align thành '+' hoặc 'end'.

Xóa Mẫu (Deleting Samples)

TS.DEL cho phép xóa mẫu trong một chuỗi thời gian cho trước trong hai dấu thời gian.

Ví dụ,

TS.DEL stock:A 1020 1050
sẽ xóa tất cả các mẫu với dấu thời gian giữa 1020 và 1050 (bao gồm cả hai đầu). Giá trị trả về là số mẫu bị xóa.

Hiệu Suất Cải Thiện

Nhiều tối ưu hóa đã được triển khai, và hầu hết các truy vấn bây giờ sẽ thực thi nhanh hơn nhiều so với RedisTimeSeries 1.4.

Bảng sau chi tiết số lượng truy vấn mỗi giây đạt được trên một nút đơn lẻ, cho các truy vấn TSBS (mà chúng tôi mô tả ở đây). Bảng chỉ liệt kê tập con các truy vấn TSBS được hỗ trợ trong phiên bản 1.4.

Loại truy vấn 1.4
queries/sec
v1.6
queries/sec
% thay đổi (cao hơn-tốt hơn)
tsbs-scale100_cpu-max-all-1 1388 1500 8.07%
tsbs-scale100_double-groupby-1 100 108 8.00%
tsbs-scale100_groupby-orderby-limit 793 1282 61.66%
tsbs-scale100_single-groupby-1-1-1 13448 21347 58.74%
tsbs-scale100_single-groupby-1-1-12 2383 3921 64.54%

Chúng ta có thể quan sát sự cải thiện 8% đến 65% trong số lượng truy vấn mỗi giây, so với RedisTimeSeries 1.4.

Thông Báo Keyspace (Keyspace Notifications)

Thông báo Keyspace của Redis cho phép client Redis đăng ký (subscribe) các kênh Pub/Sub để nhận các sự kiện ảnh hưởng đến tập dữ liệu Redis theo một cách nào đó. Ví dụ, bạn có thể dùng RedisGears để kích hoạt một function với các thông báo này.

Là một ví dụ, có thể thực hiện một bộ dự đoán chuỗi thời gian (time series predictor) hoặc bộ phát hiện bất thường (anomaly detector) lắng nghe luồng mẫu và tạo ra dự đoán và cảnh báo thời gian thực.
Kiểm tra, ví dụ, bài kiểm tra này đăng ký các lệnh RedisTimeSeries khác nhau và tạo ra sự kiện.

Hỗ Trợ Redis Enterprise Cho Redis On Flash

Kể từ phiên bản 1.6, RedisTimeSeries có thể chạy trong Redis on Flash, nhưng quan trọng cần lưu ý rằng RoF được triển khai ở cấp độ khóa (key level). Nghĩa là, giá trị của toàn bộ chuỗi thời gian sống hoặc trên FLASH hoặc RAM.

RedisTimeSeries Là Một Phần Của Redis Stack

RedisTimeSeries hiện là một phần của Redis Stack. Bạn có thể tải xuống các bản nhị phân (binaries) Redis Stack Server mới nhất cho macOS, Ubuntu hoặc Redhat, hoặc cài đặt chúng với Docker, Homebrew hoặc Linux.

Hình Dung Dữ Liệu Chuỗi Thời Gian Với RedisInsight

RedisInsight là một công cụ trực quan cho nhà phát triển cung cấp một cách tuyệt vời để khám phá dữ liệu từ RedisTimeSeries trong quá trình phát triển sử dụng Redis hoặc Redis Stack.

Bạn có thể thực thi truy vấn chuỗi thời gian và quan sát kết quả trực tiếp từ giao diện người dùng đồ họa (GUI). RedisInsight hiện có thể hình dung kết quả truy vấn RedisTimeSeries.

Thêm vào đó, RedisInsight chứa các hướng dẫn nhanh (quick guides) và hướng dẫn (tutorials) để học RedisTimeSeries một cách tương tác (interactively).

Tìm hiểu thêm về RedisTimeSeries trên redis.io và developer.redis.com.