Redis의 LFU 정책
- Redis의 LFU(Least Frequently Used) 정책은 사용 빈도에 기반하여 데이터를 관리하는 캐시 알고리즘입니다. LFU는 가장 적게 사용된 데이터를 우선적으로 제거하여, 자주 사용되는 데이터를 더 오래 유지하도록 합니다.
- Redis 4.0부터 LFU 정책을 지원하며, 이는 LRU(Least Recently Used)와 달리 얼마나 자주 사용되었는지를 기준으로 데이터를 판단합니다.
Redis LFU의 작동 방식
- Redis에서 LFU 정책을 사용하면 각 키에 대해 사용 빈도를 기록하고, 이 빈도를 기반으로 데이터 제거 결정을 내립니다.
- Redis는 이 작업을 효율적으로 처리하기 위해 사용 카운터와 감쇠(decay) 기법을 적용합니다.
1. 사용 빈도 추적
- Redis는 각 키마다 LFU 카운터를 유지합니다. 이 카운터는 키에 접근할 때마다 증가하며, 이를 통해 해당 키가 얼마나 자주 사용되는지를 기록합니다. 다음과 같은 경우 LFU 카운터가 증가합니다:
- 키가 읽힐 때(GET, HGET 등).
- 키가 수정될 때(SET, HSET 등).
2. LFU 카운터의 구조
- Redis는 각 키의 사용 빈도를 8비트로 관리합니다. 이 8비트는 0~255 범위에서 카운팅이 이루어지며, LFU 카운터가 255에 도달하면 더 이상 증가하지 않습니다.
- 따라서 무한정으로 카운터가 증가하지 않으며, 자주 사용된 키라도 한계가 있습니다.
3. 카운터의 감쇠(Decay)
- LFU 카운터는 시간이 지남에 따라 감쇠(Decay)되도록 설계되어 있습니다. 즉, 시간이 지나면 특정 키의 사용 빈도가 낮아지도록 하여, 자주 사용되지 않으면 카운터가 감소합니다. Redis는 시간에 따라 카운터를 줄이는 방식으로, 최근에 사용되지 않은 키의 빈도를 자연스럽게 낮춥니다.
- 이 방식은 LFU가 특정 시점의 빈도만을 기록하는 것이 아니라, 시간이 지남에 따라 가장 최근 사용 패턴에 집중하게 만들어줍니다.
- lfu-decay-time 설정: 사용자는 lfu-decay-time 설정을 통해 LFU 카운터가 얼마나 빨리 감쇠할지를 조정할 수 있습니다. 기본적으로는 1분 단위로 감쇠가 이루어집니다.
4. LFU 카운터 증가 공식
- Redis는 LFU 카운터가 일정하게 증가하지 않도록 로그 기반의 증감 공식을 사용합니다. 이 방식은 키가 자주 사용될수록 증가율이 완만해지도록 하여, 극도로 빈번하게 사용되는 키가 카운터를 빠르게 채우는 것을 방지합니다. Redis의 LFU 카운터 증가는 다음과 같은 방식으로 이루어집니다:
- 첫 번째 접근 시: 카운터가 비교적 빠르게 증가합니다.
- 여러 번 접근 시: 카운터가 증가하는 비율이 점점 느려집니다.
- 이 방식은 지나치게 자주 사용된 키가 카운터를 채우는 것을 방지하고, 적당히 사용된 키들 간의 경쟁에서 빈도 차이를 줄이기 위한 목적입니다.
- LFU 정책 선택
- Redis에서 LFU 정책을 사용하기 위해서는 maxmemory-policy 옵션에서 적절한 LFU 정책을 선택할 수 있습니다. LFU와 관련된 주요 정책들은 다음과 같습니다:
- allkeys-lfu: 모든 키를 대상으로 LFU 정책을 적용하여, 가장 적게 사용된 키부터 제거합니다.
- volatile-lfu: 만료 시간이 설정된 키 중에서 가장 적게 사용된 키를 제거합니다.
- 이 정책들은 메모리가 가득 찬 상태에서 사용 빈도가 낮은 키를 제거하여, 자주 사용되는 데이터를 더 오래 캐시에 유지할 수 있게 합니다.
- Redis에서 LFU 정책을 사용하기 위해서는 maxmemory-policy 옵션에서 적절한 LFU 정책을 선택할 수 있습니다. LFU와 관련된 주요 정책들은 다음과 같습니다:
Redis LRU 설정하기
- Redis 설정 파일인
redis.conf
또는 Redis CLI에서 설정할 수 있습니다.
- maxmemory 설정
예시: 메모리 최대 사용량을 512MB로 설정하고 싶다면:
# redis.conf
maxmemory 536870912 # 최대 메모리 512MB
- maxmemory-policy 설정: 위의 정책을 입력하면 됩니다.
maxmemory-policy allkeys-lfu # 모든 키에 LFU 정책 사용
- maxmemory-samples 설정: 샘플링 개수를 설정합니다.
예를 들어, 샘플링 키 개수를 10으로 설정하고 싶다면:
maxmemory-samples 10
- LFU 전용 설정:
lfu-decay-time
LFU 정책에서 중요한 부분은 사용 빈도가 시간이 지남에 따라 감소하는 감쇠(Decay) 효과입니다. Redis는 시간이 지남에 따라 사용 빈도를 자동으로 감소시켜, 최근에 자주 사용되지 않은 키의 빈도가 낮아지도록 관리합니다.
lfu-decay-time
: LFU 카운터가 얼마나 빠르게 감소할지를 설정합니다. 기본값은 1분입니다.
예를 들어, 감쇠 시간이 10분으로 설정하려면:
lfu-decay-time 10
Redis 서버를 시작 시 설정을 적용합니다.
redis-server /path/to/redis.conf
Redis CLI에서 적용하기
redis-cli config set maxmemory 536870912
redis-cli config set maxmemory-policy allkeys-lfu
redis-cli config set maxmemory-samples 10
redis-cli config set lfu-decay-time 10
설정 적용된 값 확인하기
redis-cli config get maxmemory
redis-cli config get maxmemory-policy
redis-cli config get maxmemory-samples
redis-cli config get lfu-decay-time
LFU와 LRU의 차이점
- LRU(Least Recently Used): 가장 최근에 사용되지 않은 데이터를 제거합니다. 즉, 접근 시간이 기준입니다.
- LFU(Least Frequently Used): 가장 적게 사용된 데이터를 제거합니다. 즉, 사용 횟수가 기준입니다.
LRU는 단기적으로 얼마나 최근에 사용되었는지를 기준으로 하지만, LFU는 장기적인 패턴을 고려하여 얼마나 자주 사용되었는지를 기준으로 데이터를 관리합니다.
'Redis' 카테고리의 다른 글
Redis RDB (3) | 2024.10.12 |
---|---|
Redis의 AOF 백업 전략 (0) | 2024.10.12 |
Redis의 LRU 정책 (6) | 2024.10.12 |
Redis Value 최대 크기 (0) | 2024.10.12 |
음성 합성 모델(TTS) 서빙을 Redis를 활용해 효율적으로 서비스하기 (0) | 2024.10.12 |