Redis 触发器

Redis 触发器

监听 Redis 中Key超时失效的事件  

Redis中的key可以设置生存时间,当该key超时失效时会触发一个事件

过期事件通过Redis的订阅与发布功能(pub/sub)来进行分发。


首先需要修改Redis 的配置文件,将 notify-keyspace-events 的值改为 Ex


1.监听程序

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisPubSub;

/**
 * 监听器,监听redis中键到期自动删除事件,(键需要设置过期时间)
 * 
 * 需要在redis配置文件中设置 notify-keyspace-events 的值为 Ex
 */
public class RedisTimerListener extends JedisPubSub {

    //获取jedis连接
    Jedis jedis ;
    public void init(){

        JedisPool jedisPool = new JedisPool(new JedisPoolConfig(),"127.0.0.1",6379,0,"redis",0);
        jedis = jedisPool.getResource();
    }
 
    /**
     * 监听器被加载时执行该方法
     */
    @Override
    public void onPSubscribe(String pattern, int subscribedChannels) {
        init();
        System.out.println("onPSubscribe "
                + pattern + " " + subscribedChannels);
    }
 
    /**
     * 键到期自动删除时触发该方法
     */
    @Override
    public void onPMessage(String pattern, String channel, String message) {
        init();
        System.out.println(jedis.get(message));
        System.out.println("onPMessage pattern "
                        + pattern + " " + channel + " " + message);
        
    }


}

2.订阅者
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * 订阅者   
 */
public class RedisSubscribe {
  
    public static void main(String[] args) {
        

        JedisPool jedisPool = new JedisPool(new JedisPoolConfig(),"127.0.0.1",6379,0,"redis",0);
        Jedis jedis = jedisPool.getResource();
        
        //订阅信息
        jedis.psubscribe(new RedisTimerListener(), "__keyevent@0__:expired");
        
    }

}

3.测试类

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * 测试类
 */
public class RedisTimerTest {
    
    public static void main(String[] args) {
        
        JedisPool jedisPool = new JedisPool(new JedisPoolConfig(),"127.0.0.1",6379,0,"redis",0);
        Jedis jedis = jedisPool.getResource();
        
        
        //将键放入redis,并设置生存时间 5s
        jedis.set("shorderid_12", "a12");
        jedis.expire("shorderid_12", 5);
        
        //删除键  (手动删除键时不触发事件)
        jedis.del("shorderid_12");

        jedis.set("shorderid_14", "a14");
        jedis.expire("shorderid_14", 7);
        
//        jedis.del("shorderid_14");

    
    }
 
}

注意:

过期监听的管道默认是__keyevent@0__:expired,艾特后面的0表示第几号是数据库,(0-15)


猜你喜欢

转载自blog.csdn.net/liyongbing1122/article/details/80888790