Redis键空间通知

2021-03-14  本文已影响0人  颍水书生

重要 键空间通知是2.8.0以后版本可用的一个特性。

特性概览

键空间通知允许客户端订阅Pub/Sub通道,以便接收对Redis数据集的某些方面影响的事件。

可以被接收的事件的例子:

事件使用Redis的Pub/Sub层来传递,所以客户端可以使用这些特征实现Pub/Sub而不需要做修改。

因为Redis Pub/Sub是发射既忘(fire and forget),目前没有办法使用这个特征,如果你的应用需求是事件的可信通知的话,那是因为,如果你的Pub/Sub客户端失去连接,且稍后重连接时,所有的事件在重新连接时都丢失。

未来有计划允许更可靠的事件传递,不过这将很可能定位在更一般层级上的,要么是给Pub/Sub本身带来可靠性,要么是允许Lua脚本拦截Pub/Sub消息以执行诸如将事件推入列表这样的操作。

事件类型

键空间的通知通过为每个影响Redis数据空间的操作发送两种不同的事件类型实现。比如,一个DEL操作命中数据库0中名为mykey的键将触发传递2个消息,准确来说等于下面的两个PUBLISH命令:

PUBLISH __keyspace@0__:mykey del
PUBLISH __keyevent@0__:del mykey

很容易的看到,一个通道是如何允许我们监听命中键mykey的所有事件,并且其他通道允许获取关于del操作的目标的所有键的信息。

第一种类型是通道中的以keyspace为前缀,被称为Key-space notification的事件,而第二种,是以keyevent为前缀,被称为Key-event notification的事件。

在上面的例子中,一个del事件为键mykey而生成。会发生什么:

为了传递我们感兴趣的子集的事件,仅开启通知中的一种是可能的。

配置

默认键空间事件通知是关闭的,因为这个功能使用了一些不能明确感知的CPU电源。是用redis.conf中的notify-keyspace-events或者通过CONFIG SET开启通知。

设置参数到空字符串禁止通知。为了开启一个已经使用的非空字符串的特征,组合多个字符,每个字符有一个特殊的意味,就像下面的表格一样:

K     Keyspace events, published with __keyspace@<db>__ prefix.
E     Keyevent events, published with __keyevent@<db>__ prefix.
g     Generic commands (non-type specific) like DEL, EXPIRE, RENAME, ...
$     String commands
l     List commands
s     Set commands
h     Hash commands
z     Sorted set commands
t     Stream commands
x     Expired events (events generated every time a key expires)
e     Evicted events (events generated when a key is evicted for maxmemory)
m     Key miss events (events generated when a key that doesn't exist is accessed)
A     Alias for "g$lshztxe", so that the "AKE" string means all the events except "m".

至少KE必须在字符串中出现,否则剩余的字符串中将不会有事件会被传递。

例如,为列表仅开启Key-space事件,这个配置参数必须设置为K1,等等。

字符串KEA可以用于开启每个可能的事件。

不同命令生成的事件

重要 所有的命令只在目标键真实改变时生成事件。比如,一个SREM 从集合中删除一个不存在的元素时,将不会真正的改变键的值,因此将不会有事件生成。

如果对一个给定的命令如何生成一个事件有疑问的话,最简单的事情就是观察你自己:

$ redis-cli config set notify-keyspace-events KEA
$ redis-cli --csv psubscribe '__key*__:*'
Reading messages... (press Ctrl-C to quit)
"psubscribe","__key*__:*",1

这时,在另外一个客户端使用redis-cli发送命令到Redis服务端,并且观察事件的生成:

"pmessage","__key*__:*","__keyspace@0__:foo","set"
"pmessage","__key*__:*","__keyevent@0__:set","foo"
...

过期事件的时间线

Redis通过两种方式使与生存时间关联的键过期:

当一个键被访问且被上面的系统之一发现过期后,产生一个expired事件,因此不能保证Redis服务器能够在键的生存时间到0时生成expired事件。

如果没有命令经常访问键,且有很多有TTL关联的键,在键的生存时间降低为0和生成expired事件的时间之间将会有一个较大的延迟。

基本上来讲,是当Redis服务器删除键时而并不是键的理论的生存时间到达为0时,生成expired事件。

集群中的事件

如上所述,每个Redis集群生成自己键空间的子集。可是,不像规则的Pub/Sub在集群中的通讯,事件通知不是广播到所有的节点。不同的是,键空间事件是节点特异性的。这意味着,为了接收集群的所有的键空间事件,客户端需要订阅每个节点。

History 记录

上一篇 下一篇

猜你喜欢

热点阅读