Home Redis 소개
Post
Cancel

Redis 소개

Redis 소개

Redis의 역사

image

  • 2009년 이탈리아의 개발자 Salvatore Sanfilippo가 개발한 오픈 소스 인 메모리 Key-Value 구조의 데이터베이스
  • 2015년 현재까지 Redis Labs에서 지원
  • 가장 인기 있는 Key-Value 구조의 저장소

Redis의 특징

  • 오픈 소스 기반의 인 메모리 Key-Value 데이터베이스
  • 메모리에 저장하여 빠른 응답 속도를 제공
  • 싱글 쓰레드로 구현되어 요청을 빠르게 처리하고 데이터 정합성 보장
  • String, Hash, List, Set, Sorted set, Stream, HyperLogLog 등 다양한 데이터타입 제공
  • 마스터-슬레이브 구조를 통한 데이터 복제, Replication 지원
  • RDB(Redis Database)AOF(Append Only File) 방식으로 영속성 부여 가능
    • RDB: Redis 데이터의 스냅샷을 일정 시간 간격으로 디스크에 저장
    • AOF: 모든 데이터 변경 작업을 로그로 기록

Redis 구조

image

  • 단일 쓰레드로 동작. I/O multiplexing 이용
    • 모든 작업들이 task queue를 통해서 순차적 으로 처리되므로 데이터 정합성, 일관성 등을 보장
  • 이벤트 드리븐 모델 사용
  • TCP 프로토콜을 지원하며, RESP (REdis Serialization Protocol) 사용
  • Redis Database와 Append Only File 등으 로 영속성 지원

Redis Key-Value

image

  • Redis는 인메모리 기반으로 고성능 Key- Value 저장소를 제공
  • 데이터베이스, 캐시, 메시지 브로커로 사용 가능
  • Key-Value 쌍으로 데이터 저장
    • Key는 유니크해야하며 최대 512MB 지원

Redis Value

image

  • String: 텍스트, 숫자, 이진 데이터 저장
  • List: 순서가 있는 문자열 리스트
  • Set: 순서가 없는 유일한 문자열 세트
  • Hash: Key-Value 쌍의 모음
  • Sorted set: Set과 비슷하지만 각각에 score를 부여하여 sort
  • Stream: 실시간으로 이벤트를 기록하 고 생성된 이벤트를 구독할 수 있는 스 트림
  • HyperLogLog: 확률적인 데이터 구 조. 고유한 요소의 개수를 추정하는데 사 용하며 높은 메모리 효율

Redis String

  • 문자열, 직렬화된 객체, 이진 배열 등 기본적인 값들을 저장

  • 캐싱에 자주 사용되며 카운터를 구현하고 비트 연산 등도 지원

  • SET: 특정 key에 string 값을 저장

  • SETNX: 특정 key에 값이 없는 경우에만 값을 저장

  • GET: 특정 key에 저장된 값을 조회

  • MGET: 하나의 요청으로 여러 key 조회

  • INCRBY: 특정 key에 저장된 값을 주어진 수만 큼 증가 (음수가 주어지면 감소)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    SET person:1:name hyunmin
    -- OK
    GET person:1:name
    -- hyunmin
    SETNX person:1:name min
    -- false
    GET person:1:name
    -- hyunmin
    SETNX person:2:name frank
    -- true
    MGET person:1:name person:2:name
    -- hyunmin
    -- frank
    SET person:1:age 20
    -- OK
    INCRBY person:1:age 10
    -- 30
    

Redis List

  • 문자열로 구성된 linked list
  • stack과 queue가 필요한 경우
  • 최대 길이는 2^32 - 1개 (4,294,967,295개)
  • LPUSH: list의 head에 값을 추가
    • RPUSH: list의 tail에 값을 추가
  • LPOP: list의 head에서 값을 제거하고 반환
    • RPOP: list의 tail에서 값을 제거하고 반환
  • LLEN: list의 길이를 반환
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
LPUSH queue:1 100
-- 1
LPUSH queue:1 200
-- 2
RPOP queue:1
-- 100
RPOP queue:1
-- 200
LPUSH stack:1 100
-- 1
LPUSH stack:1 200
-- 2
LPOP stack:1
-- 200
LPOP stack:1
-- 100

