Redis ZSCAN

Redis Zscan



Lặp lại các thành viên của một tập hợp đã sắp xếp

Như các bạn đã biết, các tập hợp được sắp xếp của Redis có nguồn gốc từ các tập hợp thông thường trong đó mỗi thành viên được sắp xếp theo giá trị điểm của nó theo thứ tự tăng dần. Nếu hai hoặc nhiều thành viên có cùng giá trị điểm, chúng được sắp xếp theo thứ tự từ vựng. Thông thường, các thành viên và điểm số có thể được lấy trực tiếp bằng lệnh ZRANGE. Khi bạn có một tập hợp được sắp xếp lớn với hàng nghìn thành viên, lệnh ZRANGE có thể chặn máy chủ trong một thời gian dài giống như lệnh SMEMBERS và KEYS, đây là một nhược điểm. Vì vậy, Redis đưa ra một lệnh đặc biệt được gọi là ZSCAN có nguồn gốc từ lệnh SCAN để lặp lại các thành viên của một tập hợp đã được sắp xếp. Vì lệnh ZSCAN kế thừa từ lệnh SCAN nên hầu như tất cả các hành vi đều giống với lệnh SCAN mục đích chung.







Như trong hình đã cho, lệnh SCAN là một trình lặp dựa trên con trỏ. Do đó, cần một hoặc nhiều lần lặp lại để cung cấp tất cả các mục của bộ sưu tập Redis. Vì lệnh ZSCAN kế thừa từ lệnh SCAN mẹ nên hoạt động vẫn giống nhau. Trong hướng dẫn này, cú pháp và các trường hợp sử dụng của lệnh ZSCAN sẽ được thảo luận chi tiết.



Lệnh ZSCAN

Lệnh ZSCAN là một trình lặp dựa trên con trỏ bắt đầu lặp với con trỏ thứ 0. Sau đó, trong mỗi lần lặp, nó trả về không hoặc nhiều thành viên tập hợp được sắp xếp cùng với con trỏ tiếp theo sẽ được sử dụng làm con trỏ cho lệnh gọi lệnh sau. Nếu con trỏ trả về là 0 sau một hoặc nhiều lần lặp, điều đó có nghĩa là quá trình quét đã kết thúc. Tất cả các thành viên tập hợp đã sắp xếp được trả về tại thời điểm này. Quá trình này được gọi là một lần lặp đầy đủ. Như bạn có thể thấy, lệnh ZSCAN chỉ giữ trạng thái của nó bằng cách sử dụng con trỏ dẫn đến nhận thức về trạng thái hạn chế. Do đó, những hạn chế sau đây có liên quan đến lệnh ZSCAN.



  • Phần tử giống nhau có thể trả về nhiều lần lặp lại.
  • Nếu một thành viên không có mặt khi bắt đầu quá trình quét, có khả năng không trả lại thành viên đó trong một lần lặp lại đầy đủ.

Ngoài ra, không có gì đảm bảo về số lượng các thành viên được trả lại. Trong một số trường hợp, nếu tập hợp đã sắp xếp là rất nhỏ, tất cả các thành viên có thể được trả về ngay trong lần lặp đầu tiên. Bởi vì Redis sử dụng định dạng mã hóa đóng gói phân bổ đơn đặc biệt để giữ các thành viên cho đến khi đạt đến số lượng mặt hàng tối đa. Lệnh ZSCAN chỉ có thể trả về một con trỏ nếu cấu trúc dữ liệu được quét được biểu diễn dưới dạng bảng băm.





Cú pháp:
Lệnh ZSCAN sử dụng cú pháp gần như giống với lệnh SCAN ngoại trừ việc nó chấp nhận một khóa tập hợp được sắp xếp làm đối số đầu tiên. Cú pháp lệnh với các đối số cho phép như sau:

ZSCAN sorted_set_key con trỏ [ MATCH mẫu ] [ COUNT thành viên_count ]

sorted_set_key : Khoá của tập hợp đã sắp xếp.
con trỏ : Giá trị con trỏ bắt đầu từ 0 và kết thúc bằng 0 nếu nó là một lần lặp đầy đủ.



Các đối số sau là tùy chọn:

CUỘC THI ĐẤU : Một mẫu để khớp khi truy xuất các phần tử trong mỗi lần lặp. Chỉ các thành viên phù hợp được trả lại.
ĐẾM : Số lượng thành viên gần đúng được trả về trong mỗi lần lặp.

Tập kết quả trả về cho mỗi lần lặp có chứa một vài phần tử. Phần đầu tiên là một số nguyên không dấu 64-bit đại diện cho con trỏ sẽ được chuyển vào lần gọi tiếp theo. Phần tiếp theo là một mảng các thành viên và điểm số liên quan.

