zoukankan      html  css  js  c++  java
  • JAVA实现redis超时失效key 的监听触发

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

    而对超时的监听呢,并不需要自己发布,只有修改配置文件redis.conf中的:notify-keyspace-events Ex,默认为notify-keyspace-events "" 

     1 # K    键空间通知,以__keyspace@<db>__为前缀  
     2 # E    键事件通知,以__keysevent@<db>__为前缀  
     3 # g    del , expipre , rename 等类型无关的通用命令的通知, ...  
     4 # $    String命令  
     5 # l    List命令  
     6 # s    Set命令  
     7 # h    Hash命令  
     8 # z    有序集合命令  
     9 # x    过期事件(每次key过期时生成)  
    10 # e    驱逐事件(当key在内存满了被清除时生成)  
    11 # A    g$lshzxe的别名,因此”AKE”意味着所有的事件  

    修改好配置文件后,redis会对设置了expire的数据进行监听,当数据过期时便会将其从redis中删除:

    1.先写一个监听器:

     1 public class KeyExpiredListener extends JedisPubSub {  
     2   
     3     @Override  
     4     public void onPSubscribe(String pattern, int subscribedChannels) {  
     5         System.out.println("onPSubscribe "  
     6                 + pattern + " " + subscribedChannels);  
     7     }  
     8   
     9     @Override  
    10     public void onPMessage(String pattern, String channel, String message) {  
    11   
    12         System.out.println("onPMessage pattern "  
    13                         + pattern + " " + channel + " " + message);  
    14     }  
    15   
    16   
    17   
    18 }  

    2.订阅者:

     1 public class Subscriber {  
     2   
     3     public static void main(String[] args) {  
     4         JedisPool pool = new JedisPool(new JedisPoolConfig(), "localhost");  
     5   
     6         Jedis jedis = pool.getResource();  
     7         jedis.psubscribe(new KeyExpiredListener(), "__key*__:*");  
     8   
     9     }  
    10   
    11 }  

    3.测试类:

    public class TestJedis {  
      
        public static void main(String[] args) {  
            JedisPool pool = new JedisPool(new JedisPoolConfig(), "localhost");  
      
            Jedis jedis = pool.getResource();  
            jedis.set("notify", "你还在吗");  
            jedis.expire("notify", 10);  
      
        }  
    }  

    4.结果:

    先启动订阅者,然后执行测试类,然后等待10秒之后再监听类的方法中就可以获得回调。非常需要主要的时,过期监听的管道默认是__keyevent@0__:expired,艾特后面的0表示第几个是数据库,redis默认的数据库是0~15一共16个数据库。所以如果你存入的数据库是2,那么数据接收的管道就是__keyevent@2__:expired

  • 相关阅读:
    Codeforces 812E Sagheer and Apple Tree
    bzoj 4765: 普通计算姬
    bzoj 4552: [Tjoi2016&Heoi2016]排序
    bzoj 1096: [ZJOI2007]仓库建设
    bzoj 1030: [JSOI2007]文本生成器
    bzoj 1095: [ZJOI2007]Hide 捉迷藏
    JS实现HashMap
    A4纸表格打印
    JAVA字符串格式化-String.format()的使用
    证书打印CSS知识点总结
  • 原文地址:https://www.cnblogs.com/vianzhang/p/7756159.html
Copyright © 2011-2022 走看看