복붙노트

[REDIS] 레디 스 출장 소트 세트, 목록, 또는 대기열?

REDIS

레디 스 출장 소트 세트, 목록, 또는 대기열?

사람이 레디 스의 모든 종류의 출장 데이터 구조를 구현 했습니까? 나는 뉴스 피드 같은 건물에서 일하고 있어요. 피드는 조작되고 바람이 매우 자주에서 읽고, 레디 스의 정렬 된 세트에서 그것을 유지하는 것은 저렴 내 사용 사례에 대한 완벽 할 것입니다. 유일한 문제는 내가 오직 필요 N 피드 당 항목, 나는 각 피드가 n 개의 항목 위에 도착하지 수 있도록하고 싶습니다 그래서, 메모리 오버 플로우 걱정입니다. 루아와 레디 스에 덮인 분류 모음을 만들기 위해 아주 사소한 것 같다 :

redis-cli EVAL "$(cat update_feed.lua)" 1 feeds:some_feed "thing_to_add", n

어디 update_feed.lua이 (그것을 테스트하지 않고)과 같은 :

redis.call('ZADD', KEYS[1], os.time(), ARGV[1])
local num = redis.call('ZCARD', KEYS[1])
if num > ARGV[2]:
    redis.call('ZREMRANGEBYRANK', KEYS[1], -n, -inf)

그것은 전혀 나쁘지 않다, 꽤 저렴하지만,로 시작하는 경우에만 해당 버킷으로 소트 세트를 인스턴스화하여 훨씬 더 싸게 드리겠습니다 될 수 같은 기본적인 것처럼 보인다. 나는 레디 스에서 그렇게 할 수있는 방법을 찾을 수 없습니다 내 질문을 추측 그래서입니다 : 내가 뭔가를 그리워하고, 내가하지 않은 경우 왜 레디 스에서이에 대한 구조는 그냥 기본 루아를 실행하더라도이없는 한 스크립트 나는 그것이 레디 스 데이터 구조에 대한 옵션으로 구현되어야한다 그 전형적인 충분히 사용의 경우 것처럼 보인다, 기술?

해결법

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

    1.이 목록입니다 경우 LTRIM를 사용할 수 있습니다.

    이 목록입니다 경우 LTRIM를 사용할 수 있습니다.

    문서에서 발췌.

    LPUSH mylist someelement
    LTRIM mylist 0 99
    

    목록보다 큰 100 개 요소를 성장하지 않습니다 있는지 확인하면서 명령이 쌍 목록에 새로운 요소를 밀어 것입니다. 예를 들어 가게 로그에 레디 스를 사용할 때 매우 유용합니다. 또한 이러한 방법에서 사용될 때, 평균의 경우 단지 하나 개의 요소가 목록의 말미에서 제거되기 때문에 LTRIM는 O (1) 동작 점을 유념해야한다.

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

    2.나는이에 대한 정렬 된 세트 나 자신을 사용합니다. 나도 목록을 사용하는 방법에 대한 생각,하지만 난 목록의 내부를 조작하는 것은 상당히 비싼 것으로 나타났습니다 - O (N) - 소트 세트의 내부를 조작하는 것은 O (로그 n)이된다.

    나는이에 대한 정렬 된 세트 나 자신을 사용합니다. 나도 목록을 사용하는 방법에 대한 생각,하지만 난 목록의 내부를 조작하는 것은 상당히 비싼 것으로 나타났습니다 - O (N) - 소트 세트의 내부를 조작하는 것은 O (로그 n)이된다.

    나를 위해 거래를 밀봉 무엇의은 - 당신은 이제까지 세트의 내부를 조작한다? 그렇다면, 분류 세트와 스틱과 당신이있을 때마다 당신이 생각했다처럼 가장 오래된을 세척하십시오.

  3. from https://stackoverflow.com/questions/16641011/redis-capped-sorted-set-list-or-queue by cc-by-sa and MIT license