SpringBoot + Redis 实现订单未支付自动取消

一:安装Redis

1. 新建挂载目录

mkdir -p /docker/redis-6379//data

mkdir -p /docker/redis-6379//conf

2. 在新建conf目录下增加配置文件 redis.conf,内容如下

允许远程连接 
protected-mode no

# 持久化
appendonly yes

# 密码
requirepass 123456

# 开启事件通知
notify-keyspace-events Ex

3. 创建redis容器并启动

docker run --name redis-63791 -p 6379:6379 -v /docker/redis-6379/data:/data -v /docker/redis-6379/conf/redis.conf:/etc/redis/redis.conf -d redis redis-server /etc/redis/redis.conf

释义如下:

–name:给容器起一个名

-p:端口映射 宿主机:容器

-v:挂载自定义配置 自定义配置:容器内部配置

-d:后台运行

redis-server --appendonly yes: 在容器执行redis-server启动命令,并打开redis持久化配置

4. 启动成功,查看状态

通过docker ps查看启动状态,是否成功

二:代码整合

1.开启事件通知,上面安装过程已经配置

notify-keyspace-events Ex

2. 在SpringBoot项目的pom.xml中导入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

3. 在项目中新建Listener 并继承自 KeyExpirationEventMessageListener

@Component
@Slf4j
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {

    @Autowired
    private OrderService orderService;

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

    @Override
    public void onMessage(Message message, byte[] pattern) {
        // 用户做自己的业务处理即可,注意message.toString()可以获取失效的key
        String expiredKey = message.toString();
        log.info("------------------redis key 失效; key = " + expiredKey);
        if (expiredKey.startsWith(GlobalConstant.RedisPrefixKey.ORDER_PREFIX)) {
            // 获取订单orderNO
            String orderNo = expiredKey.substring(expiredKey.lastIndexOf(":")+1);
            // 将待支付的订单改为已取消(超时未支付)
            orderService.orderPaidTimeout(orderNo);
        }
    }
}

4. 新建配置类 RedisListenerConfig

@Configuration
public class RedisListenerConfig {

    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        return container;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值