ElastiCache에서 Redis Keyspace 알림을 구현하려면 어떻게 해야 하나요?
Amazon ElastiCache에서 Redis Keyspace 알림을 구현하려고 합니다.
간략한 설명
Redis Keyspace 알림을 사용하면 PubSub 채널을 구독할 수 있습니다. 이러한 채널을 통해 Redis 명령 또는 데이터 변경이 발생할 때 게시된 이벤트가 수신됩니다. 이러한 알림은 애플리케이션이 특정 키에 저장된 값의 변경 사항에 응답해야 할 때 유용합니다. 또한 Redis Keyspace 알림을 사용하여 데이터세트 변경 사항을 추적할 수 있습니다. Keyspace 알림 기능은 버전 2.8.6 이상에서 사용할 수 있습니다. Redis Keyspace 알림이 간접적으로 호출되면 Keyspace 알림과 키-이벤트 알림이 발생합니다. Keyspace 채널은 이벤트 이름을 수신하고, 키-이벤트 채널은 키 이름을 메시지로 수신합니다.
해결 방법
참고: 다음 해결 방법은 클러스터 모드가 꺼진 ElastiCache 클러스터에 적용됩니다. 자세한 내용은 Redis 웹 사이트의 Redis Keyspace 알림을 참조하세요.
ElastiCache에서 Redis Keyspace 알림을 구현하려면 다음 단계를 완료하세요.
Redis Keyspace 알림 활성화
참고: 기본적으로 ElastiCache는 Redis Keyspace 알림을 끕니다. 사용자 지정 캐시 파라미터 그룹에서 Keyspace 알림을 활성화하려면 notify-keyspace-events 파라미터를 사용합니다. 이 파라미터 값은 여러 파라미터를 사용하여 사용할 채널(keyspace 또는 key-event)과 채널에 게시할 정보를 결정합니다. 자세한 내용은 Redis 2.8.6 추가 파라미터를 참조하세요.
- ElastiCache 콘솔을 엽니다.
- 사용 가능한 파라미터 그룹 목록을 보려면 탐색 창에서 파라미터 그룹을 선택합니다.
- 수정하려는 파라미터 그룹을 선택합니다.
참고: 기본 파라미터 그룹은 수정할 수 없습니다. 나열된 모든 파라미터 그룹이 기본값인 경우 새 파라미터 그룹을 생성하세요. - (선택 사항) 새 파라미터 그룹을 만들려면 파라미터 그룹 생성을 선택합니다.
이름 필드에 고유한 이름을 입력합니다.
설명 필드에 설명을 입력합니다.
패밀리를 선택하세요.
생성을 선택합니다. - 파라미터 값 편집을 선택합니다.
- notify-keyspace-events로 이동한 다음, 값 필드에 AKE를 입력합니다. 허용되는 값에 대한 자세한 내용은 Redis 2.8.6 추가 파라미터를 참조하세요.
- 변경 사항 저장을 선택합니다. 변경 사항은 즉시 적용되며 클러스터를 다시 시작할 필요가 없습니다.
참고: 수정된 새 파라미터 그룹을 Redis 클러스터에 반드시 할당해야 합니다.
이벤트 생성
이벤트를 생성하려면 Redis 명령줄 인터페이스(CLI) 또는 Redis Python 클라이언트를 사용하세요.
Redis CLI(redis-cli) 사용
-
알림을 구독하려면 redis-cli를 사용하여 다음 명령을 실행합니다.
#./redis-cli -h testdisabled.xxxxx.ng.0001.use1.cache.amazonaws.com -p 6379 --csv psubscribe '__key*__:*' -
Keyspace 이벤트를 생성하려면 원하는 명령 세트를 실행합니다. 다음 예제 명령은 만료된 이벤트에 대한 키 Redis와 구독자의 값을 설정하고 만료 시간은 3초로 설정합니다.
#./redis-cli -h testdisabled.xxxxx.ng.0001.use1.cache.amazonaws.com -p 6379 testdisabled.xm4oz6.ng.0001.use1.cache.amazonaws.com:6379> testdisabled.xm4oz6.ng.0001.use1.cache.amazonaws.com:6379> SET key1 value1 ex 5 testdisabled.xm4oz6.ng.0001.use1.cache.amazonaws.com:6379> -
이벤트가 생성되는지 확인합니다. 다음은 생성된 이벤트의 예제 출력입니다.
#./redis-cli -h testdisabled.xxxxx.ng.0001.use1.cache.amazonaws.com -p 6379 --csv psubscribe '__key*__:*' Reading messages... (press Ctrl-C to quit) "psubscribe","__key*__:*",1 "pmessage","__key*__:*","__keyspace@0__:key1","set" "pmessage","__key*__:*","__keyevent@0__:set","key1" "pmessage","__key*__:*","__keyspace@0__:key1","expire" "pmessage","__key*__:*","__keyevent@0__:expire","key1" "pmessage","__key*__:*","__keyspace@0__:key1","expired" "pmessage","__key*__:*","__keyevent@0__:expired","key1"위의 예제 출력에서 첫 번째 이벤트는 채널 1개를 성공적으로 구독했음을 나타냅니다. 두 번째 이벤트는 메시지로 설정된 이벤트 이름을 나타내는 Keyspace 알림입니다. 세 번째 이벤트는 키 이름 key1을 메시지로 나타내는 키 이벤트 알림입니다. 세 번째 이벤트 이후에는 Keyspace 및 키-이벤트 알림에 대한 만료 메시지를 볼 수 있습니다.
Redis Python 클라이언트(redis-py) 사용
-
알림을 구독하려면 Python 2 또는 Python 3 스크립트를 사용하세요.
참고: 다음 스크립트는 모든 Keyspace 알림을 구독하고 수신된 이벤트를 인쇄합니다.
Python 2:# cat subscribe.py import redis import datetime import time r = redis.Redis(host='testdisabled.xxxxx.ng.0001.use1.cache.amazonaws.com', port=6379, db=0) #Subscribing for events matching pattern "__key*__:*" p = r.pubsub() p.psubscribe('__key*__:*') print('Starting message loop') while True: message = p.get_message() if message: print datetime.datetime.now(), message else: time.sleep(0.01)Python 3:
import redis from datetime import datetime import time r = redis.Redis(host = 'testdisabled.xxxxx.ng.0001.use1.cache.amazonaws.com', port = 6379, db = 0) #Subscribing for events matching pattern "__key*__:* p = r.pubsub() p.psubscribe('__key*__:*') print('Starting message loop') while True: message = p.get_message() if message: print (datetime.now(), message) else: time.sleep(0.01)참고: 값이 낮거나 절전 모드가 없는 경우 클라이언트가 채널을 계속 폴링하여 서버 오버로드가 발생할 수 있습니다. 값이 클수록 서버의 메모리 사용량이 늘어납니다. 위 스크립트에서는 time.sleep을 0.01로 설정했습니다.
-
별도의 세션에서 클러스터에 연결한 다음 createkey.py 스크립트를 실행하여 다음과 같이 키를 설정하거나 만료합니다.
참고: 예제 키를 키로, 예제 값을 값으로 설정했는지 확인하세요. 또한 만료 시간을 3초로 설정하세요.# cat createkey.py import redis r = redis.Redis(host='testdisabled.xxxxx.ng.0001.use1.cache.amazonaws.com', port=6379, db=0) r.set('example-key','example-value') r.expire('example-key',3) -
별도의 세션에서 subscribe.py 스크립트를 실행합니다.
출력 예시:# python2 subscribe.py Starting message loop 2024-04-29 23:40:56.356659 {u'pattern': None, u'type': 'psubscribe', u'channel': '__key*__:*', u'data': 1L} 2024-04-29 23:40:56.356659 {u'pattern': None, u'type': 'psubscribe', u'channel': '__key*__:*', u'data': 1L} 2024-04-29 23:41:00.016410 {u'pattern': '__key*__:*', u'type': 'pmessage', u'channel': '__keyspace@0__:example-key', u'data': 'set'} 2024-04-29 23:41:00.016512 {u'pattern': '__key*__:*', u'type': 'pmessage', u'channel': '__keyevent@0__:set', u'data': 'example-key'} 2024-04-29 23:41:00.016582 {u'pattern': '__key*__:*', u'type': 'pmessage', u'channel': '__keyspace@0__:example-key', u'data': 'expire'} 2024-04-29 23:41:00.016650 {u'pattern': '__key*__:*', u'type': 'pmessage', u'channel': '__keyevent@0__:expire', u'data': 'example-key'} 2024-04-29 23:41:03.111509 {u'pattern': '__key*__:*', u'type': 'pmessage', u'channel': '__keyspace@0__:example-key', u'data': 'expired'} 2024-04-29 23:41:03.111601 {u'pattern': '__key*__:*', u'type': 'pmessage', u'channel': '__keyevent@0__:expired', u'data': 'example-key'}참고: 위 명령을 완료하면 Redis 키 리스너가 준비됩니다.

