热门搜索 :
考研考公
您的当前位置:首页正文

Spring实现redis键失效监听

来源:东饰资讯网

1.修改redis配置文件

修改配置文件redis.conf中的:notify-keyspace-events Ex,默认为notify-keyspace-events

配置参数说明:

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

修改好配置文件后,redis会对设置了expire的数据进行监听,当redis中的数据超时失效时,将会通知客户端.

2.在spring-jedis的配置文件中添加监听配置

<!--声明消息侦听器容器 -->
    <bean id="messageListener" class="org.springframework.data.redis.listener.adapter.MessageListenerAdapter">
        <constructor-arg>
            <bean 
        </constructor-arg>
    </bean>

    <bean id="redisContainer" class="org.springframework.data.redis.listener.RedisMessageListenerContainer">
        <property name="connectionFactory" ref="jedisConnectionFactory"/>
        <property name="messageListeners">
            <map>
                <entry key-ref="messageListener">
                    <bean class="org.springframework.data.redis.listener.ChannelTopic">
                        <constructor-arg value="__keyevent@0__:expired"/>
                    </bean>
                </entry>
            </map>
        </property>
    </bean>

3.编写失效回调接口

public interface MyMessageDelegate {

    void handleMessage(String message);

    void handleMessage(Map message);

    void handleMessage(byte[] message);

    void handleMessage(Serializable message);

    void handleMessage(Serializable message, String channel);
}

4.实现该接口并添加你的操作

public class MyMessageDelegateImpl implements MyMessageDelegate {

    private static final Logger logger = LoggerFactory.getLogger(MyMessageDelegateImpl.class);

    @Autowired
    private RedisTemplate<String,Object> redisTemplate;

    @Override
    public void handleMessage(String message) {
    }

    @Override
    public void handleMessage(Map message) {
    }

    @Override
    public void handleMessage(byte[] message) {
    }

    @Override
    public void handleMessage(Serializable message) {
        logger.info("失效的键:",message);
        //TODO 拿到失效的键后做其他操作
    }

    @Override
    public void handleMessage(Serializable message, String channel) {
    }
}
Top