Redis 설정 - redis.config
Server메모리 사용량 제한
기본값
- 32bit System: 3GB
- 64bit System: 0
- 0: 제한 없이 운영체제의 가상메모리(스왑)까지 사용
메모리가 가득 차면 제거 정책에 따라 key를 제거한다.
Cache 하나에 대한 최대 메모리 사용량보다 커야한다.
text
maxmemory 1gb
1k | 1kb | 1m | 1mb | 1g | 1gb |
1,000 bytes | 1024 bytes | 1,000,000 bytes | 1024*1024 bytes | 1,000,000,000 bytes | 1012*1024*1024 bytes |
제거 정책
Redis 4.0부터 LFU 지원
DEL 명령어를 사용하여 Key를 제거한다.
- DEL 명령어는 Main Thread에서 실행된다.
text
maxmemory-policy volatile-lru
noeviction
제거 정책을 실행하지 않는다. 메모리가 가득찬 상태에서 쓰기 작업을 하면 오류가 발생한다.
text
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.data.redis.RedisSystemException: Error in execution; nested exception is io.lettuce.core.RedisCommandExecutionException: OOM command not allowed when used memory > 'maxmemory'.] with root cause
io.lettuce.core.RedisCommandExecutionException: OOM command not allowed when used memory > 'maxmemory'.
volatile
EXPIRE SET(Expire를 설정한 Key 집합)을 대상으로 제거 정책 실행.
제거 대상이 없으면 noeviction처럼 동작한다.
volatile-lru | LRU 알고리즘으로 가장 오랫동안 참조되지 않은 Key를 제거한다. (단일 캐시 서버, Key를 영구적으로 보관하는 경우 추천) |
volatile-lfu | LFU 알고리즘으로 참조 횟수가 가장 적은 Key를 제거한다. |
volatile-random | 임의로 Key를 제거한다. (단일 캐시 서버, Key를 영구적으로 보관하는 경우 추천) |
volatile-ttl | TTL(time-to-live) 값이 가장 적게 남은 Key를 제거한다. (각 Key마다 서로 다른 TTL을 사용하는 경우 추천) |
allkeys
모든 Key를 대상으로 제거 정책 실행
allkeys-lru | LRU 알고리즘으로 가장 오랫동안 참조되지 않은 Key를 제거한다. (때에 따라 특정 Key들만 많이 사용되는 경우 추천) |
allkeys-lfu | LFU 알고리즘으로 참조 횟수가 가장 적은 Key를 제거한다. |
allkeys-random | 임의로 Key를 제거한다. (모든 Key가 균일하게 사용되는 경우 추천) |
제거 대상 후보수
제거 정책에 부합하는 후보군을 비교하여 제거한다.
text
maxmoery-samples 3
비동기식 제거 (Redis 4.0)
제거 정책이 실행될 때 한 번에 Key를 여러 개 제거하면서 발생하는 Blocking(작업 지연 상태) 현상을 방지하기 위한 설정
yes를 설정하면 DEL 명령어가 아닌 UNLINK 명령어를 사용하여 LazyFree Thread를 Background에서 수행한다.
text
lazyfree-lazy-eviction yes
- 제거 정책이 실행될 때 UNLINK 명령어를 사용하여 Key를 비동기적으로 제거한다
text
lazyfree-lazy-expire yes
- 만료기간이 지난 Key를 삭제할 때 UNLINK 명령어를 사용한다.
text
lazyfree-lazy-server-del yes
- 이미 존재하는 Key에 대해 SET 또는 RENAME 명령어를 실행할 때 UNLINK 명령어를 사용한다.
text
lazyfree-lazy-user-del yes
- DEL 명령어를 사용하면 내부적으로 UNLINK 명령어로 동작한다. (Redis 6.0)
text
slave-lazy-flush yes
- Master 서버에 있는 전체 데이터를 Clone 서버로 복제할 때 FLUSHALL async 명령어로 삭제한다. 동기화 속도는 빠르지만 기존 데이터가 전부 삭제되지 않은 상태에서 새 데이터를 받기 때문에 메모리가 추가적으로 필요할 수 있다.
Reference