spring中订阅redis键值过期消息通知

1、首先启用redis通知功能(ubuntu下操作):
编辑/etc/redis/redis.conf文件,添加或启用以下内容(过期通知):

notify-keyspace-events Ex

或者登陆redis-cli之后,输入以下命令:

config set notify-keyspace-events Ex

更多通知详见:http://redis.io/topics/notifications#configuration

2、Java Spring中配置监听

接口类:

import java.io.Serializable;
import java.util.Map;

public interface IMessageDelegate {
  void handleMessage(String message);
  void handleMessage(Map message);
  void handleMessage(byte[] message);
  void handleMessage(Serializable message);
  void handleMessage(Serializable message, String channel);
}

实现类:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.stereotype.Service;
import rhxtune.smarthome.api.interfaces.IMessageDelegate;
import java.io.Serializable;
import java.util.Map;

@Service
public class DefaultMessageDelegate implements IMessageDelegate {
    public static Logger logger = LogManager.getLogger(DefaultMessageDelegate.class.getName());

    @Override
    public void handleMessage(String message) {
        logger.info("handleMessage1:" +  message);
    }

    @Override
    public void handleMessage(Map message) {
        logger.info("handleMessage2:" +  message);
    }

    @Override
    public void handleMessage(byte[] message) {
        logger.info("handleMessage3:" +  message);
    }

    @Override
    public void handleMessage(Serializable message) {
        logger.info("handleMessage4:" +  message);
    }

    @Override
    public void handleMessage(Serializable message, String channel) {
        logger.info("handleMessage5:" +  message + channel);
    }
}

spring-redis.xml中配置:

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:redis="http://www.springframework.org/schema/redis"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.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">
    <!--<context:component-scan base-package="rhxtune.smarthome.api.repositorys" />-->
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxTotal" value="${redis.maxTotal}"></property>
        <property name="maxIdle" value="${redis.maxIdle}"></property>
        <property name="minIdle" value="${redis.minIdle}"></property>
        <property name="maxWaitMillis" value="${redis.maxWaitMillis}"></property>
        <property name="testOnBorrow" value="${redis.testOnBorrow}"></property>
    </bean>
    <bean id="jedisConnFactory"
          class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" destroy-method="destroy">
        <property name="hostName" value="${redis.hostname}" />
        <property name="port" value="${redis.port}" />
        <property name="timeout" value="${redis.timeout}" />
        <property name="database" value="${redis.database}" />
        <property name="password" value="${redis.password}" />
        <property name="usePool" value="true" />
        <property name="poolConfig" ref="jedisPoolConfig" />
    </bean>
    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <!-- 序列化方式 建议key/hashKey采用StringRedisSerializer。 -->
        <property name="keySerializer">
            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
        </property>
        <property name="hashKeySerializer">
            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
        </property>
        <property name="valueSerializer">
            <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
        </property>
        <property name="hashValueSerializer">
            <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
        </property>
        <property name="connectionFactory" ref="jedisConnFactory" />
    </bean>
    <!-- 对string操作的封装 -->
    <bean id="stringRedisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
        <property name="connectionFactory" ref="jedisConnFactory" />
    </bean>
    <!-- 设置redis消息订阅(方式1) -->
    <!--<bean id="listener" class="rhxtune.smarthome.api.services.DefaultMessageDelegate" />
    <redis:listener-container connection-factory="jedisConnFactory">
        <redis:listener ref="listener" method="handleMessage" topic="[email protected]__:expired" />
    </redis:listener-container>-->
    <!-- 设置redis消息订阅(方式2) -->
    <bean id="messageListener"
          class="org.springframework.data.redis.listener.adapter.MessageListenerAdapter">
        <constructor-arg>
            <bean class="rhxtune.smarthome.api.services.DefaultMessageDelegate" />
        </constructor-arg>
    </bean>
    <bean id="redisContainer" class="org.springframework.data.redis.listener.RedisMessageListenerContainer">
        <property name="connectionFactory" ref="jedisConnFactory" />
        <property name="messageListeners">
            <map>
                <entry key-ref="messageListener">
                    <list>
                        <bean class="org.springframework.data.redis.listener.ChannelTopic">
                            <constructor-arg value="[email protected]__:expired" />
                        </bean>
                        <bean class="org.springframework.data.redis.listener.PatternTopic">
                            <constructor-arg value="*" />
                        </bean>
                        <bean class="org.springframework.data.redis.listener.PatternTopic">
                            <constructor-arg value="‘__key*__:*" />
                        </bean>
                    </list>
                </entry>
            </map>
        </property>
    </bean>
</beans>

更多详情参见:http://docs.spring.io/spring-data/redis/docs/1.7.1.RELEASE/reference/html/#redis:pubsub:subscribe

时间: 2024-12-25 00:27:31

