이번에는 Redis 의 기본적인 명령어에 대해 알아보자.
redis 를 윈도우에서 로컬에 설치하는 것은 약간 불편할 수도 있다. 또한 redis 와 같은 db 는 로컬에 테스트용으로 설치했다가 나중에 프로젝트를 진행할 때, backgroud 로 실행되는 db 의 존재를 잊고 같은 port 로 연결을 시도하다 실패하는 경우도 생긴다.
따라서, Docker 로 설치하는 것을 추천한다.
현재 redis 도 다양한 image 로 제공이 된다.
redis
: 여태까지 가장 많이 사용되어 오던 Redis 서버의 핵심(Core). 가장 간단한 형태의 연습을 하고 싶다면 redis 사용redis/redis-stack-server
: 여러 플러그인이 추가된 Redis Stack 서버 이미지. 확률형 데이터, JSON 문서 등의 사용도 가능redis/redis-stack
: redis/redis-stack-server
에 Redis Insight가 추가된 이미지. Redis Insight를 같이 사용하고 싶다면 선택redis insight 도 사용해보기 위해 redis-stack 이미지로 pull 하며, 편하게 실행
services:
redis-stack:
image: redis/redis-stack
container_name: redis-stack-compose
restart: always
environment:
REDIS_ARGS: "--requirepass systempass"
ports:
- 6379:6379
- 8001:8001
-d
옵션을 추가하면 됨 )docker compose up
spring:
application:
name: redis
data:
redis:
host: localhost
port: 6379
username: default
password: systempass
이때, redis 기본 유저는
default
라는 이름을 갖고, docker-compose.yml 에 작성한 내용처럼systempass
라는 비밀번호로 실행되니 잘 입력해주자.
redis 의 자료구조와 명령어들을 살펴보자
-- String
set user:email test@email.com
get user:email
set user:count 1
get user:count
-- String 으로 저장해도 만약 정수라면 + or - 가능
incr user:count
decr user:count
-- MSET , MGET
-- MSET key value key value ...
mset user:name testuser user:email testuser@email.com
mget user:name user:email
- mset, mget 은 여러 값(multiple)을 저장하고나 가져올 수 있다.
- 문자열은 결국 바이트 배열
->그래서 이미지, 음성, 영상, 파일, 또는 이메일 본문 등도 보관이 가능하다.
EX> 분산된 구조에서 비교적 큰 사이즈의 데이터를 주고받아야 하는 상황에 Key만 전달해서 데이터는 여기있다 활용할 수 있다.
-- List : Linked List
-- Stack, Queue
-- Push, Pop (L , R push or pop 가능)
lpush user:list testuser
lpush user:list testuser2
rpush user:list testuser3
rpush user:list testuser4
lpop user:list
rpop user:list
-- LLEN: 리스트의 크기
-- 다른 자료형이 저장된 Key 에 쓰면 오류가 난다
llen user:list
-- 더 큰 숫자 아무거나 (거의 전체 조회)
lrange user:list 0 1000000
-- 음수 인덱스 (뒤에서 부터)
lrange user:list 0 -1
- Linked List 로 보관
- List 라 해도 redis 는 항상 Key-Value 형식으로 저장한다.
Map<String, List<String>>
의 형태로 사용하는 것과 같다.- lrange 로 원하는 만큼의 list 조회가 가능하다.
-- SET: (문자열의) 집합 , 중복 허용 X, 순서 X
sadd user:java testuser
sadd user:java testuser2
sadd user:java testuser3
sadd user:java testuser <-- 무시됨 (에러는 발생하지 않음)
-- set 에 해당 값이 있는 지 확인
sismember user:java testuser
-- set 의 모든 데이터 가져오기
smembers user:java
-- set 크기 (카디널리티)
scard user:java
-- 교집합 합집합
-- 데이터 생성
sadd user:python twonezero
sadd user:python testuser
sadd user:python dave
sadd user:java testuser
smembers user:java
smembers user:python
-- 교집합
sinter user:java user:python <--- testuser
-- 합집합
sunion user:python user:java <--- testuser 는 한 번 나옴
-- 교집합 결과 수
sintercard 2 user:java user:python
- Set 은 집합의 기본적인 기능을 제공한다.
- 교집합, 합집합과 같은 기능을 이용해 원하는 기능 구현 가능
- ex
- 중복을 허용하지 않는 방문자 수 세기 url 을 키로 만들고 사용자 ID를 넣어준다
- jwt 인증 토큰 블랙리스트(로그아웃)
-- Hash : <Key> : <Field : Value>
-- 한 번에 많은 Field-Value 쌍을 저장 가능
hset user:twonezero name twonezero age 25
hset user:twonezero major cs
-- user:twonezero Key 의 저장된 field로 value 조회
hget user:twonezero name
hget user:twonezero age
-- Key 에 해당하는 Field-Value 쌍 한 번에 조회
hgetall user:twonezero
-- Key 에 해당하는 특정 Field 만 조회
hmget user:twonezero name major
-- user:twonezero 로 저장된 key 들
hkeys user:twonezero
-- hash의 데이터(field-value쌍) 수
hlen user:twonezero
- hash 는 객체 하나에 여러 정보를 담기 좋다.
- 그렇다고 한 주제(도메인)에 대한 여러 객체에 대한 정보를 저장하는 것은 redis 철학과는 맞지 않다. 단순하게 사용하자.
- ex > 장바구니, 세션 정보, 조회 수 측정 등
-- ZADD <key> <score> <value>
-- ex> 순위표(리더보드), 타임스탬프
-- user:rank 에 twonezero 멤버는 10으로 저장
zadd user:rank 10 twonezero
zadd user:rank 12 hoho
zadd user:rank 9 brad 4 chop
zadd user:rank 7 dave
-- --> 인덱스는 [chop, dave, brad, twonezero, hoho] 순
-- twonezero 의 rank(순위) 측정 (작은 score가 우선)
zrank user:rank twonezero <--- 3
-- 큰 score 순으로 정렬
zrevrank user:rank hoho <--- 0
-- 시작과 끝 인덱스 범위의 member 들을 score와 함께 조회
zrange user:rank 0 10 withscores
-- 큰 score 순으로 조회 (REV 를 통해 동작)
zrange user:rank 0 10 REV withscores
-- score 만큼 증가시키기
zincrby user:rank 4 chop
- 정렬된 집합을 이용한다. Set 과 동일하지만
score
를 함께 데이터 간의 우선도를 저장할 수 있다.
-- DEL 삭제하기
-- 위 자료구조 다 삭제 가능
del user:list
del user:python
del user:rank
del user:java
del cart:twonezero
del user:twonezero
del user:count
del user:email
del user:name
-- Expire 설정
set expireKey "to be expired"
-- 시간만큼 만료시간(초) 지정 가능
expire expireKey 5
-- expireKey 의 만료시간 Unix timestamp(1970/1/1 이후의 초 단위 반환)
expiretime expireKey
-- Keys : 키 검색
KEYS *
KEYS user:*
-- redis 안의 정보 모두 날리기
flushdb