제가 공부한 내용을 정리하는 블로그입니다.
아직 많이 부족하고 배울게 너무나도 많습니다. 틀린내용이 있으면 언제나 가감없이 말씀해주시면 감사하겠습니다😁

Redis


Key-Value Store의 하나의 DB
Remote Dictionary Server의 약자로, 원격 Dictionary 자료구조 서버라는 뜻
  • Key로 올 수 있는 자료형은 기본적으로 String이지만, Value는 다양한 타입을 지원함.
  • 메모리 기반 데이터베이스이기 때문에, Disk를 기반으로 하는 RDBMS보다 read가 빠름.
💡 잠깐! RDBMS도 쿼리를 통해 조회해오면, 메모리에 존재하는 Buffered Cache를 이용한다고 알고 있어요. (= Cache Hit)        Buffered Cache를 활용할 때의 RDBMS와 레디스는 조회 시간 차이가 없나요?

경험상 RDBMS에서 동일 select문 n회 조회할 때(cache hit)와 Redis의 조회 속도를 비교해보면 Redis가 더 빠른데요, 과거 AWS에서 monggo DB 담당하시는 이덕현 개발자님이 세미나에서 “RDBMS는 데이터의 직렬화, 역직렬화 과정이 있기 때문에 레디스보다 더 느린 것 같다"고 추론했다는 언급을 하신 적 있습니다.

 

자바 해시 맵과의 비교

공통점

  • 레디스, 해시 맵 모두 Key-Value 형태
  • 메모리 베이스 -> 디스크보다 빠른 접근 가능.
  • 원하는 Value를 원하는 자료구조로 사용 가능

차이점

분산 환경에서의 장점

  • 유저의 수가 늘어나 서버가 증설될 때 해시맵 데이터를 참조해야할 때

자바 해시맵을 이용한 분산환경

  • 자바 해시맵은 프로세스마다 메모리가 달라, 원격 프로세스간 동일한 해시 맵 데이터를 참조해야할 때 동기화가 어려움.

 

레디스를 이용한 분산환경

  • 별도의 레디스 서버를 구성하고, 해당 레디스에서 값을 꺼내 쓴다면 메모리 기반 데이터 구조의 빠른 응답성 데이터 정합성을 가져올 수 있음.

DBMS로서의 장점

  • Redis는 영속성을 제공하기에 다양한 옵션도 제공 가능
  • TTL 설정: 일정 시간이 지나면 데이터 삭제, 용량이 작은 메모리를 효율적으로 관리.
  • 분산 데이터 저장소 구성: Redis Cluster 등 분산환경에서 안정적인 데이터 관리
  • 보안 체계: 악성 스크립트 공격으로부터 안전 보장. TLS 지원.

레디스 특징

  • 쿼리를 사용할 필요 없이 명령어로 가능.
  • 데이터를 디스크에 쓰는 구조가 아니라 메모리에서 데이터를 처리하기 때문에 속도가 빠름.(인메모리 기반)
  • 여러 자료 구조를 지원(String, Lists, Sets, Sorted Sets, Hashes ...)

RESP 프로토콜

RESP(REdis Serialization Protocol)은 Redis 클라이언트가 Redis 서버와 TCP 커넥션을 맺어 통신할 때 사용하는 프로토콜.

더보기

RESP는 Redis의 client-server 통신에서만 사용.
Redis Cluster에서 노드간의 통신은 RESP가 아닌 binary protocol을 사용.

Request-Response 모델

Redis는 기본적으로 다음의 2가지 경우를 제외하고 Request-Response 모델을 사용.

  • Pipelining
    • 여러개의 명령어(Command)를 한번에 보내고 모든 답장이 올 때까지 기다림.
  • Pub/Sub
    • 어떤 Client가 특정 channel을 subscribe하면 push protocol로 전환되어 더이상 명령어를 보내지 않음.

