본문 바로가기
카테고리 없음

Redis (인메모리 데이터 구조 저장소)

by yororing 2024. 12. 25.

00 개요

  • Redis란 무엇이며 Redis의 주요 특징, 사용 예시, 주요 명령어, 설치 방법 등에 관한 정리

01 Redis란

1. 정의

2. 주요 특징

1) 인메모리 저장소

  • 데이터를 메모리에 저장하여 빠른 읽기 및 쓰기 속도를 제공함
  • 디스크 I/O 없이 데이터를 빠르게 처리할 수 있음

2) 다양한 데이터 구조 지원

  • 단순한 문자열 외에도 리스트, 셋, 해시, 정렬된 셋, 비트맵, 하이퍼로그로그 등 다양한 데이터 구조를 지원함
  • 이를 통해 복잡한 데이터를 효율적으로 다루기 가능

3) 고성능

  • 초당 수백만 개의 명령을 처리할 수 있어 고성능 요구 사항을 충족할 수 있음
  • 주로 캐싱, 세션 저장소, 실시간 분석 등에 사용됨

4) 지속성 옵션

  • 기본적으로 메모리에 데이터를 저장하지만 데이터를 디스크에 영구적으로 저장할 수 있는 옵션도 제공함
  • 예) RDB snapshots와 AOF(Append Only File) 방식이 있음

5) 복제 및 클러스터링

  • 마스터-슬레이브 복제클러스터링 기능을 제공하여 고가용성(High Availability) 및 분산 환경을 구축할 수 있음

6) TTL(Time To Live)

  • 각 키에 대해 만료 시간을 설정 가능
  • 이를 통해 캐시 데이터를 일정 시간 후 자동으로 삭제할 수 있어 캐싱 전략에서 유용하게 사용됨

3. 사용 예시

1) 캐싱

  • 애플리케이션에서 자주 조회되는 데이터를 Redis에 저장하여 DB 접근을 최소화하고 성능을 향상시킬 수 있음
  • 예) 사용자 정보나 웹 페이지 데이터를 캐싱할 수 있음
import redis

# Redis 서버에 연결
client = redis.StrictRedis(host='localhost', port=6379, db=0)

# 데이터를 캐시에 저장 (TTL 설정)
client.setex('user:1234', 3600, 'John Doe')

# 데이터를 캐시에서 읽기
user_name = client.get('user:1234')
print(user_name.decode()) # 'John Doe'
  • 설명:
    • # Redis 서버에 연결
      • host='localhost': Redis 서버가 로컬 환경에 있다고 지정. Redis 서버가 다른 서버에 있을 경우 localhost 대신 해당 서버의 IP 주소나 도메인명을 사용해야 함
      • port=6379: Redis의 기본 포트인 6379를 사용하여 연결
      • db=0: Redis는 기본적으로 여러 DB를 지원하며 0번 데이터베이스를 사용하도록 지정. Redis는 기본적으로 16개의 데이터베이스(0~15번)를 제공하며, db=0은 기본 DB임
    • # 데이터를 캐시에 저장 (TTL 설정)
      • setex: Redis에서 키-값 쌍을 저장하고 추가로 만료 시간(TTL, Time-To-Live)을 설정하는 명령어
        • 첫 번째 인자: 키(key) - Redis 데이터베이스에 저장할 데이터의 식별자
        • 두 번째 인자: TTL (만료 시간, second 초 단위) - 캐시된 데이터가 유효한 시간을 초 단위로 지정. 이 시간이 지나면 데이터는 자동으로 삭제됨
        • 세 번째 인자: 값(value) - Redis에 저장할 실제 데이터
      • 'user:1234': Redis에 저장될 데이터의 키. Redis는 데이터를 키-값 쌍으로 저장하며 키는 각 데이터를 고유하게 식별하는 역할을 함. 이 예제에서 user:1234는 특정 사용자의 정보를 나타내는 고유한 키로 사용됨
      • 3600: 만료 시간(Time-To-Live)을 초 단위로 설정한 값 (3600초 = 1시간). 즉, 'user:1234' 키에 저장된 데이터('John Doe')는 1시간 후에 자동으로 삭제됨. TTL을 설정함으로써, Redis에 저장된 데이터가 일정 시간이 지나면 자동으로 만료되어 메모리에서 제거됨.
      • 'John Doe': 해당 키에 저장될 값. 이 예제에서는 사용자의 이름을 나타내는 값으로 설정되었음. Redis에서 이 값은 문자열 형태로 저장됨.

