포스트

Redis

목차

  1. Redis?
  2. Redis 설치
  3. Redis 환경 설정
  4. Python Redis 연결
  5. Redis에 Dataframe 넣기
  6. Redis 운영 관리 - RedisInsights
  7. Redis 운영 관리 - RMA

Redis?

Redis는 Remote Dictionary Server의 약자로 Key-Value 구조의 데이터를 저장한다.
Redis는 Disk가 아닌 메모리에 데이터를 저장하고 조회하므로 빠른 장점이 있다.
물론 데이터를 Disk에 저장을 못하는 것은 아니다.
Disk에 데이터를 저장하는 방식은 2가지로

1) RDB(Snapshotting) 방식
-> 메모리에 있는 전체 내용을 스냅샷을 찍어 Disk에 옮겨 담는 방식
-> redis.conf 파일에서 SAVE 옵션 설정

2) AOF(Append On File) 방식
-> Redis의 모든 Read/Write 연산 자체를 모두 log 파일에 기록하는 방식
-> redis.conf 파일에서 auto-aof-rewrite-percentage 옵션 설정

Redis 설치

1
2
3
4
5
6
7
8
sudo apt install lsb-release curl gpg

curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg

echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list

sudo apt-get update
sudo apt-get install redis

위의 명령어를 실행하면 redis가 설치 완료

Redis 환경 설정

1) Redis가 사용할 수 있는 최대 메모리 설정
maxmemory 값을 변경

2) 최대 사용량 초과 시 데이터 처리 방식
maxmemory-policy 값을 수정

3) 외부 접속이 가능하도록 변경
redis.conf파일에서 bind를 127.0.0.1에서 0.0.0.0으로 변경

4) 비밀번호 설정
requirepass 주석을 해제하고 사용하려는 비밀번호 입력

5) Daemon 설정
daemonize 값을 yes로 변경

sudo vi /etc/systemd/system/redis.service 파일 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=Redis
After=network.target

[Service]
User=redis
Group=redis
ExecStart=/usr/bin/redis-server /etc/redis/redis.conf
ExecStop=/bin/kill -s TERM $MAINPID
Restart=always

[Install]
WantedBy=multi-user.target

시스템 등록

1
2
3
4
5
6
sudo systemctl enable redis.service
sudo systemctl daemon-reload
sudo systemctl start redis.service


sudo systemctl status redis-server 

Python Redis 연결

1
pip install redis
1
2
3
4
5
6
7
class RedisClient:
    def __init__(self):
        self.r = redis.StrictRedis(host=REDIS_HOST, port=REDIS_PORT, db=0, password=REDIS_PASSWORD)

    def __del__(self):
        if hasattr(self, 'r'):
            self.r.close()

Redis에 Dataframe 넣기

Redis가 아쉽게도 Dataframe을 지원하지 않았다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class RedisClient:
    def __init__(self):
        self.r = redis.StrictRedis(host=REDIS_HOST, port=REDIS_PORT, db=0, password=REDIS_PASSWORD)

    def set_value(self, key, value):
        if isinstance(value, pl.DataFrame):
            value = pickle.dumps(value)
        self.r.set(key, value)

    def get_value(self, key):
        value = self.r.get(key)
        if value:
            try:
                return value.decode('utf-8')
            except UnicodeDecodeError:
                try:
                    return pickle.loads(value)
                except:
                    return value
        else:
            return None

    def del_value(self, key):
        self.r.delete(key)
    
    def __del__(self):
        if hasattr(self, 'r'):
            self.r.close()

위와 같은 코드로 Dataframe을 처리했다.

Redis 운영 관리 - RedisInsights

RedisInsights는 Redis에서 제공하는 GUI다.
Key, Memory, Network, Connection Client등을 확인할 수 있다.

Redis 운영 관리 - RMA

RMA는 Redis Memory Analyzer로 3가지 세주 정보를 지원한다.

우선 설치 방법은

1
pip install rma

을 통해서 설치할 수 있다.

1) global
rma -p 6379 -a password -b global
Global 모드에서는 Redis 서버 통계를 제공한다.

2) scanner
rma -p 6379 -a password -b scanner
Redis에 어떠한 키 유형이 저장되었는지 모를때 유용하다.
가장 많이 사용하는 데이터 구조가 무엇인지 알 수 있다.

3) ram
rma -p 6379 -a password -b ram
데이터 구조별 키 값으로 통계가 분리되어 출력된다.

그리고 위의 명령어를 한번에 실행하는 rma -p 6379 -a password -b all이 있다.