복붙노트

[REDIS] 첫째 지속적으로 EVICT 이전 데이터로 레디 스 구성

REDIS

첫째 지속적으로 EVICT 이전 데이터로 레디 스 구성

나는 레디 스에서 실시간 데이터의 무리를 저장하고있다. 나는 모든 키에 14,400초 (4 시간)의 TTL을 설정하고있다. 그래서이 만료되기 전에 데이터를 축출되어 레디 스, 나는 현재 메모리에 데이터를 4 시간에 맞게 충분한 공간이없는 10G로 maxmemory을 설정 한, 나는 가상 메모리를 사용하지 않는.

나는 데이터를 축출 레디 스 괜찮아,하지만 난 그게 가장 오래된 데이터를 축출하고 싶습니다. 나는 데이터의 전체 4 시간이없는 그래서하더라도, 적어도 나는 거기에 간격이 없도록 데이터의 일부 범위 (3 시간 2 시간 등)을 할 수 있습니다. 나는 그들이 모두 같은 TTL이 있기 때문에 가장 오래된 키가 처음으로 퇴거 할 것이라고 maxmemory 정책 = 휘발성-TTL, 생각을 설정하여이를 달성하기 위해 노력하지만, 그런 식으로 작동하지 않습니다. 내가 내 데이터의 간격으로 끝낼 수 있도록 레디 스이 다소 임의의 데이터를 축출 것 같습니다. 예를 들어, 오늘 2012-01-25T13의 데이터 : 00 2012-01-25T12에서 데이터 전에 퇴거 : 00.

그것은 지속적으로 먼저 이전 데이터를 퇴거 구성은 레디 스 할 수 있습니까?

여기 내 redis.cnf 파일에서 해당 라인입니다. 당신은 더 이상 기기 구성의보고 싶다면 알려주세요 :

maxmemory 10gb
maxmemory-policy volatile-ttl
vm-enabled no

해결법

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

    1.AFAIK, 이전 데이터 첫번째 지속적으로 퇴거 레디 스를 구성 할 수 없습니다.

    AFAIK, 이전 데이터 첫번째 지속적으로 퇴거 레디 스를 구성 할 수 없습니다.

    -lru 옵션 maxmemory 정책에서 선택되는 * * 표시 동기, TTL 또는, 레디 스이 키를 선택하는 정확한 알고리즘을 사용하지 않는 경우 제거 할 수 있습니다. 정확한 알고리즘 또는 메모리 (* 동기, TTL 경우) 여분의 힙 정상 레디 스 사전 데이터 구조와 상호 참조를 (* -lru 경우) 여분의 목록을 요구한다. 그것은 메모리 소비의 기간에 비용이 될 것입니다.

    현재의기구로, 퇴거 (각 명령이 실행되기 전에, 즉 전위 퇴거 각 루프 반복에서 체크) 메인 이벤트 루프에서 발생한다. 메모리 다시 maxmemory 한계 미만까지, 레디 스 임의로 N 키 샘플을 픽업 및 만료 (* -lru 대한) 가장 유휴 하나 (* 동기, TTL 용) 만료 한계에 가장 가까운 하나 선택한다. 기본적으로 단 3 샘플 간주됩니다. 결과는 비 결정적이다.

    문제를이 알고리즘의 정확성을 높이고 완화하는 한 가지 방법은 (구성 파일의 매개 변수 maxmemory-샘플) 고려 샘플의 수를 증가시키는 것이다. 그것은 어떤 CPU를 소비하기 때문에, 너무 높게 설정하지 마십시오. 그것은 퇴거 정확도와 CPU 소비 사이의 트레이드 오프입니다.

    당신이 정말 일관된 동작이 필요한 경우 이제 하나 개의 솔루션은 레디 스의 상단에 자신의 퇴거 메커니즘을 구현하는 것입니다. 예를 들어, 먼저 퇴거해야 키를 추적하기 위해 (비 갱신 키) 목록 또는 (갱신 키) 소트 세트를 추가 할 수 있습니다. 그런 다음 그 목적을 주기적으로 메모리 소비하고 목록의 쿼리 항목 / 관련 키를 제거하는 소트 세트 (INFO 사용) 확인하는 것입니다 데몬을 추가합니다.

    다른 캐싱 시스템은이 문제를 해결하기 위해 자신의 방법이 있습니다. 퇴거 순서는 정확하지 않도록 memcached를 함께 예를 들어, (실제로 레디 스보다 더 결정론 비록) (객체의 크기에 의존한다) 당 하나 명의 LRU 슬래브 구조가있다.

  2. from https://stackoverflow.com/questions/9010789/configuring-redis-to-consistently-evict-older-data-first by cc-by-sa and MIT license