관심있는 기술 Redis에 대해 도서를 구매해 다시 공부를 진행하고있는데
메모리 기반 Redis를 잘 사용하기 위해서는 아무래도 메모리를 어떻게 관리할 수 있는가에 대해 잘 알아야할 필요성있죠.
메모리 기법에 대해 공부한 내용들을 정리하고자 포스팅을 진행하게되었습니다^^
메모리를 사용하다보면 아무래도 메모리의 크기가 제한적일 수 밖에 없죠…
모든 데이터를 100% 관리하는 것은 현실상 불가능하기 때문에, Redis를 사용하는데에 있어 LFU, LRU 알고리즘을 통해 데이터를 관리할 수 있습니다.
가장 참조 빈도가 낮은 데이터 부터 정리하는 알고리즘입니다.
Redis에서 LFU알고리즘을 사용해 인스턴스를 운영하기 위해서는 redis.conf 파일에 다음과 같이 추가해 주어야 합니다.
lfu-log-factor 10 << LFU 알고리즘에 의한 메모리 운영(default 10)
lfu-decay-time 1
가장 최근에 사용하지 않은 데이터 부터 정리하는 알고리즘입니다.
Redis에서 LRU알고리즘을 사용해 인스턴스를 운영하기 위해서는 redis.conf 파일에 다음과 같이 추가해 주어야 합니다.
Maxmemory ???(ex 30000000) << Redis 인스턴스를 위한 총 메모리 크기
Maxmemory-sample 5 << LRU 알고리즘에 의한 메모리 운영
Redis내에 데이터가 Max 메모리에 도달할 경우 메모리 관리 알고리즘을 통해 여러개의 키 삭제가 이루어지는데, 이때 성능 지연 문제가 발생할 수 있습니다.
LazyFree를 설정함으로써 백그라운드 상에서 작업을 진행함으로써 성능 문제를 어느정도 해소할 수 있습니다.
redis.conf 파일에 다음과 같이 추가해줍니다.
lazyfree-lazy-eviction no << unlink로 삭제하고 새키를 저장하기 위해 yes를 권장한다고 함(unlink로 삭제시 메인 쓰레드에서 삭제하지 않고 sub thread에서 삭제하기 때문에 블록킹이 발생하지 않음)
lazyfree-lazy-expire no << unlink로 만료된 키를 제거하기 위해 yes를 권장
lazyfree-lazy-server-del no << unlink로 데이터를 변경하기 위해 yes를 권장
slave-lazy-flush no << slave 서버가 삭제 후 다시 복제할 때 flushall async 명령어로 삭제하기 위해 yes를 권장
lazyfree-lazy-eviction이 no일 경우 기존에 존재하는 데이터를 del 명령어로 제거하기 때문에 redis의 명령어를 처리하는 메인 쓰레드에 블록킹이 발생함
lazyfree-lazy-expire이 no일 경우 내부적으로 expired 된 키를 del 명령어로 제거하기 때문에 메인 쓰레드의 블록킹이 발생함
Lazyfree-lazy-server-del이 no일 경우 키값에 대해 set 혹은 rename이 발생할 때 내부적으로 del 명령어가 수행되는데 그렇게 될 경우 메인 쓰레드의 블록킹이 발생함
Master-slave 환경 혹은 partition replication 환경에서 보통 변경된 부분에 대해서만 복제하는 경우도 있으나, 때로는 기존 모든 데이터를 제거 후 재복제를 하는 경우도 있습니다.
이럴 경우 이 작업을 더욱 빠르게 수행시키기 위함입니다.
여기까지 Redis에서 메모리를 관리하는 방법에 대해 설명드렸습니다!
부족한 부분이 있거나 혹은 잘못된 부분이 있다면 댓글 부탁드리겠습니다 !
감사합니다^^