복붙노트

[REDIS] 레디 스 : 목록 또는 정렬 된 세트의 뉴스 피드 밖으로 팬?

REDIS

레디 스 : 목록 또는 정렬 된 세트의 뉴스 피드 밖으로 팬?

나는 다음과 같은 방법으로 레디 스와 팬 아웃 뉴스 피드를 캐싱하고 있습니다 :

ID 값이 데이터 JSON 스트링 인 각 이송 작업 활동과 같은 키 / 값이다.

사용자 : 각 뉴스 피드 현재 목록입니다, 열쇠는 공급입니다 USER_ID 및 목록 관련 활동의 키가 포함되어 있습니다.

내가 예를 들어, 사용하는 뉴스 피드 검색 할 '종류의 공급 : 사용자 :로 USER_ID를 NOSORT GET * 제한 0 40'

나는 점수가 활동의 타임 스탬프, 공급은 항상 시간으로 정렬됩니다 이런 식으로하는 소트 세트에 대한 공급을 변경하는 것을 고려하고있다.

나는 http://arindam.quora.com/Redis-sorted-sets-and-lists-Pertaining-to-Newsfeed 때문에 정렬 된 세트의 시간 복잡도의 목록을 사용하는 것이 좋습니다있는 읽을 수 있지만 킵 사용 목록에서 내가 돌봐 줘야 삽입 순서, 과거의 이야기를 삽입하면 목록을 반복 할 필요 오른쪽 인덱스를 찾는 것은으로 밀어. (분산 환경에서 새로운 문제를 일으킬 수있다).

나는 목록을 계속 사용 또는 정렬 된 세트의 가야하나요?

, 정렬 된 세트에서 즉시 뉴스 피드를 검색 할 수있는 방법이 (정렬과 같은은 ... 목록은 * 명령을받을) 또는이 zrange해야 다음 결과를 반복하고 각 값을 받고 있습니까?

해결법

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

    1.예, 분류 세트는 매우 빠르고 강력하다. 그들은 정렬 작업보다는 사용자의 요구 사항에 대한 더 나은 일치를 보인다. 시간의 복잡성은 종종 오해한다. O (로그 (N))는 매우 빠르고, 비늘 잘. 우리는 하나의 정렬 된 세트에서 수십 회원의 수백만을 위해 사용합니다. 검색 및 삽입은 서브 밀리 초이다.

    예, 분류 세트는 매우 빠르고 강력하다. 그들은 정렬 작업보다는 사용자의 요구 사항에 대한 더 나은 일치를 보인다. 시간의 복잡성은 종종 오해한다. O (로그 (N))는 매우 빠르고, 비늘 잘. 우리는 하나의 정렬 된 세트에서 수십 회원의 수백만을 위해 사용합니다. 검색 및 삽입은 서브 밀리 초이다.

    사용 ZRANGEBYSCORE 키 분 최대 WITHSCORES [LIMIT 오프셋 카운트] 결과를 얻을 수 있습니다.

    당신은 '점수'와 타임 스탬프를 저장하는 방법에 따라 ZREVRANGEBYSCORE 더 좋을 수 있습니다.

    타임 스탬프에 대한 작은 말 : 조회 결과 순위는 소수점 이하 부분은 15 자리를 사용하여 이하해야하지 않아도 점수를 설정합니다. 점수의 범위에 머물 -999999999999999 999999999999999. 참고가 그래서 : 레디 스 서버가 실제로 내부적으로 레디 스 - 문자열 표현으로 점수 (플로트)를 저장하기 때문에 이러한 제한이 존재한다.

    두 번째 정밀도 -20140313122802 : 그래서 저는 줄루어 시간으로 변환이 형식을 권장합니다. 당신은 정밀도 손실을 원하지 않을 경우에는 더 이상 100ms의 정밀도 1 자리를 추가,하지만 수 있습니다. 정밀도의 손실이 상황에 따라 잘 될 수 있도록 그것은 여전히 ​​방식에 의한 float64,하지만 '완벽한 정밀'범위에서의 경우 적합은, 그래서 내가 추천 어떤 것을.

    데이터를 10 년 이내에 만료되면, 당신은 또한 0.0001 초 정밀도를 달성하기 위해 세 가지 첫째 자리 (CCYY의 CCY)을 건너 뛸 수 있습니다.

    당신은 간단 ZRANGEBYSCORE 대신 REV 하나를 사용할 수 있도록 내가 여기에 부정적인 점수를 제안한다. 당신은 최고 100 결과를 얻을 시작 점수 (마이너스 무한대)와 LIMIT 0 ~ 100으로 -inf 사용할 수 있습니다.

    두 멤버 소트 세트 (또는 '키를'하지만 소트 세트는 그 자체의 핵심이기 때문에 그 모호한) 아무 문제없는 점수, 동일한 점수에서 결과가 알파벳 있습니다를 공유 할 수 있습니다.

    이, TW 도움이되기를 바랍니다

    채팅 후 편집

    영업 이익은 서로 다른 키 (GET / SET 또는 HGET / HSET 키)에서 (A ZSET를 사용하여) 수집 데이터를 원했다. ZRANGEBYSCORE 수 없어, 당신을 위해 할 수있는 가입. 이 일을 선호하는 방법은 간단한 루아 스크립트입니다. 루아 스크립트는 서버에서 실행됩니다. 이 예에서 나는 생산에 당신은 SCRIPT이 존재 SCRIPT로드 및 EVALSHA을 사용, 단순화를 위해 EVAL을 사용하여 아래. 스크립트마다 업로드하지 않아도 대부분의 클라이언트 라이브러리가 내장 된 일부 회계 논리를 가지고있다.

    여기 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
    

    이 (성능 코딩하지 원시 예)처럼 사용

    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
    

    결과:

    1) "1"
    2) "act1JSON"
    3) "2"
    4) "act2JSON"
    
  2. from https://stackoverflow.com/questions/22375662/redis-fan-out-news-feeds-in-list-or-sorted-set by cc-by-sa and MIT license