Redis Set

  • 문자열로 구성된 순서 없는 collection
  • 유니크한 항목들을 추적해야하는 경우
  • 관계를 표현하는 경우
  • 최대 길이는 2^32 - 1개 (4,294,967,295개)
  • SADD: set에 값을 추가
  • SREM: set에서 값을 제거
  • SISMEMBER: set에 값이 포함되어있는지 확 인
  • SCARD: set의 크기를 반환
  • SMEMBERS: set의 모든 value 목록을 반환• 추가, 삭제, 확인 등 대부분의 작업이 O(1)
  • 하지만 SMEMBERS는 O(n)

Redis Hash

  • field-value 쌍의 collection
    • 기본적인 객체를 표현해야 하는 경우
    • counter의 모음을 저장해야하는 경우
  • 최대 길이는 2^32 - 1개 (4,294,967,295개)
  • HSET: hash에 값을 추가. field value 순으로
  • HGETALL: hash의 모든 값을 field value 순 으로 출력
  • HLEN: hash의 field-value 쌍 개수를 반환
  • HINCRBY: hash의 특정 field의 value를 증가
  • HGET: 주어진 field들의 value들을 조회
  • HDEL: 주어진 field의 값을 제거
1
2
3
4
5
6
7
8
9
10
11
12
13
14
HSET person:1 name hyunmin age 20 gender M
-- 3
HGETALL person:1
-- name hyunmin
-- gender M
-- age 20
HLEN person:1
-- 3
HINCRBY person:1 age 10
-- 30
HMGET person:1 name age
-- hyunmin 30
HDEL person:1 age
-- 1

Redis Sorted set

  • set과 비슷하지만 score에 따라서 정렬
    • 같은 score라면 value를 사전순으로 정렬
    • 순위처럼 rank를 제공해야하는 경우
    • Rate limiter를 구현하는 경우
  • ZADD: set에 score와 value를 추가
  • ZREM: set에서 value를 제거
  • ZCARD: set의 크기를 반환
  • ZRANGE: 주어진 범위에 대해서 value 목록 을 반환
  • ZRANK: 주어진 value의 rank 순위를 반환
1
2
3
4
5
6
7
8
9
10
ZADD zset:1 10 a 1 b 0.1 c 100 d
-- 4
ZREM zset:1 d
-- 1
ZCARD zset:1
-- 3
ZRANGE zset:1 0 -1 WITHSCORES
-- c 0.1 b 1 a 10
ZRANK zset:1 a
-- 2

Redis ttl

  • key에 ttl (time to live)을 제한
  • ttl이 지나면 자동으로 삭제
  • EXPIRE: key에 ttl을 적용. 초 단위
  • PERSIST: key에 적용된 ttl을 초기화
  • TTL: key에 남은 ttl을 반환
    • key가 존재하지 않다면 -2 반환
    • key가 expire를 갖고 있지 않다면 -1 반환
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SET person:1:name hyunmin
-- OK
EXPIRE person:1:name 10
-- 1
TTL person:1:name
-- 10
GET person:1:name
-- "hyunmin"
-- after 11 seconds
TTl person:1:name
-- -2
GET person:1:name
-- (nil)
SET person:1:name hyunmin
-- OK
EXPIRE person:1:name 10
-- 1
PERSIST person:1:name
-- 1
TTL person:1:name
-- -1

Redis는 언제 사용 하는가?

  • 메인 데이터베이스 보다는 부가적으로 사용되는 경우가 대부분
  • 다양한 자료구조가 필요한 서비스
    • String 뿐만 아니라 List, Set, Hash, Sorted set 등의 고급 데이터 구조 등 도 지원
    • 예) 허용 ip 관리 서비스(Set), 랭킹 시스템 (Sorted set), DAU 추정 서비스 (HyperLogLog) 등
  • 높은 성능과 데이터 일관성이 필요한 서비스
    • 싱글 쓰레드와 eventLoop를 활용하여 높은 성능을 보장
    • task queue에서 task를 수행하기 때문에 데이터 일관성 제공
    • 예) 재고 관리 서비스, 요청 제한 서비스 등
  • 글로벌 캐시가 필요한 서비스
    • String, Hash 등의 자료구조를 통해서 데이터, 객체 등을 저장하기 용이
    • 예) 유저 관리 서비스, 이미지 URL 관리 서비스 등

Spring Security Architecture

8월 회고록