Redis
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> Redis

Redis:đưa ra các nguồn cấp tin tức trong danh sách hoặc tập hợp được sắp xếp?

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 LOADEVALSHA . 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"



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Rails cách để biết một sidekiq worker đã được thực hiện xong với performance_async hay chưa

  2. MongoDB so với Redis và Cassandra cho giải pháp lưu trữ hàng tạm thời, ghi nhanh

  3. Tôi có nên tạo một ứng dụng Redis mới cho mỗi kết nối không?

  4. Redis:Để đặt thời gian chờ cho một cặp giá trị khóa trong Đặt

  5. Thư mục dữ liệu trong Redis ở đâu?