Redis란 무엇인가
Intro
개인 프로젝트 리팩토링 중 첫 번째로 Access Token, Refresh Token을 이용한 인증을 구현해보려 한다.
그전에 Redis에 대해서 알아보자!
Redis란?
Redis는 NoSql In-memory database이다. 주로 캐싱, 세션 관리 등의 용도로 사용된다. Redis는 키-값 형태로 메모리에 저장된다.
메모리의 경우 전기적 신호를 통해 데이터에 직접 접근하기 때문에 빠른 데이터 액세스가 가능하다. 또한 메모리접근이 디스크 접근보다 더 빠른데, 메모리의 경우 디스크에 비해 물리적으로 cpu와 더 가깝기 때문이다.
이러한 이유로 인해 디스크 기반의 데이터베이스보다 Redis의 속도가 더 빠르다고 할 수 있다.
Redis 설치하기
Redis 공식 문서에 따르면 Redis는 Windows에서 공식적으로 지원되지 않는다고 한다.(ㅠㅠ) 따라서 윈도우 운영체제인 나는 wsl설치 후에 redis를 설치하였다.
wsl & Redis 설치
해당 사이트에 기재된 순서대로 PowerShell(도 없어서 다운받음...)에서 wsl을 다운로드한다.
wsl --install 명령어를 이용하여 다운로드한 Linux의 배포판은 기본적으로 Ubuntu라고 한다. Redis 공식문서에 따르면 Ubuntu 또는 Debian기준으로 설명이 되어있어서 배포판 변경 없이 진행했다.
이후 ubuntu 계정과 비밀번호를 설정하였고 ubuntu를 실행하여 Redis 설치를 진행하였다.
마찬가지로 해당 사이트에 기재된 순서대로 설치하였고 Redis CLI로 연결하여 Redis 서버가 실행 중인지 테스트까지 완료하였다.
docker에서 실행
Redis를 열심히 로컬에 설치하고 나니 Docker에서 실행하는 방법도 있었다. (왜 이 생각을 못했을까ㅋㅋ)
그리고 생각해 보니 실제 사용 시에는 대부분 Docker를 이용해서 사용할 것 같다.
아래의 코드를 이용하여 docker로 redis 이미지를 다운로드하고 실행시키면 된다. (넘모 간단해서 눈물이 난다)
docker run -p 6379:6379 redis
Redis 직접 사용해 보기
SELECT [index]
SET [key] [value]
GET [key]
DLE [key]
EXISTS [key]
DBSIZE
SELECT
기본적으로 Redis는 내부에 16개(0~15 index)의 데이터베이스(RDB의 데이터베이스 개념과는 좀 다름)가 존재한다. 찾아보니 redis의 데이터베이스는 RDB의 데이터베이스처럼 직접 생성할 수는 없다고 한다. 그리고 따로 설정하지 않고 값을 넣으면 0 index의 데이터베이스에 값이 저장된다. 원하는 데이터 베이스에 접근하는 방법은 두 가지가 있다.
- redis-cli에 접근하여 select [index] 명령어 사용하여 해당 데이터베이스에 접근
- redis-cli -n [index] 명령어 사용하여 해당 데이터베이스로 바로 접근
사용해 보니 2번의 방법은 처음 접근할 때만 사용되므로 1번의 방법이 많이 사용될 것 같다.
SET
값을 넣는 명령어는 SET을 사용하는데, 해당 명령어에는 데이터베이스 인덱스 선택 옵션이 없다. 따라서 원하는 인덱스의 데이터베이스를 지정하여 값을 넣는 방법은, SELECT 명령어를 이용한 후 SET 명령어로 값을 넣는 방법밖에는 없다고 한다.
그리고 redis의 경우 값 수정 명령어가 따로 없다. SET을 통해 키와 값을 저장할 때 데이터베이스에 해당 키가 존재할 경우 새로운 값으로 덮어쓰기 된다. 그래서인지 SET에는 그와 관련된 두 가지 옵션을 제공한다.
- NX : 존재하지 않는 키일 때만 해당 값을 저장하는 옵션
- XX : 존재하는 키일 때만 해당 값을 기존 값에 덮어씌우는 옵션
또 다른 옵션으로는 만료 시간을 지정하는 옵션들이 있다.
- EX : 만료 시간을 초 단위로 지정
- PX : 만료 시간을 밀리초 단위로 지정
- KEEPTTL : 키의 TTL(Time-To-Live)은 유지되고 값만 변경됨
KEEPTTL 명령어에 대한 설명을 덧붙이자면, 예를 들어 만료시간이 지정된 키가 저장되어 있다고 가정해 보자. 해당 키의 값을 만료시간 지정 없이 SET 명령어를 이용하여 수정(덮어쓰기)할 경우, 해당 키는 만료시간이 없는 키가 되어버린다. 아예 새로운 키가 되어버리는 것이다. 만약 만료시간을 그대로 유지하고 싶다면 KEEPTTL을 사용하여 해당 값을 수정하면 된다.
GET
값을 찾는 명령어는 GET을 사용한다. 해당하는 키의 값을 찾는 데에만 사용되기 때문에 추가적인 옵션은 없다.
DEL
해당 키와 관련된 데이터를 제거하는 명령어이다. DEL 명령어 이후에 공백을 구분자로 하여 여러 개의 키를 작성하면 해당되는 키와 값들이 한 번에 삭제된다.
EXISTS
해당 데이터베이스에 찾는 키의 존재 여부를 확인할 수 있는 명령어이다. 존재하면 1을 반환하고 존재하지 않으면 0을 반환한다. GET 명령어와 마찬가지로 해당 키의 존재 여부만을 확인하기 때문에 추가적인 옵션은 없다.
DBSIZE
해당 데이터베이스에 저장된 키-값의 개수를 반환하는 명령어이다. 마찬가지로 SELECT 명령어로 원하는 데이터베이스로 이동한 후 DBSIZE 명령어를 통해 저장된 키-값을 확인할 수 있다.
결론
의도치 않게 redis를 로컬환경에서도 사용해 보고 Docker container를 이용해서도 사용해 보게 되었다. 아무래도 Redis-cli를 직접 사용할 일은 test할 때 외에는 없을 것 같기에 이 정도만 알아도 충분할 것이라고 생각이 든다. 해당 명령어들을 공부하며 이런 원리로 사용되겠구나를 알게 되었다. 나머지는 실제 Spring Boot 프로젝트에 연동하면서 차근차근 알아가야 할 것 같다.
참고