개발을 하면서 트랜잭션의 속도를 어떻게 하면 줄일 수 있을까? 고민하면서 찾아보면 Redis라는 시스템을 접하게 된다.
그럼 이 Redis는 무엇일까?
1. 레디스(Redis) 란?
Redis의 풀네임에서 할 수 있듯이
Java의 HashMap과 같은 key-value 형태의 Dictionary 비정형 데이터를 저장하고 관리하는 원격 서버를 말합니다.
1-1. 레디스의 핵심 기능
https://redis.io/ 공식 홈페이지에서는 Redis의 핵심기능을 다음과 같이 말하고 있습니다.
- Redis는 데이터베이스,캐시, 메시지 브로커 및 스트리밍 엔진으로 사용되는 오픈 소스(BSD 라이선스), 인메모리 데이터 구조 저장소 입니다.
- Redis는 문자열 , 해시 , 목록 , 집합 , 범위 쿼리가 있는 정렬된 집합 , 비트맵 , 하이퍼로그 로그 , 지리 공간 인덱스 및 스트림 과 같은 컬렉션을 제공합니다 .
- Redis에는 복제 , Lua 스크립팅 , LRU 축출 , 트랜잭션 및 다양한 수준의 디스크 지속성 이 내장되어 있으며 다음을 통해 고가용성을 제공합니다.
- Redis Sentinel 및 Redis 클러스터를 통한 자동 파티셔닝을 제공합니다.
1-2. 레디스 장점
레디스는 모든 데이터를 메모리에 저장하고 조회하는 인메모리 데이터베이스로 빠른 성능을 가지고 있습니다.
하지만 다른 인메모리 데이터베이스와 레디스의 차이점은 다양한 자료구조 입니다.
이렇게 다양한 자료구조를 지원하게 되면 개발의 편의성이 좋아지고 난이도가 낮아진다는 장점이 있습니다.
예를들어, 어떤 데이터를 정렬을 해야하는 상황이 있을 때, DBMS를 이용한다면 DB에 데이터를 저장하고, 저장된 데이터를 정렬하여 다시 읽어오는 과정은 디스크에 직접 접근을 해야하기 때문에 시간이 더 걸린다는 단점이 있습니다. 하지만 이 때 In-Memory 데이터베이스인 Redis를 이용하고 레디스에서 제공하는 Sorted-Set이라는 자료구조를 사용하면 더 빠르고 간단하게 데이터를 정렬할 수 있습니다.
1-3. Java는 HashMap이 있는데 Redis를 왜써?
Java 개발자라면 Redis를 처음 접하면, 'HashMap 쓰면 되지 굳이?'라는 생각이 들 수도 있습니다.
둘 다 key-value 기반이고, 메모리에 저장되며, 원하는 value를 object형식으로 저장할 수 있습니다.
서버가 1대 있다는 가정에서 Redis의 장점이 크게 보이지 않지만, 분산 환경을 대입하면 다릅니다.
유저 요청이 크게 늘어나 서버를 몇 대 증설하게 되면서 동일한 HashMap 형식의 데이터를 참조해야 하는 경를 생각해보겠습니다.
분산환경에서 원격 프로세스간 데이터를 동기화하기 어렵습니다.
이 때 별도의 레디스 서버를 구성하고, 해당 레디스에서 값을 꺼내 쓴다면 메모리 기반 데이터 구조의 빠른 응답성을 확보함과 동시에 데이터 불일치 문제를 해결할 수 있습니다.
2. 레디스 설치
2-1. 맥(Mac)
Mac에선 brew를 이용하여 redis를 간단하게 설치 할 수 있습니다.
brew install redis (Mac Redis 설치)
redis-server (Redis Server 실행)
redis-cli (Redis Client 접속)
brew services start redis (Redis 서비스 실행)
brew services stop redis (Redis 서비스 중지)
brew services restart redis (Redis 서비스 재시작)
2-1. AWS ElastiCache
AWS에서 ElastiCache를 이용하여 무중단 Redis 서버를 만들 수 있습니다.
(단, ElastiCache는 같은 VPC내에서만 접근 가능하기 때문에 로컬서버에서는 접속이 안되며 EC2에서 접속이 가능합니다.)
자세한 설치 방법은 아래 주소가 잘되어있습니다.
3. 레디스 간단 명령어
3-1. Set / Get
- set key value - 데이터 저장 ex) set key "hello"
- get key - key에 저장된 value 호출
3-2. append
- append - 저장된 key뒤에 문자열 추가
3-2. append
- sadd - Set 자료구조 형식으로 데이터 저장
- smembers - Set 자료구조 형식 데이터 호출 (순서 X)
3-3. sortedSet
- zadd - Set 자료구조 형식 + 가중치-값
- zrange - zadd로 저장된 데이터 출력 범위를 지정하여 출력
- -1 이면 뒤에서부터 시작
3-4. HashMap
- hset - Map 자료구조 형식으로 데이터 저장
- hgetall - Map 자료구조 형식 데이터 호출
[참고링크]