Redis Keyspace Notifications

作者:Rui 发布时间:June 12, 2016 分类:JAVA,BIGDATA,Redis 浏览:1,367

Keyspace Notifiations 允许客户端通过Pub/Sub订阅所有影响Redis key的操作通知事件。
以下是可以接受的事件类型:

  1. 所有影响key的操作
  2. LPUSH操作
  3. Redis expire 操作

操作事件 依赖于Redis Pub/Sub 机制,所以客户端只需要订阅keySpace相关的channel即可实现订阅通知事件

因为Redis Pub/Sub 是一种并不可靠地消息机制,所以Keyspace Notification 也不是可靠地通知系统,如果你的系统需要很好的可靠性,那么Keyspace Notification可能并不是一种很好的选择。在将来,作者也表示希望实现可靠的Notification功能。

事件类型
Redis Keyspace Notification 会对每一个影响key的操作都会发出两种类型的事件,例如,删除一个key,会触发两个事件:

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

可以看出发出的这两个消息,属于不同的channel,一个是keyspace notification,一个是keyevent notification,
可以看出两种事件发出的消息,内容基本一致。我们也可以通过修改配置,让Redis 只发布一种消息

Notification配置
默认情况下,Redis 并不会开启Keyspace Notification, 我们可以通过修改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
x     Expired events (events generated every time a key expires)
e     Evicted events (events generated when a key is evicted for maxmemory)
A     Alias for g$lshzxe, so that the "AKE" string means all the events.

设置时,必须至少指定K或者E的其中一个,示例:
开启所有的事件

redis-cli config set notify-keyspace-events KEA

开启keyspace Events

redis-cli config set notify-keyspace-events KA

开启keyspace 所有List 操作的 Events

redis-cli config set notify-keyspace-events Kl

Java订阅keyspace Notification示例

JedisShardInfoshardInfo=newJedisShardInfo("kevincache.redis.cache.chinacloudapi.cn",6379);
Jedisjedis = newJedis(shardInfo);
jedis.psubscribe(newKeySpaceNotificationSub(),"__key*__:*");
try{
    Thread.sleep(10000L);
}catch(InterruptedExceptione){
    System.out.println("延时失败");
}
jedis.close();
System.out.println("Testrunfinished");

其他注意
Redis expire事件,因为Redis expire的Lazy机制,并不是在key的TTL时间归零时,就触发删除,而是当有主动请求或者是Redis定时的清理时,才会真正的从Redis cache中删除。而redis expire的事件也只有当真正在删除时,才会触发。这和key值的到期时间是有时间差的。

标签: none

仅有一条评论 »

  1. Nothing found for -ontario-canada .

添加新评论 »