KO EN

Redis 설정 - redis.config

by 민갤

Server /

메모리 사용량 제한

기본값

  • 32bit System: 3GB
  • 64bit System: 0
  • 0: 제한 없이 운영체제의 가상메모리(스왑)까지 사용

메모리가 가득 차면 제거 정책에 따라 key를 제거한다.

Cache 하나에 대한 최대 메모리 사용량보다 커야한다.

maxmemory 1gb
1k1kb1m1mb1g1gb
1,000 bytes1024 bytes1,000,000 bytes1024*1024 bytes1,000,000,000 bytes1012*1024*1024 bytes

제거 정책

Redis 4.0부터 LFU 지원

DEL 명령어를 사용하여 Key를 제거한다.

  • DEL 명령어는 Main Thread에서 실행된다.
maxmemory-policy volatile-lru

noeviction

제거 정책을 실행하지 않는다. 메모리가 가득찬 상태에서 쓰기 작업을 하면 오류가 발생한다.

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-lruLRU 알고리즘으로 가장 오랫동안 참조되지 않은 Key를 제거한다. (단일 캐시 서버, Key를 영구적으로 보관하는 경우 추천)
volatile-lfuLFU 알고리즘으로 참조 횟수가 가장 적은 Key를 제거한다.
volatile-random임의로 Key를 제거한다. (단일 캐시 서버, Key를 영구적으로 보관하는 경우 추천)
volatile-ttlTTL(time-to-live) 값이 가장 적게 남은 Key를 제거한다. (각 Key마다 서로 다른 TTL을 사용하는 경우 추천)

allkeys

모든 Key를 대상으로 제거 정책 실행

allkeys-lruLRU 알고리즘으로 가장 오랫동안 참조되지 않은 Key를 제거한다. (때에 따라 특정 Key들만 많이 사용되는 경우 추천)
allkeys-lfuLFU 알고리즘으로 참조 횟수가 가장 적은 Key를 제거한다.
allkeys-random임의로 Key를 제거한다. (모든 Key가 균일하게 사용되는 경우 추천)

제거 대상 후보수

제거 정책에 부합하는 후보군을 비교하여 제거한다.

maxmoery-samples 3

비동기식 제거 (Redis 4.0)

제거 정책이 실행될 때 한 번에 Key를 여러 개 제거하면서 발생하는 Blocking(작업 지연 상태) 현상을 방지하기 위한 설정

yes를 설정하면 DEL 명령어가 아닌 UNLINK 명령어를 사용하여 LazyFree Thread를 Background에서 수행한다.

lazyfree-lazy-eviction yes
  • 제거 정책이 실행될 때 UNLINK 명령어를 사용하여 Key를 비동기적으로 제거한다
lazyfree-lazy-expire yes
  • 만료기간이 지난 Key를 삭제할 때 UNLINK 명령어를 사용한다.
lazyfree-lazy-server-del yes
  • 이미 존재하는 Key에 대해 SET 또는 RENAME 명령어를 실행할 때 UNLINK 명령어를 사용한다.
lazyfree-lazy-user-del yes
  • DEL 명령어를 사용하면 내부적으로 UNLINK 명령어로 동작한다. (Redis 6.0)
slave-lazy-flush yes
  • Master 서버에 있는 전체 데이터를 Clone 서버로 복제할 때 FLUSHALL async 명령어로 삭제한다. 동기화 속도는 빠르지만 기존 데이터가 전부 삭제되지 않은 상태에서 새 데이터를 받기 때문에 메모리가 추가적으로 필요할 수 있다.

Reference

Key eviction

Redis 서버 설정 정리

Author

민갤

민갤

Back-End Developer

꾸잉꾸잉하고 웁니다.

로그인

디코에 오신 것을 환영해요!
전문가들의 수많은 아티클 창고 🤓