ElastiCache에서 Redis 키스페이스 알림을 구현하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2021년 4월 27일

Amazon ElastiCache에서 Redis 키스페이스 알림을 구현하려면 어떻게 해야 합니까?

간략한 설명

Redis 키스페이스 알림을 사용하면 PubSub 채널을 구독할 수 있습니다. 클라이언트는 채널을 통해 Redis 명령이나 데이터 변경이 발생할 때 게시된 이벤트를 수신합니다. 이러한 알림은 특정 키에 저장된 값이 변경되었을 때 애플리케이션이 응답해야 하는 경우 유용합니다. 또한 Redis 키스페이스 알림을 사용하여 데이터 세트 변경 사항을 따를 수도 있습니다. 키스페이스 알림 기능은 버전 2.8.6 이상에서 사용할 수 있습니다.

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.    알림을 구독합니다. 다음 예제는 모든 키스페이스 알림을 구독하고수신된 이벤트를 인쇄합니다.

# 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)

참고: 값이 낮거나 절전 모드가 없으면 클라이언트가 채널을 지속적으로 폴링하여 서버에 과부하가 걸릴 수 있습니다. 값이 클수록 서버 측에서 더 많은 메모리 사용량이 발생합니다. 앞의 예제에서는 time.sleep(0.01)로 설정합니다.

2.    키를 설정하거나 만료합니다.

별도의 세션에서 클러스터에 연결하고 createkey.py 명령을 실행합니다. 키 key2value2 값을 설정하고 만료 시간을 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 키 만료 리스너가 준비되었습니다.


이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요하세요?