본문 바로가기

WEB개발/DB

Redis

Redis

레디스(Redis, Remote Dictionary Server)는 고성능의 인메모리 데이터 저장소로, 데이터베이스, 캐시, 메시지 브로커 등으로 활용됩니다. 비관계형(NoSQL) 데이터베이스로 분류되며, 키-값(Key-Value) 구조로 데이터를 저장합니다. 레디스는 속도가 빠르고 다양한 데이터 구조를 지원하는 것이 주요 특징입니다.

 

주요 특징

  1. 인메모리 데이터 저장 : 데이터를 메모리에 저장하여 매우 빠른 읽기 및 쓰기 성능을 제공합니다. 필요하면 데이터를 디스크에 영속화(persistence)하여 데이터 손실을 방지할 수 있습니다.
  2. 다양한 데이터 구조 지원
    단순한 키-값 형태 외에도 다음과 같은 구조를 제공합니다:
    • 문자열(String)
    • 리스트(List)
    • 집합(Set)
    • 정렬된 집합(Sorted Set, ZSet)
    • 해시(Hash)
    • 비트맵(Bitmap)
    • 하이퍼로그로그(HyperLogLog)
    • 스트림(Streams)
  3. 복제 및 클러스터링
    • 복제(Replication): 데이터를 여러 노드에 복제하여 고가용성을 제공합니다.
    • 클러스터링(Clustering): 데이터를 여러 노드에 분산 저장하여 확장성을 지원합니다.
  4. 캐싱 기능 : TTL(Time to Live) 설정을 통해 데이터를 일정 시간 후 자동 삭제할 수 있어, 캐시로 활용하기 적합합니다.
  5. Pub/Sub 모델 : 메시지 브로커로서, 게시자(Publisher)와 구독자(Subscriber) 간의 메시지 전달을 지원합니다.
  6. 스크립팅 및 트랜잭션 지원
    • Lua 스크립트를 통해 복잡한 작업을 서버에서 처리할 수 있습니다.
    • 여러 명령어를 원자적으로 처리할 수 있는 트랜잭션을 제공합니다.
  7. 오픈소스 및 다양한 클라이언트 지원
    무료 오픈소스 소프트웨어이며, 다양한 프로그래밍 언어(Java, Python, Node.js 등)에서 사용할 수 있는 클라이언트 라이브러리를 제공합니다.

 

레디스를 사용하는 주요 사례

  • 캐싱: 자주 조회되지만 변경되지 않는 데이터를 빠르게 제공하기 위해 사용됩니다.
  • 세션 저장소: 사용자 세션 데이터를 관리하며, 빠른 읽기/쓰기가 필요한 환경에 적합합니다.
  • 순위표 관리: 정렬된 집합(ZSet)을 활용해 실시간으로 순위를 계산하거나 관리할 수 있습니다.
  • 메시지 큐: Pub/Sub 기능을 활용해 메시지를 처리하거나 분산 시스템 간 통신에 사용됩니다.
  • 실시간 분석: 하이퍼로그로그(HyperLogLog) 같은 데이터 구조로 대규모 데이터를 실시간 분석합니다.

 

단점

  • 메모리 의존성: 데이터를 메모리에 저장하므로, 메모리 크기에 따라 저장 가능한 데이터 양이 제한됩니다.
  • 데이터 영속성 제한: 영속화를 지원하지만, 주로 인메모리 특성상 영속적 저장소로 설계된 데이터베이스만큼 안정적이지 않을 수 있습니다.
  • 복잡한 클러스터 관리: 대규모 시스템에서는 클러스터링 구성 및 유지보수가 복잡할 수 있습니다.

 

 


1. 설치

redis download

https://github.com/microsoftarchive/redis/releases

 

Releases · microsoftarchive/redis

Redis is an in-memory database that persists on disk. The data model is key-value, but many different kind of values are supported: Strings, Lists, Sets, Sorted Sets, Hashes - microsoftarchive/redis

github.com

 

redis gui

https://github.com/qishibo/AnotherRedisDesktopManager/releases

 

Releases · qishibo/AnotherRedisDesktopManager

🚀🚀🚀A faster, better and more stable Redis desktop manager [GUI client], compatible with Linux, Windows, Mac. - qishibo/AnotherRedisDesktopManager

github.com

 

 

 

Releases · qishibo/AnotherRedisDesktopManager

🚀🚀🚀A faster, better and more stable Redis desktop manager [GUI client], compatible with Linux, Windows, Mac. - qishibo/AnotherRedisDesktopManager

github.com

 

Redis GUI

 

2. 실행

<윈도우>

 

 

<리눅스> 접속 명령어

redis-cli

 

 


 

명령어

1. 기본 명령어

  • `PING`: 서버 연결 확인출력: PONG
  • `SELECT`: 데이터베이스 선택 (기본은 0번 DB)
  • `FLUSHALL`: 모든 데이터베이스의 데이터를 삭제
  • `FLUSHDB`: 현재 데이터베이스의 데이터만 삭제

 

2. 문자열(String)

Redis에서 기본 데이터 타입입니다.

  • `SET`: 키-값 저장
  • `GET`: 키의 값 조회
  • `INCR/DECR`: 숫자 증가/감소
  • `APPEND`: 문자열에 값 추가
  • `EXPIRE`: TTL 설정 (초 단위)

키 key에 값 value를 설정하고, `<seconds>`초 후에 만료됩니다.

SET key value EX <seconds>

 

3. 리스트(List)

