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

4분 분량
0

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 명령을 실행합니다. 키 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 키 만료 리스너가 준비되었습니다.


AWS 공식
AWS 공식업데이트됨 일 년 전