Redis 타입, 명령어

twonezero·2024년 8월 6일
0

Redis

목록 보기
2/3
post-custom-banner

이번에는 Redis 의 기본적인 명령어에 대해 알아보자.

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에서 제안하는 Redis 전용 IDE

1. 설정파일

docker-compose.yml

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
  • docker-compose.yml 이 존재하는 경로에서 아래 명령어로 실행 ( 백그라운드 실행을 원하면 -d 옵션을 추가하면 됨 )

    docker compose up

applicaition.yml

spring:
  application:
    name: redis

  data:
    redis:
      host: localhost
      port: 6379
      username: default
      password: systempass
  • 앱 실행 시 필요한 redis 의 기본적인 property 설정이다.

2. IDE 에서 연결하기

  • 다른 db 들과 마찬가지로 인텔리제이에서 redis 를 찾아 연결하면 된다.
    redis-ide-connection

이때, redis 기본 유저는 default 라는 이름을 갖고, docker-compose.yml 에 작성한 내용처럼 systempass 라는 비밀번호로 실행되니 잘 입력해주자.

Redis의 자료구조 및 명령어

redis 의 자료구조와 명령어들을 살펴보자

String

  • 가장 기본적인 자료형
  • Redis가 Java의 Map<String, String>처럼 동작한다고 생각하면서 접근하면 편하다.
  • 저장할 수 있는 최대 크기는 512MB
-- 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

-- 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

-- 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


-- 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 > 장바구니, 세션 정보, 조회 수 측정 등

Sorted Set

-- 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
profile
소소한 행복을 즐기는 백엔드 개발자입니다😉
post-custom-banner

0개의 댓글