개요
Redis는 Key가 Update 되면, 구독 중인 여러 프로그램으로 Notification 해주는 기능이 존재한다.
프로그램은 Redis의 Notification을 받으면, 자신이 구독한 Key에 대해서 Event Handler를 동작시킬 수 있다.
본 페이지에서는 이러한 Redis Server의 Notification 기능을 Python 프로그램과 연동시키는 과정을 설명한다.
의존성 설치
sudo apt-get update
sudo apt-get install redis
pip3 install redis
1. Redis Server 설정 수정
CONFIG SET을 통해 외부 프로그램이 Notification을 수신받을 수 있도록 Redis Server 설정을 수정
$ redis-cli
> CONFIG SET notify-keyspace-events KEA
> CONFIG GET notify-keyspace-events
아래 캡처는 위 명령을 순차적으로 실행시켰을 때의 결과이다.
이제, Python 프로그램이 구독 할 Notification Type을 확인하자.
이 과정은 아래 2.에서 설명한다.
2. 구독 할 Key의 Notification Type 확인
두 개의 터미널을 킨 후 터미널 1번(TERM1)에는 아래 명령을 실행시킨다.
TERM1 $ redis-cli --csv psubscribe '*'
그리고 나머지 터미널(TERM2)에서는 아래 명령을 실행시킨 뒤 Notification Type을 확인한다.
TERM2 $ redis-cli
TERM2 > SET aaa bb
TERM2의 명령을 실행시키면 TERM1에서는 아래와 같이 keyspace와 keyevents라는 Notification Type이 출력되는 것을 확인할 수 있다.
keyspace는 특정 key에 어떠한 명령이 가해졌는지를 Notification 해준다.
keyevent는 특정 명령이 어떠한 key에 가해졌는지를 Notificaiton 해준다.
이제 구독할 Notificaiton Type을 복사해주면 된다.
TERM1에서 출력된 문구 중에서 중간에 존재하는 데이터가 Notificaiton Type이다.
얻어진 Notification Type을 통해 Python 프로그램을 작성해주자.
샘플 소스는 아래 3.에 존재한다.
3. Redis Notification을 수신받는 Python 프로그램 작성
import time
import redis
REDIS_HOST = '127.0.0.1'
REDIS_PORT = 6379
r = redis.Redis(host=REDIS_HOST, port=REDIS_PORT)
pubsub = r.pubsub()
pubsub.psubscribe("__keyspace@0__:aaa") # 특정 Key에 대한 Notification 구독
# pubsub.psubscribe("__keyspace@0__:*") # 모든 Key에 대한 Notification을 위해 와일드카드 사용가능
# pubsub.psubscribe("__keyevent@0__:set") # Redis SET 명령에 대한 Notification 구독
while True:
message = pubsub.get_message()
if message:
print(message['channel'], message['data'])
else:
time.sleep(0.01)
위 샘플 소스를 실행시키면 Python 프로그램이 구독 중인 Notification을 잘 수신받는 것을 아래 캡처에서 확인할 수 있다.
References
https://redis.io/docs/latest/develop/use/keyspace-notifications/
https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-on-linux/
https://redis.io/docs/latest/develop/connect/clients/python/redis-py/
'Programming > Python' 카테고리의 다른 글
Poetry install 중 Pending... 막힐 때 (keyring 문제) (1) | 2024.10.10 |
---|