redis key过期通知

1、使用redis key 过期通知,需开启key过期通知功能:

登录进入redis-cli 客户端,执行:

 

config set notify-keyspace-events Ex

【或者启动redis前在redis.conf 添加配置:notify-keyspace-events "Ex" //过期时间监听生效】

2、启动监听key过期

登录进入redis-cli 客户端,执行:( 订阅一个或者多个符合pattern格式的频道)

PSUBSCRIBE __keyevent@*__:expired    

然后该客户端处于监听状态,如果有key过期,则列出

    Redis中发布与订阅只有简单的6个命令。即:
    
    订阅一个或者多个符合pattern格式的频道
    PSUBSCRIBE pattern [pattern ...]
    
    发布消息到chanel中
    PUBLISH channel message
    
    查看订阅与发布系统状态
    PUBSUB subcommand [argument [argument ...]]
    
    退订所有符合格式的频道
    PUNSUBSCRIBE [pattern [pattern ...]]
    
    订阅一个或者多个频道
    SUBSCRIBE channel [channel ...]
    
    取消订阅频道
    UNSUBSCRIBE [channel [channel ...]]

--------------------

测试:

3、另外开启一个客户端,添加test 为key,并设置5秒过期

setex test 5 test

5秒后,监听窗口显示:

 pmessage

__keyevent@*__:expired

__keyevent@0__:expired

test

 

java 代码:

 

 

先测试一下发布订阅

1、订阅消息的类

import redis.clients.jedis.JedisPubSub;

//订阅消息的处理类
public class SubScriber  extends JedisPubSub {
 
    @Override  //收到消息会调用
    public void onMessage(String channel, String message) {
        System.out.println(String.format("收到消息: channel %s, message %s", channel, message));
    }

    @Override  //订阅了频道会调用
    public void onSubscribe(String channel, int subscribedChannels) {
        System.out.println(String.format("订阅了频道: channel %s, subscribedChannels %d",
                channel, subscribedChannels));
    }

    @Override  //取消订阅 会调用
    public void onUnsubscribe(String channel, int subscribedChannels) {
        System.out.println(String.format("取消订阅: channel %s, subscribedChannels %d",
                channel, subscribedChannels));
    }

    @Override
    public void onPSubscribe(String pattern, int subscribedChannels) {
        System.out.println("on PSubscribe " + pattern + " " + subscribedChannels);
    }

    @Override  //收到消息会调用
    public void onPMessage(String pattern, String channel, String message) {
        System.out.println(
                "pattern = [" + pattern + "], channel = [" + channel + "], message = [" + message + "]");
        //收到消息 key的键值,处理过期提醒
    }
}

2、订阅mychannel

private final Subscriber subscriber = new Subscriber();

jedis.subscribe(subscriber, "mychannel");    //订阅mychannel, 订阅后当前线程处于租塞状态,等等消息

3、在 mychannel 的频道上推送消息

jedis.publish("mychannel","abc");   //在 mychannel 的频道上推送消息

