Redis 란 ?
레디스(Redis)는 REmote Dictionary Sever의 줄임말로 메모리 기반의 저장소 입니다.
레디스는 RAM에 데이터를 저장하여 데이터를 더 빠르게 처리할 수 있습니다.
데이터베이스와 다르게 Key-Value 데이터 구조로 데이터를 저장하고 다양한 자료 구조를 저장할 수 있는 NoSQL 구조로 되어 있습니다.
Redis를 왜 사용할까?
일반적인 관계형 데이터 베이스는 영속성을 제공하는데 목적을 두고 있고, 데이터가 사라지지 않게 하기 위해서 파일시스템(SSD 또는 HDD) 에 저장합니다. 따라서 컴퓨터가 종료되어도 데이터가 사라지지 않지만 데이터를 읽고 쓰는데 오래 걸립니다
반면, Redis는 RAM에 데이터를 저장하기 때문에, 복잡한 입출력 과정이 필요하지 않고 RDB 에 비해 더 빠르게 동작합니다. 대신, 휘발성으로 데이터가 언제든 사라질 수 있다는 특징을 가지고 있습니다. 따라서,일시적인 데이터, 변경이 잦은 데이터를 다루는 상황에서 많이 사용됩니다.
=> Redis는 세션, 장바구니, 조회 수 와 같은 시간이 지나면 삭제 되는 데이터를 저장 하기 위해서 많이 사용합니다. 데이터 캐시 기능에 많이 사용.
Redis 활용 사례
- Session Clustering: 여러 애플리케이션 인스턴스에서 같은 정보를 사용할 수 있도록 도와줍니다.
- Caching: 자주 사용되는 데이터를 저장해 두어, 데이터베이스 조회를 줄이고 응답속도를 개선합니다.
- 다양한 자료구조를 바탕으로 리더보드, 방문자수 트래킹, 좌표 기반 검색 등을 쉽게 구현 할 수 있습니다.
Docker에 Redis 설치 하기
Windows 로컬 환경에서 Redis 3버전 이후로 windows 환경에 직접 설치 하는 버전이 지원하지 않기 때문에 가상화 환경인 Docker로 Redis 실습 환경을 셋팅하겠습니다.
1. 빈폴더를 만들고, docker-compose.yml 작성
services:
redis-stack:
image: redis/redis-stack
container_name: redis-stack-compose
restart: always
environment:
REDIS_ARGS: "--requirepass redispassword"
ports:
- 6379:6379
- 8001:8001
REDIS_ARGS: "--requirepas 레디스접속비밀번호"
port 6379: redis DB 포트 번호
port 8081: Redis Insight(데이터 저장소 화) 포트 번호
2. docker-compose.yml 폴더 경로로 이동 후 명령어 실
docker compose up -d
3. Redis 연결 확인
사용자 기본 이름: default
=> Docker 컨테이너로 실행되는 Redis에 잘 접속 되었다면 Redis 연결 성공!
Redis 명령어 학습하기
Redis는 Key - Value 데이터베이스 구조로 Key를 바탕으로 동작하며, Value로 사용하고자 하는 자료형에 따라 다른 명령어를 사용합니다.
단, 이미 만든 Key에 해당하는 데이터와 다른 자료형의 명령을 사용하는 경우 오류가 발생합니다.
1. String 데이터 읽고 쓰기
-- String
-- <명령어> <key>
SET user:email yellowBean@example.com
GET user:email
-- 정수가 문자열로 저장된 경우
-- INCR, DECR: ++, -- => 조회 수 기능
SET user:count 1
GET user:count
INCR user:count
DECR user:count
GET user:count
-- MSET, MGET
-- 여러개를 한번에 write, read
MSET user:name alex user:email alex@example.com
MGET user:name user:email
SET <key> <Value> : String 데이터를 Key 에 Value 저장
GET <Key>: Key 저장된 문자열 반환
MSET <Key> <Value> ... : 한번에 여러개 데이터 저장
MGET <Key> : 한번에 여러개 데이터 읽기
2. Int 타입(정수 타입) 문자열
-- 정수가 문자열로 저장된 경우
-- INCR, DECR: ++, -- => 조회 수 기능
SET user:count 1
GET user:count
INCR user:count
DECR user:count
GET user:count
INCR <kEY>: kEY 에 저장된 데이터 1 증가
DECR <Key>: Key에 저장된 데이터 1 감소
3. List
Linked List 형태로 보관하는 자료형,
Stack or Queque 자료형으로 사용.
push, pop 을 통해서 데이터를 변경 할 수 있습니다.
-- List: Linked List
-- 스택, 큐
-- Push, Pop -> 왼쪽(L)이냐 오른쪽이냐(R) 이냐
LPUSH user:list alex
LPUSH user:list bread
RPUSH user:list chad
RPUSH user:list dave
-- bread alex chad dave
--bread / dave
LPOP user:list
RPOP user:list
--LLEN: 리스트의 크기
LLEN user:list
-- 크기보다 더 큰 숫자
LRANGE user:list 0 3
LRANGE user:list 0 1000000
-- 음수 index
LRANGE user:list 0 -1
LRANGE user:list 0 -2
-- end < start
LRANGE user:list 1 0
XPUSH <Key> <Value> : 왼쪽(L) , 오른쪽(R) 으로 삽입 할건지
XPOP <Key> : 왼쪽(L) , 오른쪽(R) 으로 데이터를 꺼낼지
LRAMGE <Key> <Start> <End> : Start 에서 End 범위까지의 데이터 불러오기
4. SET
SET은 문자열들의 집합입니다. 집합인 만큼 데이터의 중복값을 제거하고, 순서가 존재하지 않습니
-- Set: (문자열)의 집합 자료형
-- 중복을 허용하지 않는다.
-- 중복을 허용하지 않는 방문자 수 세기
-- URL을 키로 만들고 사용자 ID를 넣어준다.
-- JWT 인증 토큰 블랙리스트
-- SISMEMEBER: O(1)
SADD user:java alex
SADD user:java brad
SADD user:java chad
SREM user:java alex
-- 요소가 있는지 확인
SISMEMBER user:java bred
SISMEMBER user:java dave
-- 집합의 요소 전체 보기
SMEMBERS user:java
-- 요소의 길이
SCARD user:java
--교집합 합집합
SADD user:python alex
SADD user:python dave
SADD user:java alex
-- 교집합
SINTER user:java user:python
-- 합집합
SUNION user:java user:python
-- 교집합의 갯수
SINTERCARD 2 user:java user:python
SADD <Key> <Value> : Key에 해당하는 집합에 value 추가
SREM <Key> <Value>: Key에 저장돤 Value 제거
SISMEMEMBER <Key> <Value> : Key 에 저장된 집합에 Value가 존재하는지 반환
SCARD Key: Key에 저장된 집합의 길이(크기)
SINTER <Key> <Key>: 교집합의 원소를 반환
SUNION <Key> <Key>: 저장된 집합의 합집합 반환
SINTERCARD <Number> <key> [Key2...]: number개의 Key에 저장된 집합들의 크기들을 반환
4. Hash
Field - Value 쌍으로 이루어진 자료형.
Java에서 Map<String, Map<String, String> > 의 형식으로 생각할 수 있습니다.
-- Hash
-- Field - value Pair
-- hashCode()
-- Map< String, Map<String, String>
-- key를 만들고 field value 복수개
HSET user:alex name alex age 25
HSET user:alex major CSE
-- hash key 와 field
HGET user:alex name
HGET user:alex age
-- 복수개 조회
HMGET user:alex age major
HGETALL user:alex
HKEYS user:alex
HLEN user:alex
-- 장바구니, 세션정보
HSET cart:alex computer 1 mouse 2 keyboard 10
HSET <Key> <Value> : key 를 생성하고 field value 복수개
HGET <Key> <Field> : Key에 해당하는 field 조회
5. Sorted Set
정렬된 집합으로 Set 과 동일하게 중복을 허용하지 않지만, score라는 실수와 함께 보관 합니다.
score를 바탕으로 정렬한 값들에 대해 가져올 수 있습니다,.
-- Sorted Set
-- 정렬된 집합: 중복되지 않는 데이터 + 점수
-- ZADD key score value
ZADD user:ranks 10 alex
ZADD user:ranks 9 brad 11 chad
ZADD user:ranks 8 dave
ZADD user:ranks 9.5 eric
-- score 증가
ZINCRBY user:ranks 2 alex
-- 순서
ZRANK user:ranks alex
ZRANK user:ranks dave
ZRANK user:ranks eric
ZREVRANK user:ranks alex
ZRANGE user:ranks 0 3
ZREVRANGE user:ranks 0 2
-- 순위표 , Rate Limiter => 과도한 요청 거부
6. 기타
-- DEL: key 삭제하기
SET somekey "to be deleted"
DEL somekey
DEL user:list
DEL user:python
--EXPIRE : 만료시간 설정
SET expriekey "to be expired"
-- 50초 뒤 사라 짐
EXPIRE expriekey 50
EXPIRE user:alex 10
-- unixtimestamp
EXPIRETIME expriekey
--KEYS: Key를 검색한다.
KEYS *
-- FLUSHDB : 모든키 삭제
FLUSHDB
마무리
Redis 는 보통 캐싱을 위해서 사용된다. 라고 개념적으로 알고 있었고 어떻게 언제 사용될지에 대해 잘 몰랐다.
이번 학습을 통해 언제 Redis가 사용되는지 알게 되었다.
json 객체를 많이 다뤄봐서 key-value 에 대한 이해가 있어서 Redis를 빠르게 이해 할 수 있었던것 같다.
Redis를 이용해서 JWT 를 관리하는 인가/인증 방식을 적용해 보고 싶다.
'Programing > Spring' 카테고리의 다른 글
Spring Cloud 학습 (0) | 2025.02.12 |
---|---|
Spring JPA 관계 이해하기 (0) | 2025.02.07 |
Spring Bean 수동 등록하기 + 같은 타입의 Bean이 여러개 라면? (1) | 2025.02.05 |
Spring JPA Auditing 적용해 보기 (1) | 2025.02.04 |