Redis(Remote Dictionary Server)는 Memcached 시스템의 기본 동작입니다.
1. 최대 메모리 구성 지시문
Redis는 데이터 세트에 지정된 양의 메모리를 사용하도록 구성할 수 있습니다.
redis.conf 파일을 사용하거나 나중에 실행 시 CONFIG SET 명령을 사용하여 구성 지시어를 설정할 수 있습니다.
redis.conf 파일 예시
maxmemory 100mb
최대 메모리를 0으로 설정하면 메모리 제한이 없습니다. 이것은 64비트 시스템의 기본 동작이지만 32비트 시스템은 3GB의 암묵적 메모리 제한을 사용합니다.
지정된 메모리 양에 도달하면 제거 정책을 구성하는 방법에 따라 다음 기본 동작이 결정됩니다.
- Redis는 더 많은 메모리가 사용될 수 있는 명령에 대한 오류를 반환합니다.
- 새 데이터가 추가될 때마다 일부 오래된 데이터를 제거하여 지정된 제한으로 되돌릴 수 있습니다.
2. 제거 정책
maxmemory-policy 구성 지시어를 사용하여 최대 메모리 제한에 도달하면 Redis 동작이 수행됩니다.
Redis의 키 교체 알고리즘 2가지가 있습니다.
LRU(Least Recently Used) - 가장 최근에 사용한 것
LFU(Least Frequently Used) - 가장 적게 사용된 것
ex:) 페이지 교체 알고리즘
LRU(가장 오랫동안 참조되지 않은 페이지를 교체하는 알고리즘)
LFU(가장 적은 참조횟수를 갖는 페이지를 교체하는 알고리즘)
사진 출처 : https://code-lab1.tistory.com/60
Redis에서는 다음과 같은 정책들을 사용할 수 있습니다.
noeviction: 메모리 제한에 도달하면 새 값이 저장되지 않습니다. 데이터베이스가 복제를 사용할 때 기본 데이터베이스에 적용됩니다.
allkeys 정책: 모든 키들을 정리합니다.
- allkeys-lru: 가장 최근에 사용한 키를 보관하고, 가장 최근에 사용한(LRU) 키를 제거합니다.
- allkeys-lfu: 자주 사용하는 키를 유지합니다. 가장 자주 사용하지 않는(LFU) 키를 제거합니다.
- allkeys-random: 추가된 새 데이터를 위한 공간을 확보하기 위해 임의로 키를 제거합니다.
volatile 정책: expire set에 있는 키들만 정리한다.(expire set에서 만료 필드를 true로 설정 한다.)
- volatile-lru: 만료 필드가 true로 설정된 가장 최근에 사용한 키를 제거합니다.
- volatile-lfu: 만료 필드가 true로 설정된 가장 자주 사용하지 않는 키를 제거합니다.
- volatile-random: 만료 필드가 true로 설정된 키를 임의로 제거합니다.
- volatile-ttl: 만료 필드가 true로 설정되고 남은 TTL(Time-to-Live, 네트워크에서 패킷의 유효 기간) 값이 가장 짧은 가장 자주 사용하지 않는 키를 제거합니다.
ex: allkeys-lru
- 메모리를 3GB설정하였음
- 2.5GB를 사용하다가 1GB의 메모리를 추가로 사용해야함
- 가장 사용되지 않았던 데이터부터 0.5GB의 여유 공간이 생길 때 까지 삭제
- 추가로 사용해야할 1GB 캐싱
ex: volatile-lru (그림으로 예제 확인)
http://redisgate.kr/redis/command/expire_ani1.php
올바른 제거 정책을 선택하는 것은 응용 프로그램의 액세스 패턴에 따라 중요합니다.
응용 프로그램이 실행되는 동안 런타임에 정책을 재구성하고 Redis INFO 출력을 사용하여 캐시 누락 및 적중 횟수를 모니터링하여 설정을 조정할 수 있습니다.
Redis INFO란
- 정보를 조회하는 레디스 명령어
- 조회내용: 서버, 클라이언트, 메모리, 퍼시스턴스, 상태, 리플리케이션, CPU, 클러스터, 키스페이스
3. 제거 프로세스 작동 방식
메모리 제거 프로세스는 다음과 같이 작동한다는 것을 이해하는 것이 중요합니다.
클라이언트가 새 명령을 실행하여 더 많은 데이터가 추가됩니다.
Redis는 메모리 사용량을 검사하고 최대 메모리 제한보다 클 경우 정책에 따라 키를 제거합니다.
새 명령이 실행되는 등의 작업을 수행합니다.
그래서 우리는 계속해서 메모리 제한의 경계를 넘습니다. 그것을 넘어서고, 그리고 제한 아래로 돌아가기 위해 키를 제거합니다.
- 클라이언트가 새 명령을 실행하게되면 레디스에 더 많은 데이터가 추가됩니다.
- Redis는 메모리 사용량을 검사하고 최대 메모리 제한보다 클 경우 정책에 따라 키를 제거합니다.
- 이 후 새 명령이 실행되는 등의 작업을 수행합니다.
그래서 레디스는 계속해서 메모리 한계의 경계를 넘고 한계 아래로 되돌아가기 위해 키를 제거 합니다. 그렇지만 추가 명령을 처리하면 다시 계속해서 넘어갑니다.(반복)
but, 새 명령으로 인해 일정 시간 동안 많은 메모리가 사용되는 경우 메모리 제한을 눈에 띄게 초과할 수 있습니다.(redis.conf에 설정한 maxmemory의 제한을 초과할 수 있음.)
'개발 > Redis' 카테고리의 다른 글
Redis - 키 제거 정책 2 (1) | 2022.09.25 |
---|---|
Memcached - 기본 개념 (0) | 2022.09.25 |