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한 키를 골라내는 알고리듬과 마찬가지로
근사 알고리듬을 이용한다.
따라서 저장된 모든 키를 스캔하면서 만료 시간을 비교하지 않아도 돼
간단하게 키를 찾아낼 수 있다.
'개발자를 위한 레디스' 카테고리의 다른 글
[개발자를 위한 레디스] 레디스의 자료 구조 - SET (0) | 2024.12.13 |
---|---|
[개발자를 위한 레디스] 레디스의 자료 구조 - hash (0) | 2024.12.13 |
[개발자를 위한 레디스] 레디스의 Pub/Sub (0) | 2024.12.12 |
[개발자를 위한 레디스] 레디스를 메시지 브로커로 사용하기 (0) | 2024.08.25 |
[개발자를 위한 레디스] 레디스를 캐시로 사용하기 - 캐시로서의 레디스, 캐싱 전략 - 읽기 전략, 쓰기 전략 (0) | 2024.06.29 |