spring中订阅redis键值过期消息通知的相关文章

Redis键值过期自动执行回调函数

用到了 redis 的键空间通知(keyspace notifications) 今天帮忙解决问题时遇到的redis一个功能点 具体行为就是:某个键值到了过期时间自动触发回调函数,然后执行一些操作,比如订单15分钟未支付就自动取消. 系统环境Win10, PHP7.1 下面记录下刚才爬的坑: 1.redis 2.8版本的升级到 3.0 以上再说,比如 3.2 2.如果将redis加入到windows的系统服务了,建议在初始阶段停止服务,使用redis-server "配置文件路径" 来

redis 键值对 有效期设置

redis 键值对 有效期设置redis中可以使用expire命令设置一个键的生存时间, 到时间后redis会自动删除它<-----> 类比于javaweb系统临时数据 过期删除功能 expire 设置失效时间(单位/秒)persist 取消失效时间 ttl/pttl(单位为 秒/毫秒) 查看键的剩余时间 返回三种值 -2(健已经不存在了)  -1(表示永久有效)  大于0的数(还有多少有效时间) pexpire设置失效时间(单位/毫秒) expireat [key] unix时间戳13518

.NET 获取Get方式URL中的参数键值

在Web开发中,我们常常会涉及到需要获取Get方式URL中的参数键值的情况,这里简单介绍三种方法: 第一种:常用的做法有使用JavaScript获取location.href后用正则表达式匹配获取此URL的所有键值对: 第二种:这里比如有个Key参数键,需要获取它对应的值:这时可以使用.NET里的Request.Form["Key"](针对Post)或Request.QueryString["Key"](针对Get),也可以用Request["Key&qu

redis键的过期和内存淘汰策略

键的过期时间 设置过期时间 Redis可以为存储在数据库中的值设置过期时间,作为一个缓存数据库,这个特性是很有帮助的.我们项目中的token或其他登录信息,尤其是短信验证码都是有时间限制的. 按照传统的方法都是项目本身判断过期,这样无疑影响了系统性能. redis可以为set或者expire两种方式为键设置过期时间 1 Jedis jedis = new Jedis("localhost"); 2 //nxxx:nx是不存在是才set,xx是存在时才set 3 //expx:EX是秒,

redis 键值相关命令

键值相关命令 keys *   返回所有的键  keys my* exists mykey1 是否存在mykey1键 del mykey 删除mykey键 expire mykey 10 设置mykey键过期时间为10秒 ttl mykey 得到mykey的过期时间(不断变化),-1 表示已经过期,过期则被销毁掉 ,如果没设置过期时间,默认就是-1 redis 默认16个数据库,从0-15. 默认为0数据库 select 1 选择1 数据库 move age 1 将age移到1数据库 persi

Redis键值相关命令

1. keys 格式:keys {pattern} 返回满足给定pattern的所有key. 2. exists 格式:exists 'key' 判断key是否存在. 3. del 格式:del 'key' 删除key. 4. expire 格式:expire 'key' {num} 对键设置过期时间,键必须存在,num为秒. 5. persist 格式:persist 'key' 取消键的过期时间,键必须存在. 6. ttl 格式:ttl 'key' 获得key剩余时长. 7. select

Redis 键值数据类型及基本操作

到目前为止,Redis 支持的键值数据类型如下: 字符串(String) 哈希(Map) 列表(list) 集合(sets) 有序集合(sorted sets)   1. String 字符串类型 string是redis最基本的类型,一个key对应一个value. string类型是二进制安全的.意思是redis的string可以包含任何数据.比如jpg图片或者序列化的对象 . string类型是Redis最基本的数据类型,一个键最大能存储512MB. String 命令: 赋值与取值 set

Java中Map根据键值(key)或者值(value)进行排序实现

我们都知道,java中的Map结构是key->value键值对存储的,而且根据Map的特性,同一个Map中 不存在两个Key相同的元素,而value不存在这个限制.换句话说,在同一个Map中Key是唯一的,而value不唯一.Map是一个接口,我们不能 直接声明一个Map类型的对象,在实际开发中,比较常用的Map性数据结构是HashMap和TreeMap,它们都是Map的直接子类.如果考虑到存取 效率的话,建议使用HashMap数据结构,而如果需要考虑到Key的顺序,建议使用TreeMap,但是

不知道属性名称,动态遍历json中的所有键值对

javascript中使用ajax技术访问后台资源的时候,常常使用json作为轻量级数据传输格式.json类似于java中的HashMap, 是由一系列的key-value键值对构成.如果后台返回给前台的json中key的值是动态生成的,那么我们没有办法使用常规 的object.name或object["name"]的方式来获取json中的值.这个时候我们需要在不知道属性名称的时候,遍历json对象 ,可以使用如下方式: var jsonObj = {"55":&q