카테고리 없음
Redis (인메모리 데이터 구조 저장소)
by yororing
2024. 12. 25.
00 개요
- Redis란 무엇이며 Redis의 주요 특징, 사용 예시, 주요 명령어, 설치 방법 등에 관한 정리
01 Redis란
1. 정의
- 'Remote Dictionary Server'
- 인메모리 데이터 구조 저장소
- 캐싱 및 데이터베이스로 널리 사용되는 고성능 시스템
- 주로 키-값 저장소로 사용됨
- 데이터를 메모리에 저장하므로 디스크 기반 저장소보다 훨씬 빠른 속도로 데이터 처리 가능
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
참조
- Redis 웹사이트: https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-on-mac-os/
-