跳至内容

如何在 ElastiCache 中实现 Redis 键空间通知?

2 分钟阅读
0

我想在 Amazon ElastiCache 中实现 Redis 键空间通知。

简短描述

Redis 键空间通知允许您订阅 PubSub 通道。通过这些通道,当执行 Redis 命令或出现数据变更时,会收到发布的事件。如果存储在特定键中的值发生更改时,应用程序必须响应,此时,这些通知就会很有用。此外,您可以使用 Redis 键空间通知来关注数据集的变化。键空间通知功能在 2.8.6 及更高版本中可用。当调用 Redis 键空间通知时,会产生一个键空间通知和一个键事件通知。键空间通道接收事件的名称,键事件通道接收键的名称作为消息。

解决方法

**注意:**以下解决方法适用于关闭集群模式的 ElastiCache 集群。有关更多信息,请参阅 Redis 网站上的 Redis keyspace notifications

要在 ElastiCache 中实现 Redis 键空间通知,请完成以下步骤:

激活 Redis 键空间通知

注意:默认情况下,ElastiCache 会关闭 Redis 键空间通知。要激活自定义缓存参数组中的键空间通知,请使用 notify-keyspace-events 参数。此参数值使用多个参数来确定使用哪个通道(键空间键事件)以及要发布到相应通道的信息。有关更多信息,请参阅 Redis 2.8.6 added parameters

  1. 打开 ElastiCache 控制台
  2. 要查看可用参数组的列表,请在导航窗格中选择参数组
  3. 选择要修改的参数组。
    **注意:**您无法修改默认参数组。如果列出的所有参数组都是默认参数组,则创建一个新的参数组。
  4. (可选)要创建新的参数组,请选择创建参数组
    名称字段中,输入一个唯一名称。
    描述字段中,输入描述。
    选择一个系列
    选择创建
  5. 选择编辑参数值
  6. 导航到 notify-keyspace-events,然后在 Value(值)字段中输入 AKE。有关允许值的更多信息,请参阅 Redis 2.8.6 added parameters
  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. 要创建键空间事件,请运行任意一组命令。以下示例命令针对键 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 个通道。第二个事件是键空间通知,显示事件名称为 set。第三个事件是键事件通知,显示键名称为 key1。在第三个事件之后,您可以看到键空间和键事件通知过期的消息。

使用 Redis Python 客户端(redis-py)

  1. 要订阅通知,请使用 Python 2 或 Python 3 脚本。
    **注意:**以下脚本订阅所有键空间通知并打印收到的事件。
    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

  2. 在单独的会话中,连接到集群,然后运行 createkey.py 脚本来设置键或使其过期:
    **注意:**确保将 example-key 设置为键,将 example-value 设置为值。此外,将过期时间的值设为 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 年前