springboot利用redis过期事件处理过期订单

前言

在开发中我们经常会遇到这样的业务需求,某一条数据需要在xxx时间后处理,比如说未支付的订单,30分钟后过期。能够实现这一功能的技术有很多,但需要你根据系统的大小、业务的量的大小以及公司给到该项目的资源而决定。

比如说这是一个大商城,开始之初就已经部署了rabbitmq,那毫无疑问可以使用延时队列实现这一功能。如果说没有提供mq,一般情况下我们就定时轮询订单表了,这是非常最简单的一种实现方式。如果说你怕数据库压力大,那不妨可以选择redis。这篇文章介绍的就是如何利用redis处理过期事件。

实现

1.开启配置

打开redis.conf,开启如下配置

notify-keyspace-events Ex

这是为了使 Redis Key 过期事件能够被监听 ,需要启用 Redis 的键空间通知功能

2.创建监听器类

import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;

@Slf4j
public class RedisKeyExpiredListener implements MessageListener {
    @Override
    public void onMessage(Message message, byte[] pattern) {
        String expiredKey = message.toString();
        log.info("获取数据:"+expiredKey);
        if (expiredKey.startsWith("order:")) {
            // 一般来说,我们会这样设置过期订单的key:"order:255 "
            String orderId = expiredKey.split(":")[1];
            log.info("订单ID:"+orderId);
            // 处理实际业务
        }
    }
}

3.将监听器注册为 Bean

import com.gpt.dc.web.listener.RedisKeyExpiredListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;

@Configuration
public class RedisConfig {
    @Bean
    public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory connectionFactory,
                                                                       RedisKeyExpiredListener listener) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);

        // 配置监听的 Redis Key 过期事件的频道
        container.addMessageListener(listener, new PatternTopic("__keyevent@*__:expired"));

        return container;
    }

    @Bean
    public RedisKeyExpiredListener redisKeyExpiredListener() {
        return new RedisKeyExpiredListener();
    }
}

我们在配置类 RedisConfig 中将监听器注册为 Bean,并通过 RedisMessageListenerContainer 配置监听容器。我们使用 addMessageListener() 方法来添加监听器,并指定要监听的 Redis Key 过期事件的频道(__keyevent@*__:expired

接下来测试一下

@GetMapping("save")
public void saveOrder(Long id){
    RedisUtil.set("order:"+id, id.toString(), 10L);
}

10后过期,RedisKeyExpiredListener中的onMessage方法会自动监听,并在控制台上打印如下信息

c.g.d.w.l.RedisKeyExpiredListener:17   redisMessageListenerContainer-1                    获取数据:order:2
c.g.d.w.l.RedisKeyExpiredListener:20   redisMessageListenerContainer-1                    订单ID:2
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot中,可以使用Spring Data Redis来监听Redis中的键过期事件。具体操作如下: 1. 添加依赖 在pom.xml文件中添加spring-boot-starter-data-redisspring-boot-starter-web依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` 2. 配置RedisTemplate 在application.properties或application.yml文件中配置Redis连接信息和RedisTemplate: ```yaml spring: redis: host: localhost port: 6379 database: 0 password: 123456 timeout: 10000 cache: type: redis ``` ```java @Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(factory); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); return template; } } ``` 3. 配置消息监听器 创建一个Redis过期事件监听器,实现MessageListener接口,重写onMessage方法: ```java @Component public class RedisKeyExpirationListener implements MessageListener { @Override public void onMessage(Message message, byte[] pattern) { String expiredKey = message.toString(); // 在这里实现过期时的处理逻辑 System.out.println("Key expired: " + expiredKey); } } ``` 4. 配置监听器容器 在配置类中创建一个RedisMessageListenerContainer对象,设置RedisConnectionFactory、MessageListenerAdapter和监听的Pattern: ```java @Configuration public class RedisConfig { @Autowired private RedisKeyExpirationListener redisKeyExpirationListener; @Bean public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory factory) { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(factory); container.addMessageListener(new MessageListenerAdapter(redisKeyExpirationListener), new PatternTopic("__keyevent@0__:expired")); return container; } } ``` 以上就是配置Redis过期监听的步骤,监听器容器启动后,就可以监听Redis中键的过期事件了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值