레디스) 레디스 세팅 및 기본 사용법
0. redis 공부 이유
- 오픈 소스를 활용해, 자체 프로그램을 개발하기 위해 공부하게 되었다. kafka와 마찬가지로 짬이 난 김에 정리해두려 한다.
1. redis 란?
- 오픈소스 인메모리 데이터 저장소
- 인메모리란? 즉, RAM에 저장 시킴으로써, Disk I/O 문제를 일으키지 않고, 빠른 송수신이 가능하게 한다. 단, 영구적으로 저장되지 않기에 휘발성 메모리라, 데이터 영구 저장 시, 별도 데이터베이스가 필요하다.
- 빠른 속도와 다양한 자료구조 지원 (string, list, set 등)
- 캐시, 세션 관리, 메시지 큐 등에 활용
- 혼자 생각 해보는 최대 장단점 : 최우선적으로 설치와 사용이 쉽다……..
- IPC(Inter-Process Communication) 등의 프로세스 간 통신에서 shm(Shared Memory)의 좋은 대체제
- 단점 : shm은 OS 커널 레벨에서 직접 메모리 공유하는 방식인데 반해, Redis는 네트워크를 통한 접근하는 별도의 프로세스로 약간의 네트워크 오버헤드가 존재하며, 상대적으로 느릴 수 밖에 없다.
- 장점 : redis가 별도의 프로세스로 존재하기에 한 서버 내에 다중 redis를 올려, 쉽게 격리 시킬 수 있으며, Python, Go, Java 등 다른 language로 작성된 프로세스 간 IPC에 편리한 인터페이스를 제공한다.
- 동시성 제어 : Redis의 원자성(Atomicity) 보장
- 장점 : 싱글 스레드 구조로 여러 클라이언트가 동시에 요청하더라도, 명령어의 실행 순서는 보장된다. 즉, 한 번에 하나의 명령어를 처리함으로써, 명령의 순서와 원자성을 보장한다.(근데 생각 외로… 엄청나게 빠르다.. 초당 8만건 이상 가능하다고 한다…)
- 단점 : Race Condition이 발생할 수 있다. 즉, 현재 읽는 데이터가 최신 데이터가 아닐 수 있다.(데이터 조회 작업 시, 별도 클라이언트가 데이터 업데이트 명령이 들어오더라도 이는 후 순위 명령이기에 이는, 조회 되는 데이터가 최신 데이터가 아닐 수 있음을 뜻한다.)
- *Race Condition : 둘 이상의 스레드나 프로세스가 동시에 같은 공유 자원에 접근해 작업
- IPC(Inter-Process Communication) 등의 프로세스 간 통신에서 shm(Shared Memory)의 좋은 대체제
2. redis 설치
- Ubuntu:
sudo apt-get update && sudo apt-get install redis-server
dev@0a229da298da:/$ sudo apt-get update && sudo apt-get install redis-server [sudo] password for dev: ## ssh + sudo로 설치한거라 뜬다. Get:1 http://security.ubuntu.com/ubuntu focal-security InRelease [128 kB] Hit:2 http://archive.ubuntu.com/ubuntu focal InRelease Get:3 http://archive.ubuntu.com/ubuntu focal-updates InRelease [128 kB] Get:4 http://archive.ubuntu.com/ubuntu focal-backports InRelease [128 kB] Get:5 http://security.ubuntu.com/ubuntu focal-security/restricted amd64 Packages [4801 kB] Get:6 http://archive.ubuntu.com/ubuntu focal-updates/universe amd64 Packages [1599 kB] Get:7 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages [4919 kB] Get:8 http://archive.ubuntu.com/ubuntu focal-updates/restricted amd64 Packages [4998 kB] Get:9 http://archive.ubuntu.com/ubuntu focal-updates/multiverse amd64 Packages [36.8 kB] Get:10 http://security.ubuntu.com/ubuntu focal-security/multiverse amd64 Packages [33.1 kB] Get:11 http://security.ubuntu.com/ubuntu focal-security/universe amd64 Packages [1308 kB] Get:12 http://security.ubuntu.com/ubuntu focal-security/main amd64 Packages [4432 kB] . . . Created symlink /etc/systemd/system/redis.service → /lib/systemd/system/redis-server.service. Created symlink /etc/systemd/system/multi-user.target.wants/redis-server.service → /lib/systemd/system/redis-server.service. Processing triggers for systemd (245.4-4ubuntu3.24) ... Processing triggers for libc-bin (2.31-0ubuntu9.16) ...
3. redis 실행
1) 옵션 설정 파일
- 위치 :
/etc/redis/redis.conf
- 주요 설정 예시
port 6379 <포트설정> bind 127.0.0.1 <IP설정> requirepass strongpassword <접속 시, password요청> maxmemory 256mb <최대 메모리 사용 제한> maxmemory-policy allkeys-lru <메모리 관리를 위한 키삭제정책> save 900 1 <snapshot 저장 시점 설정(900초)> : 디스크에 데이터 저장 appendonly yes <AOF(Append Only File) 방식 활성화> : 모든 쓰기 명령 기록 appendfilename "appendonly.aof" <AOF 로그 파일 이름 지정>
2) redis 서버 시작
sudo redis-server /etc/redis/redis.conf
- 실행 확인
dev@0a229da298da:/$ ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 2352 0.1 0.1 47228 12104 ? Ssl 19:46 0:00 redis-server 127.0.0.1:6379
3) redis 사용 하기
- redis-cli 입력
dev@0a229da298da:/$ redis-cli 127.0.0.1:6379> PING PONG 127.0.0.1:6379> SET mykey "hello" OK 127.0.0.1:6379> GET mykey "hello" 127.0.0.1:6379>
4) redis 자료형 별 명령어 모음
문자열(String)
- 가장 기본 데이터 타입으로 문자, 숫자, 바이너리 등이 저장 가능
- 주요 명령어
SET key value
: 키에 값 저장GET key
: 키 값 조회MSET key1 val1 key2 val2
: 여러 키-값 한번에 저장MGET key1 key2
: 여러 키 값 조회INCR key
: 키 값 1 증가DECR key
: 키 값 1 감소APPEND key value
: 기존 값에 문자열 추가
리스트(List)
- 순서 있는 문자열의 시퀀스, 중복 허용
- 주요 명령어
LPUSH key value
: 왼쪽에 값 추가RPUSH key value
: 오른쪽에 값 추가LPOP key
: 왼쪽 값 제거 및 반환RPOP key
: 오른쪽 값 제거 및 반환LRANGE key start stop
: 범위 내 값 조회
집합(Set)
- 중복 없는 순서 없는 문자열 집합
- 주요 명령어
SADD key member
: 집합에 멤버 추가SREM key member
: 멤버 제거SMEMBERS key
: 모든 멤버 조회SISMEMBER key member
: 멤버 존재 여부 확인
정렬된 집합 (Sorted Set)
- 멤버에 점수(score)를 부여해 정렬된 집합
- 개인 생각 : kafka로 여러 파티션으로 나눈 뒤, 데이터를 읽을 때 순서가 보장되지 않기에, 함께 활용하면 좋은 듯 하다.
- 주요 명령어
ZADD key score member
: 멤버와 점수 추가ZRANGE key start stop [WITHSCORES]
: 순위 범위 내 멤버 조회ZREM key member
: 멤버 제거ZSCORE key member
: 멤버 점수 조회
해시 (Hash)
- 필드-값 쌍으로 구성된 맵(객체 저장에 적합)
- 개인 생각 : json형태를 자주 활용해 No sql마냥 쓰기도 하는 듯하다.
- 주요 명령어
HSET key field value
: 필드에 값 저장HGET key field
: 필드 값 조회HGETALL key
: 전체 필드와 값 조회HDEL key field
: 필드 제거HEXISTS key field
: 필드 존재 여부 확인
채널 (Channel)
- 1대다 메시지 전달에 유용한 Pub/Sub (게시/구독) 모델 지원
- 주요 명령어
SUBSCRIBE channel [channel ...]
: 하나 이상의 채널 구독 시작PSUBSCRIBE pattern [pattern ...]
: 패턴으로 여러 채널 구독PUBLISH channel message
: 채널에 메시지 발행, 구독자에게 전달UNSUBSCRIBE [channel [channel ...]]
: 채널 구독 해제 (인자 없으면 모두 해제)PUNSUBSCRIBE [pattern [pattern ...]]
: 패턴 구독 해제PUBSUB CHANNELS [pattern]
: 활성화된 채널 목록 조회, 패턴 필터 가능PUBSUB NUMSUB channel [channel ...]
: 각 채널별 구독자 수 조회PUBSUB NUMPAT
: 패턴형 구독자 수 조회스트림 (Stream)
- 메시지 시퀀스 저장, 시계열 데이터에 활용
- 주요 명령어
XADD key ID field value [field value ...]
: 메시지 추가 (ID
는*
로 자동생성 가능)XRANGE key start end [COUNT count]
: 범위 내 메시지 조회XREAD [COUNT count] STREAMS key ID
: 스트림에서 메시지 읽기XDEL key ID [ID ...]
: 메시지 삭제
댓글남기기