Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
如何在 ElastiCache 中实现 Redis 键空间通知?
我想在 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。
- 打开 ElastiCache 控制台。
- 要查看可用参数组的列表,请在导航窗格中选择参数组。
- 选择要修改的参数组。
**注意:**您无法修改默认参数组。如果列出的所有参数组都是默认参数组,则创建一个新的参数组。 - (可选)要创建新的参数组,请选择创建参数组:
在名称字段中,输入一个唯一名称。
在描述字段中,输入描述。
选择一个系列。
选择创建。 - 选择编辑参数值。
- 导航到 notify-keyspace-events,然后在 Value(值)字段中输入 AKE。有关允许值的更多信息,请参阅 Redis 2.8.6 added parameters。
- 选择保存更改。更改立即生效,无需重新启动集群。
**注意:**请务必将修改后的新参数组分配给您的 Redis 集群。
生成事件
要生成事件,请使用 Redis 命令行界面(CLI)或 Redis Python 客户端:
使用 Redis CLI(redis-cli)
-
要订阅通知,请使用 redis-cli 运行以下命令:
#./redis-cli -h testdisabled.xxxxx.ng.0001.use1.cache.amazonaws.com -p 6379 --csv psubscribe '__key*__:*' -
要创建键空间事件,请运行任意一组命令。以下示例命令针对键 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> -
确认事件已生成。以下是生成的事件的输出示例:
#./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)
-
要订阅通知,请使用 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。
-
在单独的会话中,连接到集群,然后运行 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) -
在一个单独的会话中,运行 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 键侦听器已准备就绪。
相关内容
- 已提问 6 个月前
AWS 官方已更新 10 个月前
