MEMORY

1. Maxmemory : 메모리 사용량 제한

메모리 사용량 제한을 위해 사용하는 maxmemory는 32bit/64bit 환경에 따라 초기값이 다르게 설정된다. 32bit 환경에서는 초기값이 3GB로 설정되어 최대 3GB 메모리만 사용 가능한 반면에, 64bit 환경에서는 초기값이 0으로 설정된다. 즉, 64bit 환경에서는 메모리 사용량 제한이 없으며 운영체제의 가상메모리(스왑)까지 사용한다.(이 때 시스템의 메모리 한계를 인식하지 못해 더 많은 메모리를 요구하여 문제가 발생할 수 있기 때문에 따로 설정을 해주어야 한다.)

주의: maxmoery 설정 된 instance에 slave가 존재 할 때, slave에게 data를 제공하기위해서 사용되는 output buffer의 size는 used memory count에서 제외된다. 왜냐하면 network 문제나 재동기화가 keys들이 제거된 loop에 대한 trigger를 발생시키지 않게 하기 위해서이다. loop가 발생하면 slave의 output buffer가 제거된 key들의 DEL 명령으로 가득 찰 것이다. 그리고 이것은 database가 완전히 빌 때 까지 지속된다. Redis 서버 설정 정리

redis.conf

maxmemory 1gb

논리적으로 사용되고 있는 메모리의 크기가 maxmemory보다 커지는 경우 메모리 정책(Memory-policy)에 따라 아래 방식처럼 처리된다.

  1. 메모리 정책이 설정되어 있지 않은 경우, 에러가 발생한다.
  2. 메모리 정책이 설정되어 있는 경우, 값이 추가될 때마다 메모리 정책에 따라 데이터가 삭제된다.

2. Maxmemory-policy : 메모리 정책

max-memory만큼 메모리를 사용하게 되면, 메모리 정책에 따라 과거에 만들어진 키들이 삭제된다

  1. noeviction
    캐시를 지우지 않는 정책이다. 메모리가 maxmemory 이상을 사용하게 되면 error를 발생시킨다.

  2. allkey
    각 정책에 따라 모든 키를 대상으로 정리한다.

    • allkeys-lru
      LRU(Least Recently Used: 가장 최근에 사용되지 않은 것) 알고리즘 기반으로 키를 삭제한다.
    • allkey-random
      랜덤하게 키를 삭제한다.
    • allkeys-lfu
      LFU(Least-Frequently-Used: 가장 적게 사용된 것) 알고리즘 기반으로 키를 삭제한다.
  3. volatile
    각 정책에 따라 EXPIRE SET에 있는 키들을 대상으로 정리한다.

    • volatile-lru
      LRU 알고리즘 기반으로 키를 삭제한다.
    • volatile-random
      랜덤하게 키를 삭제한다.
    • volatile-ttl
      TTL이 짧은 순으로 삭제한다.
    • volatile-lfu
      LFU 알고리즘 기반으로 키를 삭제한다.

3. Memory Snapshot(RDB, AOF)

RDB작업시 single thread 문제를 해결하기 위해 Fork() 분기 기능 이용하는데, 이 때 메모리를 2배로 잡아먹어 용량 부족에 따른 오류 발생 가능성 존재

주의할 명령어

  1. keys, flushall ..
    1번에 1개의 명령어만 실행 가능하기 때문에 사용하면 안되는 명령어들이 있으니 주의하자
    ex. keys(모든 데이터 조회), flushall(모든 데이터 소거)

    KEYS의 단점을 보완할 명령어 SCAN
    http://tech.kakao.com/2016/03/11/redis-scan/

  2. Collection

    콜렉션에 데이터 100만건을 넣으면 처리시간이 10초, 1천만건 넣으면 100초씩 걸리는 식으로 늘어나기 때문에 굳이 쓰려면 일단 데이터를 1만건 미만으로 관리해야 한다 고 권고했다.


References