내용으로 건너뛰기

ElastiCache에서 Redis Keyspace 알림을 구현하려면 어떻게 해야 하나요?

4분 분량
0

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 추가 파라미터를 참조하세요.

  1. ElastiCache 콘솔을 엽니다.
  2. 사용 가능한 파라미터 그룹 목록을 보려면 탐색 창에서 파라미터 그룹을 선택합니다.
  3. 수정하려는 파라미터 그룹을 선택합니다.
    참고: 기본 파라미터 그룹은 수정할 수 없습니다. 나열된 모든 파라미터 그룹이 기본값인 경우 새 파라미터 그룹을 생성하세요.
  4. (선택 사항) 새 파라미터 그룹을 만들려면 파라미터 그룹 생성을 선택합니다.
    이름 필드에 고유한 이름을 입력합니다.
    설명 필드에 설명을 입력합니다.
    패밀리를 선택하세요.
    생성을 선택합니다.
  5. 파라미터 값 편집을 선택합니다.
  6. notify-keyspace-events로 이동한 다음, 필드에 AKE를 입력합니다. 허용되는 값에 대한 자세한 내용은 Redis 2.8.6 추가 파라미터를 참조하세요.
  7. 변경 사항 저장을 선택합니다. 변경 사항은 즉시 적용되며 클러스터를 다시 시작할 필요가 없습니다.
    참고: 수정된 새 파라미터 그룹을 Redis 클러스터에 반드시 할당해야 합니다.

이벤트 생성

이벤트를 생성하려면 Redis 명령줄 인터페이스(CLI) 또는 Redis Python 클라이언트를 사용하세요.

Redis CLI(redis-cli) 사용

  1. 알림을 구독하려면 redis-cli를 사용하여 다음 명령을 실행합니다.

    #./redis-cli -h testdisabled.xxxxx.ng.0001.use1.cache.amazonaws.com -p 6379 --csv psubscribe '__key*__:*'
  2. 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>
  3. 이벤트가 생성되는지 확인합니다. 다음은 생성된 이벤트의 예제 출력입니다.

    #./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) 사용

  1. 알림을 구독하려면 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.sleep0.01로 설정했습니다.

  2. 별도의 세션에서 클러스터에 연결한 다음 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)
  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 키 리스너가 준비됩니다.

AWS 공식업데이트됨 2년 전
댓글 없음