如何在 ElastiCache 中实施 Redis 密钥空间通知?

2 分钟阅读
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 Parameters(编辑参数)。

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@0__:key1 的消息中包含事件的名称“set”。

第三个事件是密钥事件通知。密钥空间频道 __keyevent@0__:set 的消息中包含密钥的名称“key1”。

5 秒后,您可以在输出中查看过期消息。这些消息中存在细微差异。一条消息是**__keyevent@0__:expire**,而另一条消息是**__keyevent@0__:expired**。

从 pubsub 实例中读取的每条消息都是一个字典,其中包含以下键:

  • Type(类型) – 为以下几种之一:订阅、取消订阅、psubscribe、punsubscribe、消息、pmessage
  • Pattern(模式) – 与已发布消息的频道匹配的模式(pmessage 类型除外,该类型在所有情况下均不匹配)
  • 频道(频道) – 消息发布到的频道或消息订阅到的频道
  • Data(数据) – 消息数据

使用 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 密钥过期侦听器已准备就绪。


AWS 官方
AWS 官方已更新 1 年前