Trường hợp sử dụng 1 - Lấy tất cả các thành viên và các nhiệm vụ đã hoàn thành của họ trong một trò chơi trực tuyến

Giả sử rằng một công ty trò chơi trực tuyến duy trì bảng xếp hạng bằng cách sử dụng tập hợp được sắp xếp của Redis. Vì người dùng lớn đang tích cực chơi trò chơi, họ cần một cách để lấy từng người chơi và điểm số liên quan của họ là số nhiệm vụ đã hoàn thành. Đó là điều bắt buộc để thực hiện truy xuất mà không chặn máy chủ. Vì vậy, khuyến nghị là sử dụng lệnh ZSCAN như sau:

Đầu tiên, chúng tôi tạo một nhóm được sắp xếp với một số người chơi và số nhiệm vụ đã hoàn thành.

zadd LeaderBoard 12 Người chơi 6: John 4 Người chơi 2: Mary 22 Người chơi 1: Patel mười lăm Người chơi: mười một 23 Người chơi 5: Ann 30 Người chơi 7: Khắc nghiệt 23 Người chơi 12: abby hai Người chơi 13: Nicky 6 Người chơi 9: Jeremy 7 Người chơi 45: Kina

Bây giờ, chúng ta có thể lặp lại các thành viên của tập hợp đã sắp xếp như sau:

zscan LeaderBoard 0

Đầu ra:

Giá trị con trỏ là 0 trong tập kết quả trả về có nghĩa là tất cả các thành viên được trả về khi kết thúc lần lặp đầu tiên. Trong trường hợp này, vì số lượng thành viên ít, Redis đại diện cho các thành viên này bằng cách sử dụng mã hóa đóng gói phân bổ đơn. Do đó, cho đến khi đạt đến kích thước gói hoặc số lượng thành viên tối đa, lệnh sẽ trả về tất cả các thành viên trong tập hợp đã sắp xếp. Đây được gọi là một lần lặp đầy đủ. Bởi vì vào cuối lần lặp đầu tiên, chúng tôi nhận được tất cả mười thành viên và điểm số của họ. Nếu chúng ta có hàng trăm thành viên, nó được biểu diễn dưới dạng bảng băm trong bộ nhớ. Vì vậy, cần nhiều lần lặp lại để trả về tất cả các thành viên.

Tham số COUNT có thể được sử dụng để giới hạn số lượng thành viên được trả về trong một lần lặp. Theo mặc định, đối số này được đặt thành 10. Nếu tập hợp đã sắp xếp bao gồm hàng trăm thành viên, thì nó được biểu diễn bằng một bảng băm trong bộ nhớ. Vì vậy, số lượng thành viên được trả về là khoảng mười thành viên cho mỗi lần lặp. Giá trị của đối số COUNT bị bỏ qua nếu tập hợp được sắp xếp quá nhỏ.

Trường hợp sử dụng 2 - Tìm nạp người chơi Tên của họ bắt đầu bằng chữ cái “J”

Lệnh ZSCAN có thể được sử dụng để lọc ra các thành viên được trả về dựa trên sự khớp mẫu. Trong trường hợp đó, đối số MATCH phải được chỉ định.

Hãy sử dụng cùng một ví dụ từ trường hợp sử dụng trước. Yêu cầu là tìm nạp những người chơi có tên bắt đầu bằng chữ cái “J”. Nó chỉ là để thực hiện các tính năng thú vị tiếp theo liên quan đến trò chơi. Đối số MATCH có thể được chỉ định như sau:

zscan LeaderBoard 0 cuộc thi đấu * J *

Điều này lý tưởng nhất sẽ trả về hai thành viên có tên là Jeremy và John.

Sự kết luận

Tóm lại, lệnh ZSCAN được sử dụng để lặp lại các thành viên và điểm số của một tập hợp được sắp xếp của Redis. Lệnh này hoạt động giống như lệnh SCAN, ngoại trừ lệnh ZSCAN chấp nhận khóa đặt làm đối số đầu tiên. Như đã thảo luận trong các trường hợp sử dụng, lệnh ZSCAN có thể được sử dụng theo nhiều cách khác nhau bằng cách chỉ định các đối số MATCH và COUNT nơi bạn có thể truy xuất các thành viên và điểm số liên quan phù hợp với một mẫu cụ thể và giới hạn số lượng thành viên trả về cho mỗi lần lặp. Nhìn chung, lệnh ZSCAN có thể hữu ích khi truy xuất các thành viên của một tập hợp đã được sắp xếp mà không chặn máy chủ hoặc máy khách.