TIL
🗃️Redis 명령어
초비비
2025. 3. 31. 21:39
Redis 명령어에 대해서 알아보자!
Redis는 엄청 큰 java의 맵이라고 생각하면 Redis 사용이 좀 더 쉬울 수 있음!
String 자료형
-- String
-- <명령어> <Key> ~~~
SET user:email alex@example.com #문자열 자료형을 설정
GET user:email #문자열 데이터를 가져오기
-- 정수가 문자열로 저장된 경우
-- INCR, DECR : ++, --
-- INCR, DECR : 조회할 때 마다 사용할 수 있음 (조회수)
SET user:count 1
GET user:count
INCR user:count #정수처럼 쓸 수 있는 명령어/ 데이터를 1 증가시킴 (increment)
GET user:count #value 2
DECR user:count #데이터를 1 감소시킴 (decrement)
GET user:count #value 1
-- 여러개 데이터를 다룰 때
-- MSET, MGET
MSET user:name alex user:email alex@example.com #<Key> <Value> <Key> <Value> ..
MEGT user:name user:email #<Key> <Key> ..
-- 문자열 -> toCharArray(), toByteArray()
-- 문자열 -> 이미지, 음성, 영상, 파일, HTML ...(512MB)
LIST
Linked List 구현체
- 소셜 네트워크의 Timeline에 많이 쓰임
- 구) 트위터의 타임라인
- Worker Queue 같은 것들을 구성을 하는데도 사용
- Worker Queue : 여러 Worker Application에게 일을 분배하기 위해 사용하는 Queue
-- List: Linked List 구현체
-- 스택, 큐
-- Push, Pop -> 왼쪽(L)이냐 오른쪽(R)이냐
LPUSH user:list alex
LPUSH user:list brad
-- brad 1번, alex 2번
RPUSH user:list chad
RPUSH user:list dave
-- brad 1번, alex 2번, chad 3번, dave 4번
LPOP user:list -- brad
RPOP user:list -- dave
-- LLEN : 리스트의 크기
LLEN user:list -- 2
-- 크기보다 더 큰 숫자
LRANGE user:list 0 3 --시작indes 끝index --끝index가 더 큰 숫자를 해도 오류가 발생하지 않음--범위에 있는 리스트만 반환
-- 음수 index
LRANGE user:list 0 -1
LRANGE user:list 0 -2
-- end < start
LRANGE user:list 1 0 -- 빈 리스트 반환
-- -*-*- 💡키에 저장된 자료형이 다를 경우 오류가 발생함 -*-*- --
GET user:list --WRONGTYPE Openration against a key holding the wrong kind of value
-- 이유 : Redis는 명령어가 자료형에 따라서 정해져 있음
-- 문자열 데이터에 해당하는 GET 명렁어는 리스트 데이터에 사용할 수 없는 것
LPOP user:name
-- 마찬가지로 LPOP과 같은 list 명령어를 문자열을 담고 있는 key에 사용할 수 없음
GET user:null
-- 문제가 발생하지 않고 null을 반환
-- 따라서, 해당하는 키가 다른 자료형(데이터)을 담고 있을 때만 문제가 됨
SET
집합 자료형
- 방문자 수, 조회수 같은 것을 트래킹 하기 좋음
- 중복을 허용하지 않는 방문자 수 세기
- URL을 키로 만들고 사용자 ID를 넣어주면 됨
- 중복을 허용하지 않는 방문자 수 세기
- 인증 토큰 블랙리스트로 사용
- JWT 로그아웃 : 로그아웃을 요청한 JWT를 블랙리스트에 저장
- 당연히 클라이언트가 JWT를 파기하는게 원칙적으로 맞지만 이제 더 이상 접속하면 안 된다는 사람들 목록을 넣어 놓는데 활용하기 좋음
- 특히 SISMEMBER 같은 경우, Redis 공식 문서를 따르면 big-O notation 기준으로 시간 복잡도가 1 이라고 함
-- Set : (문자열의) 집합
-- 중복을 허용하지 않음
SADD user:java alex
SADD user:java brad
SADD user:java chad
-- alex, brad, chad
-- 제거
SREM user:java alex
-- brad, chad
-- 해당 데이터가 있는지 유무
SISMEMBER user:java brad
-- true
SISMEMBER user:java dave
-- false
-- 모든 멤버 조회
SMEMBERS user:java
-- brad, chad
--집합의 크기
SCARD user:java
-- 2
-- 교집합 합집합
SADD user:python alex
SADD user:python dave
SADD user:java alex
-- 교집합
SINTER user:java user:python -- 집합 데이터를 저장하고 있는 Key 2개
-- 합집합
SUNION user:java user:python
-- 교집합의 개수
SINTERCARD 2 user:java user:python -- SINTERCARD {Key개수} <KEY> <KEY>
-- 집합은 중복을 허용하지 않음
SADD user:java alex -- 계속 실행해도 0이 반환
HASH
- 임의의 길이의 데이터를 인자로 받아도 동일한 길이의 결과가 나오게 되는 Hash Function
- Java 오브젝트가 가지고 있는 Hash코드 메서드
-- Hash
-- Field - Value Pair 로 이루어진 자료형
-- 복잡한 데이터를 표현해야 될 때 주로 사용
HSET user:alex name alex age 25
----------------------
name alex
----------------------
age 25
----------------------
-- 하나의 key에 복수의field와 value가 담김
-- N번 넣을 수 있음
HSET user:alex major CSE
----------------------
name alex
----------------------
major CSE
----------------------
age 25
----------------------
--HGET <Hash Key> <field>
HGET user:alex name --alex
HGET user:alex age -- 25
--2개 이상의 <field>
HMGET user:alex age major
--모든 데이터 가져오기
HGETALL user:alex
HKEYS user:alex
HLEN user:alex
--복잡한 데이터일 경우 Hash 사용
--복잡한 객체를 표현 할 때는 그 객체를 표현할 수 있는
--마치 변수명 같이 키를 써놓고 그 키 안에 담겨있는 데이터들
--java 클래스에 있는 속성들 처럼 키 안에 필드를 여러개 만들어서 그 안에 데이터를 넣어주는 것이 좀 더 효율적으로 Redis의 Hash를 쓸 수 있다고 공식문서에서 제안함
-- 장바구니, 세션정보
HSET cart:alex computer 1 mouse 2 keyboard 10
📍하나의 객체를 표현 할 때 사용할 것!
그 객체에 여러 객체에 대한 데이터를 넣으려고 하시는 것은 권장하지 않음
SORTED SET
데이터의 점수를 따로 저장해서 그 점수에 따라 데이터를 돌려주는 형태로 동작하는 자료 구조
-- Sorted Set
-- 정렬된 집합 : 종복되지 않는 데이터 + 점수
-- ZADD key score value
ZADD user:ranks 10 alex
----------------------
value score
----------------------
alex 10
----------------------
ZADD user:ranks 9 brad 11 chad
----------------------
brad 9
----------------------
alex 10
----------------------
chad 11
----------------------
ZADD user:ranks 8 dave
ZADD user:ranks 9.5 eric
----------------------
dave 8
----------------------
brad 9
----------------------
alex 9.5
----------------------
alex 10
----------------------
chad 11
----------------------
-- 점수 올려주기
ZINCRBY user:ranks 2 alex
-- 순위 찾기
ZRANK user:ranks alex
ZRANK user:ranks dave
--높은 점수를 0번으로 올리고 싶을 때
ZREVRANK user:ranks alex
--특정 구간의 값들을 가지고 오기
ZRANGE user:ranks 0 3 --0~3까지
ZREVRANGE user:ranks 0 3 --반대순서로 찾기
--데이터가 중복되지 않고 점수만 변경됨
ZADD user:ranks 15 alex
--순위표(리더보드), Rate Limiter 기능
--Rate Limiter: 어떤 특정한 시간과 시간 사이에 과도한 양의 요청을 거부
이외 공용 명령어
--DEL : Key 삭제하기
SET somekey "to be deleted"
DEL somekey
--EXPIRE : 만료시간 설정
SET expirekey "to be expired"
EXPIRE expirekey 5 //5초 후 삭제
--EXPIRETIME : 만료될 시간을 UNIX Timestamp로 반환
--언제까지 유효한지에 대한 UNIX 시간을 돌려줌
EXPIRETIME expirekey
--KEYS : Key를 검색
KEYS *
KEYS user:*
KEYS start*
--FLUSHDB : 연결된 현재 데이터베이스의 모든 키 삭제
FLUSHDB