redis过期监听在实际项目中的使用

11 篇文章 0 订阅
本文介绍了如何在Spring Cloud项目中利用Redis监听机制,实现在考试结束后自动统计及格人数。通过在Redis中设置过期键值对,并创建MessageListener监听过期事件,避免了定时任务的不足。同时讨论了解决MybatisPlus默认带用户认证的问题。
摘要由CSDN通过智能技术生成

目录

1.需求背景

2.创建监听类

3.创建配置类


1.需求背景

需求:在规定的时间段内,我们去进行考试,在时间一过,我们就需要去进行统计,有多少人考试及格。

在实际项目中,我们肯定会有部分需求是要求过了某一时间点,去执行一些特定的操作,而这些时间点都是不规律、不相同的,如果我们使用定时任务去做的话,实时性不高,而且使用定时任务可能会出现某些数据上的问题。

思路:在新建的时候,在redis保存一个以特定开头的key-value,过期时间是(规定的结束时间  -  新建时间);当他这个键值对过期的时候,就可以在监听类里面注入自己相应的service、mapper去操作自己相应的业务;

注意:如果我们要在监听类里面执行一些相应的操作,在执行的过程中,是没有用户认证、登录的,像博主的项目,采用的是spring cloud + mybatis plus,我们项目中mybatis plus的配置,在执行增删改查功能的时候,会默认带上当前登录用户信息和租户id这一个条件的,以至于执行可能会报错

2.创建监听类

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class KeyExpiredEventMessageListener implements MessageListener {

    @Override
    public void onMessage(Message message, byte[] bytes) {
        log.info("监听失效的redisKey:{},值是:{}, {}", message.toString(), new String(message.getBody()), new String(bytes));
        String expireKey = message.toString();
        if (expireKey.startsWith(BusinessConstant.REDIS_KEY_PRE))) {
           //执行特定的业务逻辑
        }
    }
}

3.创建配置类

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;

@Configuration
public class RedisListenerConfig {

    @Value("${spring.redis.database}")
    private Integer db;

    @Bean
    public RedisMessageListenerContainer customizeRedisListenerContainer(
            RedisConnectionFactory redisConnectionFactory,MessageListener messageListener) {
        RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer();
        redisMessageListenerContainer.setConnectionFactory(redisConnectionFactory);
        redisMessageListenerContainer.addMessageListener(messageListener,new PatternTopic("__keyevent@"+db.intValue()+"__:expired"));
        return redisMessageListenerContainer;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值