Redis(이하 레디스)
는 인메모리 데이터베이스(In-Memory Database)
입니다. 주로 빠른 응답 속도를 요구하는 캐시나 세션 관리, 실시간 시스템에서 사용됩니다.
인메모리 데이터베이스
는 데이터를 RAM
에 저장하고 처리함으로서 아주 빠른 읽기/쓰기 속도를 제공하는 데이터베이스입니다. 기존의 MySQL과 같은 DB들은 데이터를 HDD/SSD에 저장하기 때문에 인메모리 방식보다 속도가 느릴 수밖에 없습니다.
RAM의 속도는 엄청나게 빠르지만 전원 차단 시 휘발된다는 특징이 있어 갑작스러운 전원 공급 차단 장애에는 취약할수도 있습니다. 레디스는 이러한 문제점을 보완하기 위해 AOF/RDB라는 방식을 제공하고 있습니다.
- AOF: Append Only file, 레디스의 모든 쓰기 명령을 로그에 순차 저장
- RDB: Redis Database Snapshot, 일정 시점마다 메모리의 데이터 전체를 스냅샷 형태로 디스크에 저장
레디스는 다음과 같은 특징들을 가지고 있습니다.
인메모리 데이터베이스
RAM을 이용하므로 읽기 쓰기 속도가 매우 빠릅니다. 또한 데이터를 RAM에 저장하고 필요 시 디스크에 백업합니다.
일반적인 요청에 대한 응답 속도가 1ms 미만이라 대규모 분산 처리 시스템에서 자주 사용됩니다.
다양한 데이터 구조
레디스는 키-값 쌍
의 데이터 구조를 사용합니다. 이 외에도 String, List, Set, Hash, Stream
과 같은 다양한 데이터 구조를 제공합니다.
영속성
기본적으로 데이터를 RAM에 저장하지만 필요 시 영속성 보장을 위해 데이터를 디스크에 저장합니다. 위에서 설명한 AOF/RDB가 영속성을 보장하기 위한 방식입니다.
NoSQL
쿼리문을 사용하지 않고 명령어를 사용하여 간단하게 레디스를 조작합니다.
고가용성과 분산 처리
주종(Master-Slave) 관계와 Sentinel을 통한 자동 장애 조치를 이용한 고가용성 확보, Sharding 기반의 분산 처리를 제공합니다.
Windows 환경을 기준으로 설명합니다.
Windows 운영체제를 위한 레디스는 따로 준비되어 있지 않습니다. 그래서 이 경우에는 WSL2(Windows Subsysyem for Linux)
를 사용하거나 Docker
를 이용해야하는데 WSL2는 다소 번거로워서 도커 사용을 권장드립니다.
WSL2를 사용하시고 싶으신 분들은 공식 문서의 안내를 따라가시면 됩니다.
또한 Docker 사용법은 모르시는 분들은 제 블로그의 도커 포스트 시리즈를 참조하시고 오시면 됩니다.
다음 명령어를 통해 레디스 이미지를 다운 받고 local-redis
라는 이름으로 실행할 수 있도록 합니다.
docker pull redis
docker run --name redis-local -d -p 6379:6379 redis
docker exec -it redis-local redis-cli #redis cli 접속
레디스를 조작하기 위한 명령어들을 간단하게 알아보겠습니다. 입문 레벨 그리고 자주 사용될 명령어들만 명시했습니다.
전체 명령어는 공식 문서를 참조해주세요.
CMD 상에서 레디스를 조작하기 위해 Redis CLI에 접속하는 과정입니다. 도커를 통해 레디스 컨테이너로 실행한 경우의 한해 다음 명령어를 사용합니다.
docker run --name redis-local -d -p 6379:6379 redis
docker exec -it redis-local redis-cli #redis cli 접속
기타 환경에서는
redis-cli
를 입력하시면 됩니다.
접속 후 PING
이라는 명령을 보냈을 때 PONG
이라는 대답이 돌아오면 접속에 성공한 것 입니다.
String
은 키-값
쌍을 통해 문자열 또는 숫자를 저장하는 데이터 구조입니다.
set key value # 값 저장
get key # 값 조회
del key # 키 삭제
exists key # 키 존재 여부 (0: 없음, 1: 있음)
incr key # 숫자 값 1 증가
decr key # 숫자 값 1 감소
List
는 큐, 스택 자료구조와 같이 이용할 수 있는 데이터 구조입니다.
lpush mylist A B # 왼쪽에 값 추가 (B, A 순으로 들어감)
rpush mylist C D # 오른쪽에 값 추가 (C, D 순으로 들어감)
lrange mylist 0 -1 # 전체 리스트 조회
lpop mylist # 왼쪽 값 꺼내기
rpop mylist # 오른쪽 값 꺼내기
Set
은 중복 없는 데이터 집합입니다.
sadd myset A B C # 값 추가
smembers myset # 모든 값 조회
sismember myset A # 값 존재 여부 확인 (1: 있음, 0: 없음)
srem myset B # 값 삭제
SortedSet(ZSet)
은 정렬된 집합입니다. Set과는 실행 명령이 다름에 주의해주세요.
zadd scores 100 user1 # 점수 100으로 user1 추가
zadd scores 200 user2 # 점수 200으로 user2 추가
zrange scores 0 -1 withscores # 낮은 점수순 조회
zrevrange scores 0 -1 withscores # 높은 점수순 조회
Hash
는 객체와 비슷한 필드-값
으로 데이터를 저장하는 구조입니다.
hset user:1 name "Alice" age 25 # 여러 필드 값 추가
hget user:1 name # 특정 필드 조회
hgetall user:1 # 전체 조회
hdel user:1 age # 필드 삭제
레디스에 저장된 키를 관리하는 명령어들입니다.
keys * # 모든 키 조회
expire key n # 키를 n초 후 자동 삭제
ttl key # 키의 남은 만료 시간 확인
flushall # 모든 데이터 삭제