Skip to content

2. Redis-Server


1. Redis 설치

1) redis-server 설치

  • 서버에서 redis-server를 설치한다.
sudo apt-get update
sudo apt-get install redis-server


  • 설치 후 버전을 확인한다.


redis-server --version
Redis server v=5.0.7 sha=00000000:0 malloc=jemalloc-5.2.1 bits=64 build=636cde3b5c7a3923


2) 서버 메모리 확인

  • 서버의 메모리를 확인한다.


vmstat -s

or

htop


2. Redis 메모리

1) redis.conf

  • redis.conf에서 Redis의 메모리를 설정할 수 있다.
  • 여기서 중요한 키워드는 maxmemorymaxmemory-policy이다.


2) maxmemory

  • maxmemory는 Redis가 사용할 수 있는 최대 메모리를 정의한다.
  • 서버 사양과 목적에 맞게 정의한다.


3) maxmemory-policy

  • maxmemory-policy는 최대 메모리 사용량 초과 시 데이터를 어떻게 처리할 것인지 정의한다.
  • maxmemory 초과로 인해서 데이터가 지워지게 되는 것을 Eviction이라고 한다.
  • defaultnoeviction이고, 그 외의 처리 방식은 다음과 같이 다양하다.


1] noeviction

  • 기존 데이터를 삭제하지 않는다.
  • 메모리가 꽉 찬 경우에는 OOM(Out Of Memory) 오류를 반환하고 새로운 데이터는 버리게 된다.

2] allkeys-lru

  • LRU(Least Recently Used)라는 페이지 교체 알고리즘을 통해 데이터를 삭제하여 공간을 확보한다.

3] volatile-lru

  • expire set을 가진 것 중 LRU로 삭제하여 메모리 공간을 확보한다.

4] allkeys-random

  • 랜덤으로 데이터를 삭제하여 공간을 확보한다.

5] volatile-random

  • expire set을 가진 것 중 랜덤으로 데이터를 삭제하여 공간을 확보한다.

6] allkeys-lfu

  • LFU(Least Frequently Used) 방식으로, 가장 적게 액세스한 키를 제거하여 공간을 확보한다.

7] volatile-lfu

  • expire set을 가진 것 중 가장 적게 액세스한 키부터 제거하여 공간을 확보한다.


4) Redis는 COW(Copy On Write) 방식

  • maxmemory가 설정된 대로 작동하면 좋겠지만, 그렇지 않은 경우가 있다.
  • Redis는 쓰기 요청이 발생하면 COW 방식을 통해 작동한다.
  • 쓰기 요청이 오면 OS는 fork()를 통해서 자식 프로세스를 생성하는데, fork() 시에는 다른 가상 메모리 주소를 할당받지만 물리 메모리 블록을 공유한다.
  • 쓰기 작업을 시작하는 순간에는 수정할 메모리 페이지를 복사한 후에 쓰기 작업을 진행한다.
  • 즉, 기존에 쓰던 메모리보다 추가적인 메모리가 필요하다.
  • 하지만 전체 페이지 중에서 얼마나 작업이 진행될지 모르기 때문에 fork() 시에는 기본적으로 복사할 사이즈만큼의 free memory가 필요하다.
  • Redis를 직접 설치할 때 /proc/sys/vm/overcommit_memory 값을 1로 설정하지 않아 장애가 날 때가 있다.


sudo cat /proc/sys/vm/overcommit_memory
0


  • 확인한 것과 같이 overcommit_memory 값이 0이면 OS는 주어진 메모리량보다 크게 할당할 수가 없다.
  • 즉, fork() 시에 OS가 충분한 메모리가 없다고 판단하기 때문에 에러를 발생시킨다.
  • overcommit_memory 값을 1로 설정해서 OS에게 메모리를 더 초과해서 할당할 수 있도록 한 후에 maxmemory에 도달한 경우 maxmemory-policy에 따라 처리되도록 설정하는 것이 좋다.


5) Docker 환경에서 overcommit_memory 변경

  • Docker 환경에서 sudo vim /proc/sys/vm/overcommit_memory를 실행한 후 값을 수정하면 에러가 발생한다.
  • 왜냐하면 일반적으로 sudo docker run으로 컨테이너 생성 시 호스트의 자원에 접근할 수 없기 때문이다.
  • 그래서 다음과 같이 --privileged 옵션을 추가해서 컨테이너를 생성한다.


