본문 바로가기

소프트웨어-이야기/데이터 저장소 + 시각화

[Redis]Redis에서 LRU Cache를 사용하는 방법

Using Redis as an LRU cache


Redis에서는 새로운 값이 추가되었을 때, 자동으로 오래된 데이터를 지워주는 기능이 있다. Memcached 시스템이서도 이러한 기능이 있기 때문에, 개발자들 사이에서는 익숙한 기능이다.


이 포스트에서는 메모리 사용량 제한을 위해서 사용하는 값인 maxmemory, 메모리 관리 정책인 eviction policy, 원조 LRU와 REDIS LRU의 차이에 대해서 이야기할거다.


Maxmemroy 설정하기

maxmemory 값은 redis.conf 파일이나 config set 커맨드 명령문으로 설정할 수 있다.

maxmemory 100mb

maxmemory를 설정해주지 않으면, 64bit 시스템에서는 초기값이 0으로 설정된다. 

32bit 시스템에서는 3GB으로 설정된다. 


논리적으로 사용되고 있는 메모리의 크기가 maxmemory보다 커지는 경우, 

아래의 방식처럼 처리된다.


1. 메모리 정책이 설정되어있지 않은 경우, 에러를 내뱉는다. 

2. 메모리 정책이 설정되어 있는 경우, 값이 추가될 때마다 메모리 정책에 따라 데이터를 삭제해준다. 


메모리 정책 

메모리 정책은 maxmemory-policy 설정 값으로 정하면 된다. 이 값도 redis.conf 파일이나 config set 명령문으로 변경할 수 있다. 

MAX MEMORY만큼 메모리를 사용하게 되면, 메모리 정책에 따라 과거에 만들어진 키들이 삭제된다.  


캐시를 지우지 않는 메모리 정책

noeviction

캐시를 지우지 않는 정책이다. 메모리가 MAXMEMORY 이상을 사용하게 되면, 에러를 내뱉는다. 


ALL KEY 메모리 정책 

allkeys-lru

LRU 알고리즘을 기반으로 키를 삭제한다. 

메모리 정책을 뭘로 설정해야하는지 애매모호하다.. 싶으면 이 정책을 사용하면 된다.

allkey-random

랜덤하게 키를 삭제한다.

allkeys-lfu

REDIS 4.0에서 추가된 정책이다. 가장 적게 사용된 키가 삭제된다. 


volatile 메모리 정책 

volatile은 EXPIRE SET에 있는 키들만 정리한다는 점에서, 모든 키를 정리하는 ALL KEY 메모리 정책과 상반된다. 

volatile-lru

EXPIRE SET 안에 있는 키를 LRU 알고리즘을 기반으로 키를 삭제한다.

volatile-random

EXPIRE SET 안에 있는 키들을 랜덤하게 삭제한다.

volatile-ttl

EXPIRE SET 안에 있는 키들을 TTL이 짧은 순으로 삭제한다. 

volatile-lfu 

REDIS 4.0에서 추가된 정책이다. EXPIRE SET 안에 있는 키 중 가장 적게 사용된 키가 삭제된다.


메모리 정책은 어플리케이션 특성에 맞게 설정하는게 좋다. 

메모리 정책은 레디스를 재시작하지 않고도 변경할 수 있다. 그러니 라이브 환경에서 설정값을 변경해보면서, 모니터링 후 설정값을 튜닝하는 것도 하나의 방법이다. 


메모리 삭제 프로세스 

1. 클라이언트에서 레디스에 데이터를 추가해야하는 커맨드를 날린다.

2. 레디스는 메모리 사용량을 확인한다. 이 메모리 사용량이 maxmemory보다 큰 경우, 메모리 정책에 따라 키들을 삭제한다. 

3. 그 다음 클라이언트에서 요청했던 건을 처리한다. 

즉, 메모리 한계를 넘어서, 데이터를 하나 삭제하고, 요청받은 데이터 추가 커맨드를 처리하면, 다시 메모리 한계를 넘고...를 무한 반복하는거다.

memory policy를 걸면, 계속 메모리가 정리될 거라고 생각했다. 그런데 계속 한계점을 유지하는 방식이였던거다 @_@ 

그래서 삭제한 캐시보다, 새로 추가하는 키값이 더 큰 경우, max-memory보다 메모리 사용량이 더 높아질 수 있다. 


REDIS LRU 알고리즘

REDIS의 LRU 알고리즘은 전체 캐시데이터에서 가장~~~ 과거에 접근했던 키를 삭제하지 않는다. 대신에 키를 샘플링한다음에, 이 중에서 가장 사용한지 오래된 키를 선택해서 삭제한다. 

샘플 개수를 늘리면, 실제 LRU 알고리즘과 더 유사해진다. 그런데 적정수준 이상으로 설정하면, 레디스 응답 속도가 늦어진다는 리스크가 있다. 

REDIS의 LRU는 실제 LRU와 비스무리한 LRU라고 보면 된다. REDIS 3.0에서는 후보군을 선택하는 알고리즘이 개선되면서, 실제 LRU 알고리즘과 더 유사해지기는 했었다. REDIS 3.0에서 샘플링수를 10으로 설정하면, 그나마 가장 실제 LRU 기능과 유사해질 수 있다. 


maxmemory-samples 설정값을 사용하면, REDIS LRU에서 사용하는 샘플링 수를 조정할 수 있다.

maxmemory-samples 5