测试


    public static void main(String[] args) throws InterruptedException {

        Jediss jedis = Redis.getUserJedis();

        PubSubScriber subscriber = new PubSubScriber();


        Thread t = new Thread(new Runnable() {
            public void run() {
                for (int i = 0; i < 10; i++) {
                    try {
                        Thread.currentThread().sleep(3000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    jedis.publish("mychannel", "abc - " + i); //在 mychannel 的频道上推送消息 
                }
            }
        });
        t.start();


        jedis.subscribe(subscriber, "mychannel"); // 订阅mychannel, 订阅后当前线程处于租塞状态,等等消息

    }

 结果:

订阅了频道: channel mychannel, subscribedChannels 1
收到消息: channel mychannel, message abc - 0
收到消息: channel mychannel, message abc - 1

 

 

4、订阅键的过期时间的键值

__keyevent@0__:expired

测试: (注意先 config set notify-keyspace-events Ex)

    //PSUBSCRIBE __keyevent@*__:expired
    public static void main(String[] args) throws InterruptedException {

        Jediss jedis = Redis.getUserJedis();

        PubSubScriber subscriber = new PubSubScriber();


        Thread t = new Thread(new Runnable() {
            public void run() {
                for (int i = 0; i < 10; i++) {
                    try {
                        Thread.currentThread().sleep(3000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    jedis.setex("test:ex:"+i,3,"abc"); //3秒过期
                    System.out.println("test:ex:"+i);
                }
            }
        });
        t.start();


        jedis.psubscribe(subscriber, "__keyevent@*__:expired"); // 订阅 __keyevent@*__:expired, 订阅后当前线程处于租塞状态,等等消息
    }

 on PSubscribe __keyevent@*__:expired 1
test:ex:0
pattern = [__keyevent@*__:expired], channel = [__keyevent@1__:expired], message = [test:ex:0]
test:ex:1
test:ex:2
pattern = [__keyevent@*__:expired], channel = [__keyevent@1__:expired], message = [test:ex:1]
pattern = [__keyevent@*__:expired], channel = [__keyevent@1__:expired], message = [test:ex:2]

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Redis中可以使用过期键(expire key)来设置键的过期时间,当键过期时,可以使用回调函数(callback function)来处理键过期的事件。 在Redis中,可以使用“键空间通知”(keyspace notification)来设置过期键的回调函数。通过键空间通知,可以订阅Redis中的某些事件,包括键的过期事件。当一个键过期时,Redis会触发一个键空间通知,可以通过设置相应的回调函数来处理这个事件。 设置过期键的回调函数可以通过以下步骤完成: 1. 在Redis配置文件中启用键空间通知keyspace notification)功能。 2. 使用Redis的客户端库(如Python Redis)订阅键空间通知中的过期事件。 3. 定义一个回调函数来处理过期事件。回调函数可以在Redis客户端库中注册。 4. 当一个键过期时,Redis会触发一个过期事件,并向订阅者发送一个键空间通知。在回调函数中可以处理这个事件。 示例代码如下(使用Python Redis客户端库): ```python import redis def callback_function(key): print("Key {} has expired".format(key)) r = redis.Redis(host='localhost', port=6379) # 开启键空间通知 r.config_set('notify-keyspace-events', 'Ex') # 订阅过期事件 p = r.pubsub() p.psubscribe('__keyevent@0__:expired') # 注册回调函数 p.subscribe(callback_function) # 阻塞等待过期事件 p.run_in_thread(sleep_time=0.1) ``` 在这个示例中,首先使用Redis客户端库连接到Redis服务器,并启用键空间通知功能。然后,订阅键空间通知中的过期事件,并注册一个回调函数来处理这个事件。最后,使用Redis客户端库的run_in_thread()方法来阻塞等待过期事件,直到程序被终止。 ### 回答2: 在Redis中,当一个key过期时,不会自动触发任何回调函数。然而,我们可以通过一些方法来实现类似回调的功能。 一种常见的方法是使用Redis的发布/订阅功能。我们可以在key过期时,发布一个通知消息。订阅者可以通过订阅该通知频道来接收该消息,并执行相应的操作。 另一种方法是使用Redis的Lua脚本。我们可以在设置key的同时,设置一个相应的过期时间,并在脚本中添加一些逻辑来处理过期事件。当key过期时,脚本会被自动调用,并执行脚本中定义的回调函数。 此外,我们还可以使用Redis的持久化功能来实现类似的回调。我们可以在key过期时,在AOF或RDB持久化文件中记录一个回调指令。当Redis重新启动时,它会根据持久化文件中的指令执行相应的操作。 总之,Redis本身没有直接提供回调的功能,但我们可以通过发布/订阅、Lua脚本或持久化等方式,来实现类似的功能。这些方法可以根据具体的需求来选择和应用。 ### 回答3: 当Rediskey过期时,Redis提供了一种回调机制来通知客户端或应用程序。这个回调机制是通过Redis的"notify-keyspace-events"配置来实现的。 在Redis的配置文件中,可以设置"notify-keyspace-events"参数来定义回调的行为。该参数可以设置为以下几种选项的组合: 1. "K":键空间通知,当有键过期或被删除时触发回调。 2. "E":键事件通知,当有键被修改时触发回调。 3. "g":一般命令通知,当有与键相关的一般命令(如DEL、RENAME等)被执行时触发回调。 4. "x":过期事件通知,当有一个key过期时触发回调。 5. "E":删除事件通知,当有一个key被删除时触发回调。 例如,如果想要在key过期时触发回调,可以将"notify-keyspace-events"设置为“Ex”,其中E表示键事件通知,x表示过期事件通知。 在应用程序中,可以通过订阅Redis的事件通道来接收过期key的回调。使用程序可以使用Redis的SUBSCRIBE命令订阅__keyevent@*__:*通道,然后监听特定的过期事件通道(如__keyevent@0__:expired)来接收过期key的回调信息。 当过期事件发生时,Redis将在该事件通道的SUBSCRIBE客户端上发布一条消息,其中包含过期key信息。应用程序可以通过监听这些消息来实现自定义的回调逻辑,比如清理相关的资源或执行特定的业务逻辑。 总之,当Rediskey过期时,可以通过配置Redis通知参数和监听Redis的事件通道来实现回调机制,从而实现对过期key发生的事件的处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值