2011-01-30 35 views

Trả lời

12

Tùy chọn duy nhất tôi nghĩ là đang lặp lại tập hợp được sắp xếp và tính toán phía máy khách tổng hợp.

+0

cảm ơn! Vâng, tôi đoán đây có lẽ là quá cụ thể của một tính năng cho Redis bận tâm thực hiện ... esp. vì tôi thậm chí không thể làm điều gì đó được khuyến khích. Tôi đang sử dụng tập hợp zset để lưu trữ id quà tặng đã nhận của người dùng và id người dùng gửi và SCORE là số lần cùng một món quà đã nhận được từ cùng một người gửi. Ví dụ: 'ZINCR 123: quà tặng 1" 3 | 345 "' gửi quà tặng id id 3 từ người dùng 345 đến người dùng 123. Vì vậy, tôi muốn nhận được tổng số quà tặng mà người dùng đã nhận được. Xem? Có lẽ có cách nào tốt hơn để thực hiện điều này? Nó giống như Facebook Gift API. Redis quy tắc! :) Cám ơn vì tất cả! – ma11hew28

3

Nếu các bộ là nhỏ, và bạn không cần hiệu suất sát thủ, tôi sẽ chỉ lặp lại (zrange/zrangebyscore) và tổng hợp các giá trị phía máy khách.

Nếu, mặt khác, bạn đang nói về hàng nghìn - hàng triệu mục, bạn luôn có thể giữ một bộ tham chiếu với tổng số đang chạy cho mỗi người dùng và tăng/giảm chúng khi quà tặng được gửi.

Vì vậy, khi bạn làm bạn ZINCR 123:gifts 1 "3|345", bạn có thể làm một lệnh ZINCR riêng biệt, mà có thể là một cái gì đó như thế này:

ZINCR received-gifts 1 <user_id> 

Sau đó, để có đượC# quà tặng nhận được cho một người dùng nào đó, bạn chỉ cần để chạy một ZSCORE:

ZSCORE received-gifts <user_id> 
+0

Tăng số lượt truy cập thắng cho các vấn đề trực tuyến. Quét chỉ nên được sử dụng trong các thuật toán ngoại tuyến, IMHO, vì không ai có thể dự đoán tăng trưởng trong tương lai. Câu trả lời này phải là câu trả lời được chấp nhận. Ồ, và btw: người ta có thể viết lệnh tùy chỉnh thực hiện cả hai (thêm vào bộ và tăng bộ đếm; cập nhật giá trị và điều chỉnh bộ đếm, xóa khỏi tập hợp & ...) –

5

Có sẵn vì Redis v2.6 là khả năng tuyệt vời nhất để thực thi các kịch bản lệnh Lua trên máy chủ Redis. Điều này làm cho thách thức trong việc tổng hợp điểm số một Sắp xếp Set để tầm thường:

local sum=0 
local z=redis.call('ZRANGE', KEYS[1], 0, -1, 'WITHSCORES') 

for i=2, #z, 2 do 
    sum=sum+z[i] 
end 

return sum 

Runtime dụ:

~$ redis-cli zadd z 1 a 2 b 3 c 4 d 5 e 
(integer) 5 
~$ redis-cli eval "local sum=0 local z=redis.call('ZRANGE', KEYS[1], 0, -1, 'WITHSCORES') for i=2, #z, 2 do sum=sum+z[i] end return sum" 1 z 
(integer) 15 
+2

Một lưu ý quan trọng là máy chủ Redis Các kịch bản lệnh lua chặn mọi thứ, có thể là một dealbreaker trong hầu hết các trường hợp. Nguồn: http://stackoverflow.com/a/30896608/2440 – Sire

1

Dưới đây là một kịch bản lua nhỏ mà duy trì tổng số điểm zset như bạn đi, trong một bộ đếm với khóa được gắn với '.ss'. Bạn có thể sử dụng nó thay vì ZADD.

local delta = 0 
for i=1,#ARGV,2 do 
    local oldScore = redis.call('zscore', KEYS[1], ARGV[i+1]) 
    if oldScore == false then 
     oldScore = 0 
    end 
    delta = delta - oldScore + ARGV[i] 
end 
local val = redis.call('zadd', KEYS[1], unpack(ARGV)) 
redis.call('INCRBY', KEYS[1]..'.ss', delta) 
+1

Tập lệnh đó không được tạo khóa trong lua ('KEYS [1] .. '. Ss'')," vi phạm mệnh đề lệnh EVAL như tất cả các phím mà tập lệnh sử dụng phải được chuyển bằng cách sử dụng mảng KEYS "- https://redis.io/commands/eval – Jonathan

+0

@ Jonathan bạn nói đúng, chìa khóa cho tổng số điểm cũng sẽ được chuyển trong KEYS [] – Patrick

Các vấn đề liên quan