• redis监听key值过期失效


    简介:

      在redis的使用场景中,有时我们会对redis的键值进行监听,若redis的key过期,需要触发某些事件。

    举例:

      比如:用户下单成功,若三十分钟未付款,需要做某些事情。

    使用前提:

        redis版本 2.8.0+

      修改redis.conf中的notify-keyspace-events Ex,默认为notify-keyspace-events ""
      也可以使用执行命令:CONFIG set notify-keyspace-events Ex   (采用此种方法若重启redis需重新设置)

    代码实现:

      配置:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     3        xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
     4        xmlns:redis="http://www.springframework.org/schema/redis"
     5        xsi:schemaLocation="http://www.springframework.org/schema/beans
     6         http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/redis http://www.springframework.org/schema/redis/spring-redis.xsd">
     7 
     8     <context:component-scan base-package="com.abc.redis" />
     9 
    10     <!-- 开启注解 -->
    11     <context:annotation-config />
    12 
    13     <!-- scanner redis properties  -->
    14     <context:property-placeholder location="classpath:redis.properties" file-encoding="utf-8" ignore-unresolvable="true"/>
    15 
    16     <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
    17         <property name="maxIdle" value="1000" />
    18         <property name="maxTotal" value="10000" />
    19         <property name="testOnBorrow" value="true" />
    20     </bean>
    21 
    22     <bean id="redisConnectionFactory"
    23           class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
    24         <property name="usePool" value="true"></property>
    25         <property name="hostName" value="127.0.0.1" />
    26         <property name="port" value="6379" />
    27 <!--        <property name="password" value="" />-->
    28         <property name="timeout" value="10000" />
    29         <property name="database" value="1"></property>
    30         <constructor-arg index="0" ref="jedisPoolConfig" />
    31     </bean>
    32 
    33     <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
    34         <property name="connectionFactory" ref="redisConnectionFactory" />
    35         <property name="keySerializer" ref="stringRedisSerializer" />
    36         <property name="valueSerializer" ref="stringRedisSerializer" />
    37         <property name="hashKeySerializer" ref="stringRedisSerializer" />
    38         <property name="hashValueSerializer" ref="stringRedisSerializer" />
    39     </bean>
    40 
    41     <bean id="stringRedisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
    42         <property name="connectionFactory" ref="redisConnectionFactory" />
    43         <property name="keySerializer" ref="stringRedisSerializer" />
    44         <property name="valueSerializer" ref="stringRedisSerializer" />
    45         <property name="hashKeySerializer" ref="stringRedisSerializer" />
    46         <property name="hashValueSerializer" ref="stringRedisSerializer" />
    47     </bean>
    48 
    49     <bean id="stringRedisSerializer"
    50           class="org.springframework.data.redis.serializer.StringRedisSerializer" >
    51     </bean>
    52 
    53     <redis:listener-container>
    54         <redis:listener ref="listener" method="onMessage" topic="__keyevent@*__:expired"/>  //监听的失效的key
    55         <redis:listener ref="listener2" method="onMessage" topic="www"/>
    56     </redis:listener-container>
    57     <bean id="listener" class="com.abc.redis.RedisMessageListener" />
    58     <bean id="listener2" class="com.abc.redis.RedisMessageListener2" />
    59 </beans>

      

      监听类:针对于失效的key

     1 import org.springframework.data.redis.connection.Message;
     2 import org.springframework.data.redis.connection.MessageListener;
     3 import org.springframework.data.redis.core.RedisTemplate;
     4 import org.springframework.stereotype.Service;
     5 
     6 import javax.annotation.Resource;
     7 
     8 /**
     9  * @Author 
    10  * @Date
    11  */
    12 @Service
    13 public class RedisMessageListener implements MessageListener {
    14 
    15 
    16     @Resource
    17     private RedisTemplate redisTemplate;
    18 
    19     public RedisTemplate getRedisTemplate() {
    20         return redisTemplate;
    21     }
    22 
    23     public void setRedisTemplate(RedisTemplate redisTemplate) {
    24         this.redisTemplate = redisTemplate;
    25     }
    26 
    27     public void onMessage(Message message, byte[] pattern) {
    28         System.out.println(new String(message.getChannel()));
    29     }
    30 }

      APP:

     1 public class App {
     2 
     3     public static void main(String[] args) {
     4        ApplicationContext context = new ClassPathXmlApplicationContext("classpath:redis-context.xml");
     5 
     6         System.out.println(context);
     8 
     9     }
    10 }

    登录客户端命令:

      127.0.0.1:6379> set mykey abcde
      OK
      127.0.0.1:6379> expire mykey 5
      (integer) 1
      127.0.0.1:6379> ttl mykey
      (integer) -2
      127.0.0.1:6379>

      

  • 相关阅读:
    oracle 时间加减法 与C#
    BCB编写DLL
    面试题:产生一个长度为100的数组,为数组中的每一项随机填充1100之间的数并且保证不重复 (C#实现)
    公司内部员工运算测试题
    MVP 模式是否应该这样修改?
    MVP 模式是否应该这样修改2?
    面试题:一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少, 用递归算法实现(C#)
    使用游标进行跨数据库循环更新
    Hive 安装配置流程
    Scala的基本语法:集合应用
  • 原文地址:https://www.cnblogs.com/zchok/p/11558102.html
Copyright © 2020-2023  润新知