2) 세션 관리

  • Redis는 세션 데이터를 빠르게 저장하고 관리하는 데 자주 사용됨
  • 예) 웹 애플리케이션에서 로그인 상태를 관리할 때 Redis를 사용하여 세션 저장할 수 있음
import redis

# Redis 서버에 연결
client = redis.StrictRedis(host='localhost', port=6379, db=0)

# 세션 데이터 설정
client.setex('session:abc123', 3600, 'logged_in')

# 세션 데이터 읽기
session_status = client.get('session:abc123')
print(session_status.decode()) # 'logged_in'
  • 설명
    • print(session_status.decode())
      • Redis는 기본적으로 바이트 문자열(byte string) 형태로 데이터를 저장하고 반환함
      • Python에서 print() 함수는 바이트 문자열을 바로 출력할 수 없어서 .decode() 메서드를 사용해 바이트 문자열을 일반적인 문자열로 변환 필수
      • decode() 메서드는 기본적으로 UTF-8 인코딩을 사용하여 바이트 문자열을 일반 문자열로 변환함
      • → session_status.decode() 사용하여 'logged_in'이 인코딩된 바이트 데이터에서 일반 문자열로 변환됨
      • → 따라서 print()는 'logged_in'을 출력

3) 게시판 시스템

  • Redis의 리스트 데이터 구조를 사용하여 게시판 시스템을 구현할 수 있음
  • 예) 최신 글 목록을 Redis 리스트에 저장하고 빠르게 조회할 수 있음
import redis

# Redis 서버에 연결
client = redis.StrictRedis(host='localhost', port=6379, db=0)

# 리스트에 데이터 추가
client.lpush('posts', 'Post 1')
client.lpush('posts', 'Post 2')

# 리스트에서 데이터 조회
posts = client.lrange('posts', 0, -1)
print([post.decode() for post in posts]) # ['Post 2', 'Post 1']
  • 설명
    • # 리스트에 데이터 추가
      • lpush('posts', 'Post 1'): Redis의 리스트 posts에 'Post 1'을 추가. lpush는 리스트의 앞쪽(왼쪽)에 요소를 추가하는 명령임
      • lpush('posts', 'Post 2'): 'Post 2'를 리스트의 앞쪽에 추가
      • → Redis는 리스트에 데이터를 넣을 때 순서를 유지하며, 추가되는 데이터는 항상 왼쪽 끝에 추가됨.
      • → 따라서, Post 2가 Post 1보다 먼저 추가되므로 리스트에서 Post 2가 첫 번째 항목이 됨
    • # 리스트에서 데이터 조회
      • lrange('posts', 0, -1):
        • posts 리스트의 모든 항목을 반환하는 명령어 
        • 0: 리스트의 첫 번째 요소를 의미
        • -1: 리스트의 마지막 요소를 의미 ('끝까지'를 의미하는 값)
        • → lrange는 인덱스 0부터 -1까지의 모든 데이터를 반환함
        • → 왼쪽으로 데이터가 추가되었기 때문에 ['Post 2', 'Post 1']이 반환됨

4. 주요 명령어

1) SET

  • 키에 값을 저장
SET key value

2) GET

  • 키에 저장된 값을 조회
GET key

3) EXPIRE

  • 키에 만료 시간을 설정 
EXPIRE key seconds

4) DEL

  • 키 삭제
DEL key

5) LPUSH

  • 리스트의 앞에 요소 추가
LPUSH list value

6) LRANGE

  • 리스트에서 범위 지정하여 조회
LRANGE list start stop

5. Redis 설치

1) MacOS

# redis 설치
brew install redis

# redis 서버 시작
redis-server

# redis 클라이언트 접속
redis-cli

2) Linux

sudo apt-get update
sudo apt-get install redis-server

 

참조

  1. Redis 웹사이트: https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-on-mac-os/
  2.