Redis는 고성능 키-값 저장소로, 캐싱, 메시지 브로커, 큐 시스템 등 다양한 용도로 사용된다. 이 글에서는 파이썬에서 Redis를 사용하는 방법을 소개한다.
Redis 시작하기
Redis 설치하기
Redis는 다양한 운영 체제에서 사용할 수 있습니다. 공식 웹사이트에서 제공하는 설치 지침(https://redis.io/docs/install/install-redis/) 을 따라 Redis를 설치할 수 있다.
나는 Mac 환경을 사용하므로 brew를 통해 설치했다.
brew install redis
이제 redis를 실행하자.
brew services start redis
파이썬에서 Redis 사용하기
설치한 Redis를 파이썬으로 제어하기 위해선 redis-py
라이브러리가 필요하다.
pip install redis
Redis 연결하기
Redis 서버에 연결하는 것은 매우 간단하다. redis.Redis
클래스를 사용하여 Redis 인스턴스를 생성하고, 이를 통해 데이터를 저장하거나 조회할 수 있다.
import redis
r = redis.Redis(host='localhost', port=6379, db=0) # 로컬에 띄운 Redis 서버에 연결
r.set('foo', 'bar') # key: foo value: bar
print(r.get('foo')) # foo 라는 키의 value를 가져옴
주석에 적어뒀듯이 redis 서버에 연결해서 foo: bar 라는 키: 값을 저장했고, foo라는 키의 값을 조회했다.
Redis의 기본 데이터 타입 이해하기
Redis는 문자열, 리스트, 세트, 해시, 정렬된 세트와 같은 다양한 데이터 타입을 지원한다. 앞서 "bar" 라는 값을 저장했고 이는 "문자열"에 해당된다. 값으로 문자열 외 다양한 데이터 타입을 지정할 수 있다고 이해하면 된다.
문자열
문자열은 Redis에서 가장 기본적인 데이터 타입이다. 대게 간단히 문자열 혹은 숫자를 저장하는 키: 값 저장소로 사용한다.
# 문자열 저장 및 조회
r.set('hello', 'world')
print(r.get('hello')) # b'world'
리스트
Redis의 리스트는 순서가 있는 문자열의 집합이다. 스택이나 큐처럼 사용할 수 있다.
# 리스트에 요소 추가
r.lpush("my_list", 1)
r.rpush("my_list", 100)
r.lrange("my_list", 0, -1) # 처음부터 끝까지 조회
이외에도 다양한 메서드가 지원된다. https://redis.io/docs/data-types/lists/ 여기를 확인하자.
Set
세트는 순서 없이 문자열을 저장하는데 사용된다. 중복된 값을 허용하지 않는다.
r.sadd("my_set", "a", "b", "a") # "a"를 두번 추가함
# 세트의 요소 조회
print(r.smembers('myset'))
고급 사용법
트랜잭션
Redis의 트랜잭션 기능을 사용하면 여러 명령어를 하나의 단위로 묶어 실행할 수 있다.
with r.pipeline() as pipe:
pipe.set('foo', 'bar')
pipe.set('hello', 'world')
pipe.execute()
당연히 위 코드는 잘 수행되겠지만 실행 중 에러가 난 경우 pipe 내 모든 명령어가 수행되지 않는다.
with r.pipeline() as pipe:
pipe.set('foo', 'bar') # 요거도 실행되지 않음
raise Exception("unexpected error")
pipe.set('hello', 'world')
pipe.execute()
마무리
파이썬에서 Redis를 사용하는 방법에 대해 알아보았다. 앞서 키-값 저장소, 캐싱, 메시지 브로커, 큐 시스템 등으로 사용할 수 있는 Redis라 소개했는데, 앞서 소개한 기능 외 간단한 캐싱 정도의 기능만을 사용해보았다.
Redis의 가장 큰 장점은 "사용하기 쉽고 간단하다." 라고 생각한다. 어떤 데이터든 직렬화해서 키-값 저장소로서 활용할 수 있고, 효율적인 캐싱 솔루션으로 사용할 수 있다. 메시지 브로커에 대해 생각해보면, 카프카가 가장 먼저 떠오르지만, Redis 역시 특정 상황에서 그 역할을 충분히(간단히) 사용할 수 있음을 생각할 수 있다. '특정 상황'에 대한 유스케이스를 경험 한다면 다시 글을 쓰겠다.