Có, các tập hợp được sắp xếp rất nhanh và mạnh mẽ. Chúng có vẻ phù hợp hơn nhiều cho các yêu cầu của bạn so với SORT
các hoạt động. Sự phức tạp về thời gian thường bị hiểu nhầm. O (log (N)) rất nhanh và tỷ lệ cân bằng tốt. Chúng tôi sử dụng nó cho hàng chục triệu thành viên trong một tập hợp được sắp xếp. Việc truy xuất và chèn là dưới mili giây.
Sử dụng ZRANGEBYSCORE key min max WITHSCORES [LIMIT offset count]
để nhận được kết quả của bạn.
Tùy thuộc vào cách bạn lưu trữ dấu thời gian dưới dạng 'điểm số', ZREVRANGEBYSCORE có thể tốt hơn.
Một nhận xét nhỏ về dấu thời gian:Tập hợp đã sắp xếp SCORES
không cần phần thập phân phải sử dụng 15 chữ số trở xuống. Vì vậy, SCORE
phải ở trong khoảng -999999999999999 đến 99999999999999999. Lưu ý:Các giới hạn này tồn tại vì máy chủ Redis thực sự lưu trữ điểm (float) dưới dạng đại diện chuỗi redis trong nội bộ.
Do đó, tôi đề xuất định dạng này, được chuyển đổi thành Giờ Zulu:-20140313122802 để có độ chính xác thứ hai. Bạn có thể thêm 1 chữ số để có độ chính xác 100ms, nhưng không cần thêm nếu bạn không muốn mất độ chính xác. Tuy nhiên, nó vẫn là float64, vì vậy, việc mất độ chính xác có thể ổn trong một số trường hợp, nhưng trường hợp của bạn phù hợp với phạm vi 'độ chính xác hoàn hảo', vì vậy đó là điều tôi khuyên bạn nên sử dụng.
Nếu dữ liệu của bạn hết hạn trong vòng 10 năm, bạn cũng có thể bỏ qua ba chữ số đầu tiên (CCY của CCYY), để đạt được độ chính xác .0001 giây.
Tôi đề xuất điểm âm ở đây, vì vậy bạn có thể sử dụng ZRANGEBYSCORE
đơn giản hơn thay vì REV
một. Bạn có thể sử dụng -inf
làm điểm bắt đầu (trừ đi vô cùng) và LIMIT 0 100
để nhận được 100 kết quả hàng đầu.
Hai tập hợp được sắp xếp members
(hoặc 'keys'
nhưng điều đó không rõ ràng vì bản thân tập hợp được sắp xếp cũng là một khóa) có thể chia sẻ score
, không thành vấn đề, kết quả trong một score
giống hệt nhau theo thứ tự bảng chữ cái.
Hy vọng điều này sẽ hữu ích, TW
Chỉnh sửa sau khi trò chuyện
OP muốn thu thập dữ liệu (sử dụng ZSET
) từ các khóa khác nhau (GET
/ SET
hoặc HGET
/ HSET
phím). JOIN
có thể làm điều đó cho bạn, ZRANGEBYSCORE
Không thể. Cách ưa thích để làm điều này, là một tập lệnh Lua đơn giản. Tập lệnh Lua được thực thi trên máy chủ. Trong ví dụ dưới đây, tôi sử dụng EVAL
để đơn giản, trong quá trình sản xuất, bạn sẽ sử dụng SCRIPT EXISTS
, SCRIPT LOAD
và EVALSHA
. Hầu hết các thư viện khách hàng đều tích hợp sẵn một số logic kế toán, vì vậy bạn không phải tải tập lệnh lên mỗi lần.
Đây là example.lua
:
local r={}
local zkey=KEYS[1]
local a=redis.call('zrangebyscore', zkey, KEYS[2], KEYS[3], 'withscores', 'limit', 0, KEYS[4])
for i=1,#a,2 do
r[i]=a[i+1]
r[i+1]=redis.call('get', a[i])
end
return r
Bạn sử dụng nó như thế này (ví dụ thô, không được mã hóa cho hiệu suất) :
redis-cli -p 14322 set activity:1 act1JSON
redis-cli -p 14322 set activity:2 act2JSON
redis-cli -p 14322 zadd feed 1 activity:1
redis-cli -p 14322 zadd feed 2 activity:2
redis-cli -p 14322 eval '$(cat example.lua)' 4 feed '-inf' '+inf' 100
Kết quả:
1) "1"
2) "act1JSON"
3) "2"
4) "act2JSON"