Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache, and message broker. Redis provides data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes, and streams.
Redis 란 무엇인가
- key-value 기반의 데이터베이스 저장소이다.
- 메모리를 이용하기 때문에 성능면에서 RDBMS를 훨씬 상회한다.
- 메모리를 이용하기 때문에 휘발성이다. 서비스 중단시 데이터가 사라진다.
- RDB, AOF 등의 기능을 이용하면 데이터를 백업해뒀다가 재기동시 복원할 수 있다.
- key-value 쌍 데이터의 만료시점을 지정하여 자동제거되게 할 수 있다.
- 할당된 용량 메모리를 초과할 경우 만료시점이 설정되지 않았어도 데이터가 손실된다.
- 기본 설정상 포트는 6379, 외부접근불가, 비번 없음 이며 redis.conf 파일을 통해 설정한다.
왜 쓰는 거야?
소올직히 아직 잘 모르겠다. 얼마나 빠르다는건지 아직은 감이 안 온다. 데이터 유실도 찝찝하다.
어쨋건 지금까지 내가 이해한 바로는 이럴 때 쓰면 유용하다.
바로 MSA 에서 인증용 API에 적용하는 거다.
Eureka Client 중 하나로 인증 관련 값을 보관하는 API를 하나 만드는 거다.
그래서 각각의 Eureka Client가 자신 안에 application.properties 파일로 값을 보관하는 것이 아니라
서비스 진입 시점에 인증용 API에 접근해서 마치 거기서 application.properties 내용을 가져오는 느낌이다.
이렇게 되면 각 Eureka Client의 application.properties 값을 하나의 API에서 동적으로 관리할 수 있게 된다.
특히 key-value 구조의 데이터에 대한 동시적 처리에 있어서는 Redis가 가장 자신있는 분야니까 말이다.
공홈의 성능예시를 보면 E5520이라는 8년전 출시된 CPU에서 초당 13만회 이상의 access를 처리했다.
그래도 물리 서버가 뒤지면 데이터가 유실될 가능성이 존재해서 그부분에 대해 신경써야 하니까 좀 찝찝하긴 하다.
Redis 자체 기능을 이용해서 백업할 수도 있지만
RDB기능의 경우 스냅샷을 위해 서비스를 일시적이나마 중단해야하고,
AOF의 경우 실행할 replay만큼 restart가 지연되니.. 아무리 둘을 재조합한다고 해도 신경쓰이지 않을 수 없다.
AWS EC2에 Redis 설치하기
오늘의 주제는 Redis에 대해 깊이 알아보는 것은 아니고
Redis를 소개하고 설치하고 사용하는 그 자체에 있으니까 우선은 진도를 나가보자.
Ubuntu 20.04 기준이다.
//최고권한 획득
sudo su
// 다운로드
wget http://download.redis.io/redis-stable.tar.gz
// 압축풀기
tar xvzf redis-stable.tar.gz
// 폴더 진입
cd redis-stable
// 인스톨
apt install make
// 설정
vi /etc/apt/sources.list -> main restricted 2개 뒤에 각각 universe multiverse 입력 후 저장
vi /home/ubuntu/redis-server/redis.conf
maxmemory 500m -> 최대메모리 설정
maxmemory-policy noeviction allkeys-lru -> 초과시 가장 안 쓰인 거 부터 제거하는 정책.
bind 0.0.0.0 -> 모든 IP 접근허용처리
port 6379 -> 포트 설정
// 업데이트, 실행
apt-get update
apt install redis-server -> Y 엔터
redis-server
redis-cli -> Redis CLI 접속
sudo service redis-server stop 실행중단
sudo service redis-server start 실행
systemctl status redis-server.service 상태확인
sudo systemctl restart redis-server.service // 재실행
Redis 기본 명령어
공홈의 학습페이지다. 아주 잘 만들어놨다. 기본 명령어를 금방 배울 수 있다.
학습한 내용을 정리해본다.
// 저장과 불러오기 : SET key value | GET key
SET server:name "fido" // server:name 이라는 key에 "fido"라는 string을 저장하는 명령.
GET server:name // "fido" 를 반환한다.
SET rich 32 // rich라는 key에 32를 저장한다. -> OK
GET rich // rich 라는 key에 있는 값을 요청한다. -> 32
// 전체 키 조회
keys *
// 키의 존재여부 확인 : EXISTS key -> 1 or 0
EXISTS server:name // server:name 이라는 키가 존재하는지 확인한다. 존재하면 1 부재하면 0
EXISTS server:blabla // 없는 key이므로 0을 반환한다.
// value가 존재하는지로는 사용할 수 없는 듯하다. EXISTS "fido" EXISTS fido 둘다 0이 반환됐다.
// key-value 제거하기 : DEL key
DEL rich // rich key를 value와 함께 제거한다. -> (integer) 1
DEL rich // 위에서 이미 제거했으므로 에러는 나지 않지만 반환값이 다름 -> (integer) 0
// 정수값 증가시키기 : INCR key | INCRBY key 더하기원하는수 ( 단, 정수형이어야 하고, 범위 내여야 한다. )
INCR rich // -> (integer) 33
INCR rich // -> (integer) 34
// 만약 rich key에 저장된 값이 정수형 데이터가 아닐 경우 에러가 반환된다.
INCRBY rich 100 // -> (integer) 134
// 정수값 감소시키기 : DECR key | DECRBY key 빼기원하는수 ( 단, 정수형이어야 하고, 범위 내여야 한다. )
DECR rich // -> (integer) 133
DECRBY rich 101 // -> (integer) 32
//INCR, INCRBY 명령어를 사용해야 concurrent access 문제로부터 자유로울 수 있다.
x = GET rich
x = x + 1
SET rich x
//위와 같은 코드가 가능은 하지만 동시접속시 문제가 발생하기 때문에 INCR을 사용하자.
// 생명주기 설정하기 : EXPIRE key 시간(초) 으로 생명주기 설정 TTL key 시간(밀리초) 으로 생명주기 확인
// SET 명령어를 이용할 경우 해당 key에 대한 TTL은 리셋된다.
// TTL은 Time to live 의 약자이다.
SET rich:age 33;
EXPIRE rich:age 10;
//(1초 후)
TTL rich:age // -> 9
//(20초 후)
TTL rich:age // -> -2 : -2는 생명주기 만료 제거되었음을 의미.
SET rich:age 34; // SET을 사용했기 때문에 EXPIRE 설정이 RESET된다 ( Default는 -1. 즉 제거되지 않음 )
TTL rich:age // -1 : -1은 제거되지 않을 것이라는 의미.
// SET에 EXPIRE 파라미터 같이 전달하기
SET rich:age 32 EX 10 // rich:age 키에 32 라는 값을 넣되, EXPIRE 설정을 10초로 설정한다.
// EXPIRE 설정했던 것 취소하기 : PERSIST 키이름
SET rich:age 32 EX 100
PERSIST rich:age
TTL rich:age // -1 제거예정없음. -2만료로 제거됨. 양수면 해당 초만큼 생명 남음.
'Server & Infra' 카테고리의 다른 글
Github Actions 를 이용한 CI 테스트 자동화 (2) | 2022.07.27 |
---|---|
AWS EC2에 오라클 설치, 접속, Scott&HR 활성화 (0) | 2021.01.24 |
AWS EC2에 설치해둔 Redis에 GUI툴로 접속하기, Java에서 접속하기 (0) | 2021.01.24 |
AWS RDS MySQL 서버 시간 변경 (0) | 2020.08.07 |
EC2 t2.micro 인스턴스 재부팅 후 jupyter notebook 재설정 (0) | 2020.08.07 |