ElastiCache에서 Redis 키스페이스 알림을 구현하려면 어떻게 해야 합니까?
Amazon ElastiCache에서 Redis 키스페이스 알림을 구현하려면 어떻게 해야 합니까?
간략한 설명
Redis 키스페이스 알림을 사용하면 PubSub 채널을 구독할 수 있습니다. 클라이언트는 채널을 통해 Redis 명령이나 데이터 변경이 발생할 때 게시된 이벤트를 수신합니다. 이러한 알림은 특정 키에 저장된 값이 변경되었을 때 애플리케이션이 응답해야 하는 경우 유용합니다. 또한 Redis 키스페이스 알림을 사용하여 데이터 세트 변경 사항을 따를 수도 있습니다. 키스페이스 알림 기능은 버전 2.8.6 이상에서 사용할 수 있습니다.
Redis 키스페이스 알림을 트리거하는 명령이 실행되면 모니터링 클라이언트가 응답하는 다음의 두 가지 이벤트가 발생합니다.
- 키스페이스 알림
- 키 이벤트 알림
키스페이스 채널은 이벤트의 이름을 수신하고 키 이벤트 채널은 메시지로 키의 이름을 수신합니다.
중요: 다음 해결 방법은 Redis(클러스터 모드 비활성화) 클러스터에만 적용됩니다. 이 해결 방법은 Redis(클러스터 모드 사용) 클러스터에는 적용되지 않습니다. 두 유형의 클러스터에 대한 키스페이스 알림에 대한 자세한 내용은 Redis 사이트의 Redis 키스페이스 알림을 참조하십시오.
해결 방법
Redis 키스페이스 알림 활성화
ElastiCache는 기본적으로 Redis 키스페이스 알림을 비활성화합니다. notify-keyspace-events 파라미터를 사용하여 사용자 정의 캐시 파라미터 그룹에서 키스페이스 알림을 활성화할 수 있습니다. notify-keyspace-events 값은 여러 파라미터를 사용하여 사용할 채널(keyspace 이벤트 또는 key-event 이벤트)과 이러한 채널에 게시할 정보를 결정합니다. 자세한 내용은 Redis 2.8.6 추가 파라미터를 참조하세요.
1. ElastiCache 콘솔을 엽니다.
2. 사용 가능한 모든 파라미터 그룹의 목록을 보려면 탐색 창에서 **파라미터 그룹(Parameter Groups)**을 선택합니다.
3. 수정하려는 파라미터 그룹을 선택합니다.
참고: 기본 파라미터 그룹은 수정할 수 없습니다. 나열된 파라미터 그룹이 모두 기본값인 경우 **파라미터 그룹 생성(Create Parameter Group)**을 선택하고 **패밀리(Family)**를 선택한 다음, **생성(Create)**을 선택하여 새 파라미터 그룹을 생성합니다.
4. [Edit Parameter(매개 변수 편집)]를 선택합니다.
5. notify-keyspace-events로 스크롤한 다음 Value 필드에 AKE를 입력합니다. 허용되는 값에 대한 자세한 내용은 Redis 2.8.6 추가 파라미터를 참조하세요.
6. [Save Changes(변경 내용 저장)]를 선택합니다. 변경된 내용은 클러스터를 다시 시작하지 않고 즉시 적용됩니다.
참고: 새로 수정된 파라미터 그룹을 Redis 클러스터에 할당해야 합니다.
redis-cli를 사용하여 이벤트 생성
redis-cli를 사용하는 경우, 다음 명령을 실행하여 주어진 명령이 이벤트를 생성하는 방법을 확인할 수 있습니다.
#./redis-cli -c -h testdisabled.xxxxx.ng.0001.use1.cache.amazonaws.com -p 6379 --csv psubscribe '__key*__:*'
임의의 명령 세트를 실행하여 일부 키스페이스 이벤트를 만듭니다. 다음 명령은 만료된 이벤트의 키 Redis 및 구독자에 대한 값을 설정하고 만료 시간을 3초로 설정합니다.
./redis-cli -c -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 '*' Reading messages... (press Ctrl-C to quit) "psubscribe","*",1 "pmessage","*","__keyspace@0__:key1","set" "pmessage","*","__keyevent@0__:set","key1" "pmessage","*","__keyspace@0__:key1","expire" "pmessage","*","__keyevent@0__:expire","key1" "pmessage","*","__keyspace@0__:key1","expired" "pmessage","*","__keyevent@0__:expired","key1"
이 출력 예제에서 첫 번째 이벤트는 채널을 성공적으로 구독했음을 나타냅니다. 숫자 1은 현재 구독하는 채널 수를 나타냅니다.
두 번째 이벤트는 keyspace 알림입니다. 키스페이스 채널 __keyspace@0__:key1은 메시지로 이벤트 이름 “set”를 포함합니다.
세 번째 이벤트는 key-event 알림입니다. 키 이벤트 채널 __keyevent@0__:set는 메시지로 키 이름 “key1”을 포함합니다.
5초 후 출력에서 만료된 메시지를 볼 수 있습니다. 메시지에 미묘한 차이가 있습니다. 하나의 메시지는 __keyevent@0__:expire인 반면, 다른 메시지는 __keyevent@0__:expired입니다.
PubSub 인스턴스에서 읽은 각 메시지는 다음 키를 포함한 사전입니다.
- 유형 - 구독, 구독 취소, psubscribe, punsubscribe, 메시지, pmessage 중 하나에 해당합니다.
- 패턴 - 게시된 메시지의 채널과 일치하는 패턴(모든 경우에 일치하지 않는 pmessage 유형 제외)
- 채널 - 메시지가 게시되는 채널 또는 메시지가 구독되는 채널
- 데이터 - 메시지 데이터
Redis-PY를 사용하여 이벤트 생성
1. 알림을 구독합니다. 다음 예제는 모든 키스페이스 알림을 구독하고수신된 이벤트를 인쇄합니다. Python2 또는 Python3에 적합한 스크립트를 사용합니다.
Python2의 경우:
# 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)
Python3의 경우:
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)**로 설정합니다.
2. 키를 설정하거나 만료합니다.
별도의 세션에서 클러스터에 연결하고 createkey.py 명령을 실행합니다. 키 key2에 value2 값을 설정하고 만료 시간을 3초로 설정합니다.
# cat createkey.py import redis r = redis.Redis(host='testdisabled.xxxxx.ng.0001.use1.cache.amazonaws.com', port=6379, db=0) r.set('key2,’value2’) r.expire('key2’,3)
별도의 세션에서 subscribe.py 명령을 실행합니다. 다음은 예제 출력입니다.
# python2 subscribe.py Starting message loop 2020-08-17 18:16:23.902762 {u'pattern': None, u'type': 'psubscribe', u'channel': '__key*__:*', u'data': 1L} 2020-08-17 18:16:50.375281 {u'pattern': '__key*__:*', u'type': 'pmessage', u'channel': '__keyspace@0__:key2', u'data': 'set'} 2020-08-17 18:16:50.375365 {u'pattern': '__key*__:*', u'type': 'pmessage', u'channel': '__keyevent@0__:set', u'data': 'key2'} 2020-08-17 18:16:50.375442 {u'pattern': '__key*__:*', u'type': 'pmessage', u'channel': '__keyspace@0__:key2', u'data': 'expire'} 2020-08-17 18:16:50.375499 {u'pattern': '__key*__:*', u'type': 'pmessage', u'channel': '__keyevent@0__:expire', u'data': 'key2'} 2020-08-17 18:16:53.458622 {u'pattern': '__key*__:*', u'type': 'pmessage', u'channel': '__keyspace@0__:key2', u'data': 'expired'} 2020-08-17 18:16:53.458856 {u'pattern': '__key*__:*', u'type': 'pmessage', u'channel': '__keyevent@0__:expired', u'data': 'key2'}
Redis 키 만료 리스너가 준비되었습니다.
관련 콘텐츠
- 질문됨 하루 전lg...
- 질문됨 일 년 전lg...
- 질문됨 9달 전lg...
- 질문됨 일 년 전lg...
- AWS 공식업데이트됨 3년 전
- AWS 공식업데이트됨 2년 전
- AWS 공식업데이트됨 2년 전