순서가 있는 값의 리스트를 저장합니다.

  • `LPUSH`: 리스트의 왼쪽(앞)에 값 삽입
  • `RPUSH`: 리스트의 오른쪽(뒤)에 값 삽입
  • `LPOP`: 리스트의 왼쪽(앞)에서 값 제거 및 반환
  • `RPOP`: 리스트의 오른쪽(뒤)에서 값 제거 및 반환
  • `LRANGE`: 리스트의 특정 범위 값 조회

 

4. 셋(Set)

중복 없는 값의 집합을 저장합니다.

  • `SADD`: 셋에 값 추가
  • `SMEMBERS`: 셋의 모든 값 조회
  • `SREM`: 셋에서 특정 값 제거
  • `SISMEMBER`: 값이 셋에 존재하는지 확인

 

5. 해시(Hash)

필드-값 쌍을 저장하는 맵과 같은 구조입니다.

  • `HSET`: 해시에 필드-값 저장
  • `HGET`: 특정 필드의 값 조회
  • `HGETALL`: 해시의 모든 필드와 값 조회
  • `HDEL`: 특정 필드 삭제

 

6. 정렬된 셋(Sorted Set)

값에 점수(score)를 부여하여 정렬된 집합을 저장합니다.

  • `ZADD`: 정렬된 셋에 값 추가 (점수와 함께)
  • `ZRANGE`: 정렬된 셋의 특정 범위 값 조회
  • `ZREM`: 정렬된 셋에서 특정 값 제거

 

7. 키 관리

  • `DEL`: 특정 키 삭제
  • `EXISTS`: 키가 존재하는지 확인
  • `KEYS`: 패턴에 매칭되는 모든 키 조회

 

8. Pub/Sub

Redis를 메시지 브로커로 사용할 수 있습니다.

  • `SUBSCRIBE`: 특정 채널 구독
  • `PUBLISH`: 특정 채널로 메시지 전송

 

9. 트랜잭션

  • `MULTI`: 트랜잭션 시작
  • `EXEC`: 트랜잭션 실행
  • `DISCARD`: 트랜잭션 취소

 

10. 관리 및 모니터링

  • `INFO`: Redis 서버 정보 조회
  • `MONITOR`: 실시간 명령어 로그 확인
  • `SHUTDOWN`: Redis 서버 종료
     
     

 

Key 네이밍  컨벤션

: 콜론 ( : )을 활용해 계층적으로 의미를 구분해서 사용

 

user:12345:profile
product:98765:price

 

Redis의 `KEYS` 명령은 패턴을 기반으로 키를 검색할 수 있으므로, 검색이 용이하도록 네이밍을 설계해야 합니다.

user:*
user:*:profile
order:2024-12-12:*

 

 


 

캐싱 전략

 

읽기 전략 (Read Strategies)

 

Look-aside (Lazy Loading, Cache  Aside) 전략 : 데이터를 읽는 작업이 많을 때 사용하는 전략이며, 레디스를 캐시로 쓸때 가장 많이 사용한다고 합니다.

먼저 애플리케이션이 데이터를 읽을 때, 캐시를 확인하여 캐시에 데이터가 존재하면 캐시에서 데이터를 읽어온다. 만약 레디스에 찾는 데이터가 없다면 DB에 접근해서 데이터를 직접 가져와 레디스에 저장한다.

 

쓰기 전략 (Writing Strategies)

 

Write-around : DB에 데이터를 저장하고 Cache miss가 발생할 경우 DB에서 데이터를 캐싱한다. 이 경우엔 cache 내의 데이터와 DB 내의 데이터가 다를 수 있다.

왜냐하면, 캐싱된 데이터가 있을 경우 데이터를 수정할 때 캐싱된 데이터를 수정하지 않고, 캐시에 데이터는 있기 때문에 새로 캐싱을 하지 않는다.

 

Write-through(잘 안씀) : DB에 데이터를 저장할 때 cache에도 함께 저장하는 방법이다. cache는 항상 최신 정보를 가지고 있다는 장점이 있지만 저장할 때마다 두 단계(DB에 저장, 캐시에 저장) 거쳐야 하기 때문에 상대적으로 느리다. 그리고 재사용되지 않는 데이터도 무조건 캐시에 넣어버리기 때문에 일종의 리소스 낭비를 초래할 수 있다. 이 경우 데이터를 저장할 때는 Expire time을 설정해 주는 것이 좋다고 한다.

 

 

Look-aside  + Write-around 한계점

 

-데이터 일관성 보장할 수 없음 : 쓰기 시 DB만 데이터를 저장함으로 캐시 된 데이터와 DB데이터의 불일치 문제가 발생한다.

-캐시에 저장할 수 있는 공간이 비교적 적다

 

그러므로

 

1. 적절한 데이터를 선별해야 한다.

  • 자주 조회되는 데이터
  • 잘 변하지 않는 데이터
  • 실시간으로 정확하게 일치하지 않아도 되는 데이터

2. TTL 기능을 활용한다.

 

 


 

다른 성능개선 방법

  1. SQL튜닝
  2. 캐시서버 활용 (Redis...)
  3. 레플리케이션 (Master / Slave구조) : 마스터-슬레이브 레플리케이션에서는 마스터 서버가 데이터를 쓰고, 슬레이브 서버는 데이터를 읽는 방식으로 동작
  4. 샤딩 (Sharding) : 데이터를 여러 서버에 분산하여 저장함으로써 성능과 확장성을 향상시키는 방법
  5. DB서버 스케일업 (cpu, memory, ssd)

 

 

 

 


https://velog.io/@banggeunho/Redis-%EC%BA%90%EC%8B%9C%EB%9E%80-%EC%BA%90%EC%8B%B1%EC%A0%84%EB%9E%B5-%EC%95%8C%EA%B3%A0-%EC%8D%A8%EB%B3%B4%EC%9E%90