2012-01-05 3 views
4

Redis LRU 기반 퇴거/삭제 내부에 대해 알고 있습니까?Redis Internals - 샘플링을위한 LRU 구현

Redis는 오래된 (덜 사용 된) 키가 먼저 삭제되도록 어떻게합니까? (휘발성 키가없고 TTL 만료를 설정하지 않는 경우)

Redis에는 키 제거에 사용되는 샘플 크기를 제어하는 ​​구성 매개 변수 "maxmemory-samples"가 있습니다. 따라서 샘플 크기를 10으로 설정하면 10 개의 키를 샘플링하고 가장 오래된 것을 제거합니다 이것들 중에.

내가 알지 못하는 것은이 키를 완전히 무작위로 샘플링하는지, 아니면 "이전 세대/덜 사용 된 세대"에서 자동으로 샘플링 할 수있는 메커니즘을 가지고 있는지 여부입니다.

+0

제가 아는 한, 그것은 무작위로 키를 샘플링합니다. –

+0

이것은 http://antirez.com/post/redis-as-LRU-cache.html에서 찾은 것입니다. "샘플 3"알고리즘 사용의 요점은 메모리를 절약하는 것입니다. 이것은 무작위 알고리즘이 거의 잘 이해되지 못하기 때문에 이것이 정밀도보다 훨씬 더 중요하다고 생각합니다. 예를 들어, 세 개의 객체만으로 샘플링하면 999 개의 데이터 세트에서 666 개의 객체가 만료되고 * 완벽한 * LRU 알고리즘과 비교하여 오류율은 14 %에 불과합니다. 나머지 14 %에는 매우 많이 사용되는 요소 범위에 속하는 요소가 거의 없습니다. 그래서 메모리 이득은 의문의 여지없이 정밀도를 지불 할 것입니다. –

+0

답변으로 게시하고 수락해야합니다. :-) –

답변

5

이것은 antirez.com/post/redis-as-LRU-cache.html에서 찾은 것입니다. "샘플 3"알고리즘을 사용하는 전체적인 시점은 메모리를 절약하는 것입니다. 이것은 무작위 알고리즘이 거의 잘 이해되지 못하기 때문에 이것이 정밀도보다 훨씬 더 중요하다고 생각합니다. 예를 들어, 세 개의 객체만으로 샘플링하면 완벽한 LRU 알고리즘에 비해 오류율이 14 % 인 999 개의 데이터 세트에서 객체가 666 개 만료됩니다. 나머지 14 %는 매우 많이 사용되는 요소 범위에 속하는 요소가 거의 없습니다. 그래서 메모리 이득은 의문의 여지없이 정밀도를 지불 할 것입니다.

Redis는 무작위로 샘플링하지만 (실제 LRU가 아니며 그러한 근사 알고리즘으로 암시 함) 정확도가 비교적 높고 샘플링 크기를 늘리면이 값이 더 커집니다. 그러나 누군가가 정확한 LRU를 필요로하는 경우 (오류에 대한 제로 허용 오차가 있음) Redis가 올바른 선택이 아닐 수 있습니다.

아키텍처 ... 말한대로 ... 절충안에 대한 것입니다. 원시 성능에 대한 절충 정확성을 위해이 (Redis LRU) 방식을 사용하십시오.

관련 문제