sudo docker run -it -p 호스트포트:컨테이너포트 [--gpus all] --privileged --name 컨테이너이름 이미지이름 /bin/bash


  • GPU를 사용하는 경우 --gpus all을 추가한다.
  • 이렇게 생성된 컨테이너를 실행시켜 접속한 후 똑같은 방법으로 overcommit_memory를 변경하면 또 에러가 발생한다.
  • 그래서 다음과 같이 sysctl 명령어를 통해 해결한다.


sudo sysctl vm.overcommit_memory=1


  • 명령어를 실행하면 다음과 같이 확인된다.


sudo cat /proc/sys/vm/overcommit_memory
1


3. redis.conf

  • 먼저 redis.conf를 확인한다.


sudo vim /etc/redis/redis.conf


1) 로그 파일 위치 확인

  • 로그 파일은 /var/log/redis/redis-server.log에 있다.


001


2) 포트 바인딩

  • 포트 바인딩 내용은 다음과 같이 확인된다.


002

003


  • 기본적으로 127.0.0.1:6379로 설정되어 있다.


3) Memory Management

  • 메모리 관련 내용은 다음과 같이 확인된다.


  • maxmemory


004


  • maxmemory-policy


005


  • maxmemory-samplesreplica-ignore-mamemory


006


4) 메모리 변경

  • redis.conf에 다음과 같이 추가하여 메모리와 관련된 내용을 변경한다.


maxmemory 2g (목적에 맞는 용량 선택)
maxmemory-policy allkeys-lru (목적에 맞는 정책 선택)


5) Redis 재시작 및 상태 확인

  • 다음과 같이 Redis를 재시작한다.


sudo systemctl restart redis-server.service


  • 다음과 같이 상태를 확인한다.


sudo systemctl status redis-server.service


  • Could not create server TCP listening socket 127.0.0.1:6379: bind: Address already in use와 같은 메시지가 로그에 찍힌다면 다음과 같이 해결한다.


ps aux | grep redis
redis       42  0.0  0.0  53372  5268 ?        Ssl  11:06   0:00 /usr/bin/redis-server 127.0.0.1:6379
sudo kill -9 42(PID)


  • 다시 재시작한다.


sudo systemctl restart redis-server.service


  • 상태를 확인한다.


sudo systemctl status redis-server.service
redis-server.service - Advanced key-value store
    Loaded: loaded (/usr/lib/systemd/system/redis-server.service, disabled)
    Active: active (running)


4. Redis 실행

1) redis-cli 실행

  • 다음과 같이 redis-cli를 실행하면 redis-server로 접속해서 직접 데이터를 관리할 수 있다.


redis-cli
127.0.0.1:6379>


2) Redis 설정 정보

  • 설정 정보를 확인할 수 있다.


127.0.0.1:6379> info


3) 데이터 저장하기

  • 데이터 한 개 저장하기


127.0.0.1:6379> set [키] [값]


  • 데이터 여러 개 저장하기


127.0.0.1:6379> mset [키1] [값1] [키2] [값2] ...


4) 데이터 가져오기

  • 데이터 한 개 가져오기


127.0.0.1:6379> get [키]


  • 데이터 여러 개 가져오기


127.0.0.1:6379> mget [키1] [키2] [키3] ...


5) 데이터 삭제하기

  • 특정 키와 값을 지울 때 사용한다.


127.0.0.1:6379> del [키]


6) 카운터 생성

  • Redis에 해당 키에 대한 값을 저장한다.


127.0.0.1:6379> SET [키] [값]


  • 특정 키의 값을 가져온다.


127.0.0.1:6379> GET [키]


  • 값에 1을 더한다.


127.0.0.1:6379> INCR [키]


  • 확인한다.


127.0.0.1:6379> GET [키]


7) 저장된 키 확인

  • 모든 키를 확인한다.


127.0.0.1:6379> keys *


  • 특정 문자를 가진 키를 확인한다.


127.0.0.1:6379> keys [특정문자]*

References