본문 바로가기

개발자를 위한 레디스

[개발자를 위한 레디스] 레디스를 캐시로 사용하기 - 메모리 관리와 maxmemory-policy 설정

 

 

1) 메모리 관리와 maxmemory-policy 설정

 

 

- 레디스에서 키에 만료 시간을 설정해 데이터가 자동으로 삭제되도록 함으로써

  데이터의 수명을 관리할 수 있다.

 

- 하지만 레디스의 메모리는 제한적이기 때문에 모든 키에 만료 시간을 설정하더라도

  너무 많은 키가 저장되면 메모리가 가득 차는 상황이 발생할 수 있다.

  메모리의 용량을 초과하는 양의 데이터가 저장되면 레디스는 내부 정책을 사용

  어떤 키를 삭제할지 결정한다.

 

 

- 레디스에서는 데이터의 최대 저장 용량을 설정하는 maxmemory 설정

  이 용량을 초과할 때의 처리 방식을 결정하는 maxmemory-policy 설정값을 사용해

  메모리를 관리한다.

  maxmemory-plicy의 다양한 설정값과 동작 방식에 대해 알아보자. 

 

 

(1-1) Noeviction

 

- 기본값은 noeviction이다. 이 값은 레디스에 데이터가 가득 차더라도

   임의로 데이터를 삭제하지 않고 더 이상 레디스에 데이터를 저장할 수 없다는 에러를 

   반환하는 설정값이다. 

 

- 하지만 캐시에 데이터를 저장하지 못해 에러가 발생할 경우 로직에 따라 장애 상황으로

  이어질 수 있으며, 이런 상황에서는 관리자가 레디스의 데이터를 직접 지워야 하기 때문에

  레디스를 캐시로 사용할 때 권장하지 않는 설정값이다. 

 

(1-2) LRU eviction

 

- LRU eviction이란 레디스에 데이터가 가득 찼을 때

  가장 최근에 사용되지 않은 데이터부터 삭제하는 정책이다.

 

- 최근에 액세스되지 않은 데이터는 나중에도 액세스될 가능성이 

  낮을 것이라는 가정을 전제하고 있다.

  캐시는 나중에 사용될 가능성이 있는 데이터를 유지하는 것을 목표로 하기 때문에

  효율적인 메모리 관리 방법이다.

 

 

- 레디스는 LRU 알고리듬을 이용한 두 가지 설정값을 가지고 있다. 

 

 

(1-2-1) volatile-lru

 

- 만료 시간이 설정돼 있는 키에 한해서 LRU 방식으로 키를 삭제한다.

  즉, 이미 만료 시간이 설정돼 있는 키는 언젠가 삭제될 키라는 것을 의미하기 때문에,

  이런 키 중 가장 오래 사용되지 않은 키를 삭제하는 방식이다.

  만약 레디스를 사용할 때 임의적인 방식으로 삭제되면 안 되는 값에 대해서는

  만료 시간을 지정하지 않는다면 volatile-lru 방식을 사용하는 것이 적합할 수 있다. 

 

 

(1-2-2) allkeys-LRU

 

- 레디스 공식 문서에서는 레디스를 캐시로 사용할 경우,

  잘 모르겠다면 allkeys-LRU 방식을 사용하기를 권장한다.

   이 방식은 모든 키에 대해 LRU 알고리듬을 이용해 데이터를 삭제하기 때문에 

   적어도 메모리가 꽉 찼을 때 장애가 발생할 상황은 방지할 수 있다. 

 

 

(1-3) LFU eviction

 

- LFU evivction이란 레디스에 데이터가 가득 찼을 때

  가장 자주 사용되지 않은 데이터부터 삭제하는 정책이다.

 

- 자주 사용되지 않은 데이터는 나중에도 액세스될 가능성이 낮을 것이라는

  가정을  전제하고 있다.

 

 

- LFU 또한 다음 두 가지 설정값을 갖고 있다. 

 

(1-3-1) volation-lfu

 

- 만료 시간이 설정돼 있는 키에 한해서 LFU 방식으로 키를 삭제한다.

   volatile-lru에서와 마찬가지로 특정 상황에서는 장애를 유발할 가능성이 존재한다.

 

 

(1-3-2) allkeys-lfu

- 모든 키에 대해 LFU 알고리듬을 이용해 데이터를 삭제한다

 

1-4) RANDOM eviction

 

- 이 옵션은 레디스에 저장된 키 중 하나를 임의로 골라내 삭제한다.

  앞서 소개한 알고리즘을 상요하지 않기 때문에 삭제될 키 값을 계산하지 않아도

  된다는 점에서 레디스의 부하를 줄여줄 수 있는 방법이다.

 

- 하지만 이 방법은 랜덤으로 데이터를 삭제하기 때문에 나중에 사용될 수도 있는

  데이터를 삭제할 가능성이 높아진다.

  이럴 경우 데이터 저장소에서 다시 데이터를 갖고 와서 캐시에 넣어주는 작업이

  오히려 불필요함을 유발할 수 있다. 

 

 

- random eviction 또한 다음 두 가지 설정값을 갖고 있다.

 

(1-4-1) volatile-random

- 만료 시간이 설정돼 있는 키에 한해 랜덤하게 키를 삭제한다

 

(1-4-2) allkeys-random

- 모든 키에 대해 랜덤하게 키를 삭제한다. 

 

 

 

1-5) volatile-ttl

- volatile-ttl 방식은 만료 시간이 가장 작은 키를 삭제한다.

  즉, 삭제 예정 시간이 얼마 남지 않은 키를 추출해 해당 키를 미리 삭제하는 옵션이다.

  이 알고리듬 또한 앞선 LRU, LFU한 키를 골라내는 알고리듬과 마찬가지로 

  근사 알고리듬을 이용한다.

  따라서 저장된 모든 키를 스캔하면서 만료 시간을 비교하지 않아도 돼

  간단하게 키를 찾아낼 수 있다.