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中导入依赖


    org.springframework.boot
    spring-boot-starter-data-redis

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;
    }

}

你可能感兴趣的:(redis,spring,boot,java)