redis中key过期的事件触发

一、redis简介
REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。

Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。

二、redis的key过期的事件触发

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

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

redis中key过期的事件触发_第1张图片
image.png

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

我使用的redis的版本:
image.png

配置事件监听
如图:


redis中key过期的事件触发_第2张图片
image.png

2.java实现redis中key过期事件触发
此处展示我自己实现的一种方式
b.创建一个实现类继承KeyExpirationEventMessageListener


package com.focussend.weixin.utils;

import com.focussend.contacts.service.FissionMarketingService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**

  • Created by Administrator on 2019/2/26.
    */
    @Component
    class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {

    public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
    super(listenerContainer);
    }

    @Resource
    private FissionMarketingService fissionMarketingService;
    private Logger logger = LoggerFactory.getLogger(RedisKeyExpirationListener.class);

    private final Object fanNumUpdate = new Object();
    /**

    • 针对redis数据失效事件,进行数据处理
    • @param message
    • @param pattern
      */
      @Override
      public void onMessage(Message message, byte[] pattern) {
      // 用户做自己的业务处理即可,注意message.toString()可以获取失效的key
      String expiredKey = message.toString();
      logger.info("此处根据对应的redis的key去处理业务逻辑");
      }
      }

c. 注入RedisMessageListenerContainer
方法一、使用xml增加的相关配置


方法二、使用config类
/**

  • Redis缓存配置类
    */
    @Configuration
    public class RedisConfigurer extends CachingConfigurerSupport {

    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {

     RedisMessageListenerContainer container = new RedisMessageListenerContainer();
     container.setConnectionFactory(connectionFactory);
     return container;
    

    }

}

三、测试
向redis中存入一个key和value并设置过期时间,key过期后会触发onMessage(Message message, byte[] pattern) 方法
redisCacheManagerTool.set("test_renjiao","haha",20);

四、备注
如果服务宕机,redis的过期事件如果正在执行没有执行完,那么事件不会重复推送,这样如果仅仅使用redis过期时间来解决并发问题并不是很安全,如果我们将spring的定时任务和redis相互结合,采用redis的特性(服务器宕机,redis会将数据存储到硬盘),然后通过定时器扫描执行任务,这样既可靠性能也好

你可能感兴趣的:(redis中key过期的事件触发)