Redis의 Request-Response 프로토콜은 다음과 같이 동작.

  • 클라이언트가 Bulk String의 Array 타입으로 명령어를 서버로 전송.
  • 서버는 클라이언트가 보낸 명령어에 맞는 타입으로 응답을 보냄.

RESP의 Data Types

RESP는 5가지의 데이터 타입이 존재.

데이터의 타입은 데이터의 첫번째 바이트를 통해 구분.

RESP를 통해 오고가는 Req와 Resp는 항상 "\r\n"으로 끝남.

  • Simple Strings: "+"
    • Simple Strings 타입은 binary-safe하지 않은 일반 문자열을 전송할 때 사용하는 데이터 타입
    • binary-safe한 문자열을 전송하려면 Bulk String타입으로 전송
    • 문자열은 Newline을 포함할 수 없음.
    • ex) "+OK\r\n"
  • Errors: "-"
    • 에러 정보에 대한 타입
    • 관습적으로 에러의 이름을 먼저 쓰고 발생 원인을 뒤에 적음.
    • ex) "-ERR unknown command 'foobar'\r\n" "-ERR unknown command 'foobar'\r\n"
  • Integers: ":"
    • 숫자의 크기는 signed 64bit 범위 내
    • INCR, LLEN, LASTSAVE와 같은 명령어에 대한 응답
    • 일부 명령어는 true/false의 의미로 1/0을 씀.
  • Bulk Strings: "$"
    • binary-safe한 문자열을 타나낼 때 사용하는 타입
    • "$"에 이어 문자열의 길이가 주어지고 "\r\n" 이후 실제 문자열
    • 빈 문자열을 나타낼 땐 "$0\r\n\r\n" 를 사용
    • null 값을 나타낼 때는 Null Bulk String이라고하며, "$-1\r\n" 를 사용
  • Arrays: "*"
    • 10진수로 배열의 크기와 "\r\n" 이 나옴.
    • 배열 내 원소는 각각 특정한 타입을 가질 수가 있으며, 그 타입은 모두 달라도 됨.
    • "*3\r\n:1\r\n+2\r\n$4\r\nbulk\r\n"
    • Null Array: "*-1\r\n"
    • 중첩된 Array도 가능

 

 

Redis 설치하기


Redis 공식 홈페이지, getting-started에서 설명.

Mac에서 설치하기

# brew가 없다면 https://brew.sh/

brew --version
brew install redis

# 설치를 완료했다면 Redis Server 실행
redis-server

# Redis Server에 접근하는 client 실행
redis-cli
  • 옵션을 주지 않고 부팅했을 때 Redis의 default 포트는 6379
  • cli를 실행하지 않고도, telnet으로 접속 가능 -> telnet 0 6379

hello시 첫 값들이 세팅되어 있음.

Key를 잡을 때 주의점

  • Key의 최대 길이는 512MB.(value도 마찬가지)
  • 매우 긴 키는 좋지 않음.
    • 1MB길이의 키는 메모리 관리 측면 뿐만 아니라 키를 조회할 때 고비용의 키 비교 로직을 실행해야 할 수 있기에 좋지 않음.
    • 키가 너무 길다면 SHA-1를 통해 해싱
    • 레디스를 사용하는 이유는 빠른 응답속도…!
  • 매우 짧은 키 역시 좋지 않음
    • 가독성을 해치는 키는 별로 좋지 않음.
  • 고정된 스키마를 활용
    • .이나 -주로 사용
    • comment:4321:reply.to, comment:4321:reply-to

참조

Redis, 자바 해시맵 비교: https://sihyung92.oopy.io/database/redis/1
RESP 프로토콜: https://redis.io/docs/latest/develop/reference/protocol-spec/#resp-simple-strings

'Database > Redis' 카테고리의 다른 글

[Redis] Redis 고급 및 캐싱전략  (0) 2024.05.16
[Redis] Redis Data Type  (0) 2024.05.16
[Redis] NoSQL이란  (0) 2024.04.30
[OSSCA2024] Redis 과제 3  (0) 2024.04.25

+ Recent posts