복붙노트

[REDIS] 레디 스 : 소트 세트의 점수의 합

REDIS

레디 스 : 소트 세트의 점수의 합

설정 소트 레디 스에서 점수의 합을 얻을 수있는 가장 좋은 방법은 무엇입니까?

해결법

  1. ==============================

    1.내가 생각하는 유일한 옵션은 소트 세트를 반복하고 합계 클라이언트 측을 계산한다.

    내가 생각하는 유일한 옵션은 소트 세트를 반복하고 합계 클라이언트 측을 계산한다.

  2. ==============================

    2.레디 스의 V2.6 이후 사용 가능한 레디 스 서버에서 루아 스크립트를 실행하는 가장 멋진 기능입니다. 이것은 사소한에 소트 세트의 점수를 합산의 도전을 렌더링 :

    레디 스의 V2.6 이후 사용 가능한 레디 스 서버에서 루아 스크립트를 실행하는 가장 멋진 기능입니다. 이것은 사소한에 소트 세트의 점수를 합산의 도전을 렌더링 :

    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
    

    런타임 예 :

    ~$ 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
    
  3. ==============================

    3.단지 반복 처리 (zrange / zrangebyscore)과는 값 클라이언트 측 합계 세트가 작은, 당신은 살인자의 성능이 필요하지 않은 경우, 나는 것입니다.

    단지 반복 처리 (zrange / zrangebyscore)과는 값 클라이언트 측 합계 세트가 작은, 당신은 살인자의 성능이 필요하지 않은 경우, 나는 것입니다.

    반면에, 당신은 수천에 대해 이야기하는 경우 - 상품의 수백만, 당신은 항상 감소를 선물을 보내는으로 증가 / 실행하는 각 사용자에 대한 합계와 함께 기준 설정을 유지할 수 있습니다.

    그래서 당신이 할 때 ZINCR 123 : 선물 1 "3 | 345은"이 같은 될 수있는 별도의 ZINCR 명령을 할 수있는 :

    ZINCR received-gifts 1 <user_id>
    

    그런 다음, 특정 사용자에 대한받은 선물의 #을 얻기 위해, 당신은 단지 ZSCORE를 실행해야합니다 :

    ZSCORE received-gifts <user_id>
    
  4. ==============================

    4.여기 가서 키라는 접미어와 '.SS'와 카운터에서 ZSET 점수 합계를 유지하는 작은 루아 스크립트입니다. 대신 ZADD의 사용할 수 있습니다.

    여기 가서 키라는 접미어와 '.SS'와 카운터에서 ZSET 점수 합계를 유지하는 작은 루아 스크립트입니다. 대신 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)
    
  5. from https://stackoverflow.com/questions/4846243/redis-sum-of-scores-in-sorted-set by cc-by-sa and MIT license