Spring Boot与Redis的完美结合:高效实现订单超时处理

在这里插入图片描述

主页传送门:📀 传送

概述


  Redis支持过期监听,可以根据这个监听过期数据来进行订单的超时处理

流程如下:
在这里插入图片描述

修改配置文件

redis配置


在redis安装目录下找到下图文件
在这里插入图片描述
搜索notify-keyspace-events 配置一下键过期的参数,开启key过期回调监听,如下图所示:
在这里插入图片描述

配置完之后重启下服务才能生效

yml/properties配置


配置 Redis 连接:在 application.propertiesapplication.yml 文件中配置 Redis 的连接。

yml中redis配置:

在这里插入图片描述
properties中redis配置:
在这里插入图片描述

pom依赖


添加 Redis 依赖:确保项目中已添加了 Redis 相关的依赖
在这里插入图片描述

配置类


添加序列化及key过期事件监听

@Configuration
public class RedisListenerConfig {


    /**
     * 监听key过期事件
     *
     * @author ztt
     * @date 2023/10/24 15:01
     **/
    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        return container;
    }

    /**
     * RedisTemplate序列化
     *
     * @author ztt
     * @date 2023/10/24 15:00
     **/
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(stringRedisSerializer);
        redisTemplate.setHashKeySerializer(stringRedisSerializer);
        Jackson2JsonRedisSerializer<?> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}

创建订单时设置超时时间


@Service
public class TestOrderService ServiceImpl extends ServiceImpl<TestOrderMapper, TestOrder> implements TestOrderService{
	// .. 订单逻辑
	// 在创建订单时,将订单信息存储到 Redis,并为订单键设置合适的过期时间,以便 Redis 在超时后将其自动删除。
	//... 逻辑省略
	// 添加缓存
	commonRedisCache.put(ORDER_CACHE_KEY + testOrder.getId(), testOrder, 15*60); // 设置超时时间为15分钟
}

监听类


设置订单超时监听器:监听Redis 中的订单键是否已超时。如果订单超时,执行相应的处理逻辑。

/**
 * @ClassName RedisKeyExpirationListener
 * @Description TODO
 * @Author @ztt
 * @Date 2023/10/24 15:04
 * @Version 1.0
 */
@Slf4j
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {

	/** 测试订单 */
    @Resource
    private TestOrderService orderService;

	/** 通用redis缓存操作类 */
    @Resource
    private CommonRedisCache commonRedisCache ;

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

    /**
     * 针对redis数据失效事件,进行数据处理
     * @param message 失效的key
     */
    @Override
    public void onMessage(Message message, byte[] pattern) {
        log.info("过期redis数据:" + message.toString());
        try {
            String key = message.toString();
            //从失效key中筛选代表订单失效的key
            // 超时处理逻辑
            ...
            log.info("订单号为【" + 123456 + "】超时未支付-*****");    
        } catch (Exception e) {
            e.printStackTrace();
            log.error("【修改支付订单过期状态异常】:" + e.getMessage());
        }
    }
}

优缺点


Spring Boot整合Redis监听订单超时主要的优缺点:

优点

  1. 实时性:使用 Redis 来监听订单超时,可以实现实时性处理。当订单超时时,处理操作可以立即触发,而不需要定期轮询数据库或其他方式。

  2. 高性能:Redis 是一个内存数据库,因此具有高性能。它能够快速存储和检索数据,适合用于订单超时处理。

  3. 可扩展性:Redis 支持分布式部署,因此您可以轻松扩展应用程序以处理更多订单。您可以使用 Redis Sentinel 或 Redis Cluster 来实现高可用性和负载均衡。

  4. 减轻数据库压力:将订单超时的检查和处理从数据库转移到 Redis,可以减轻数据库服务器的负载,因为不再需要频繁地查询数据库。

  5. 简化代码:Redis 提供了内置的过期键和发布/订阅功能,这些功能使订单超时的处理逻辑更加简单和可维护。

缺点

  1. 单一点故障:如果 Redis 实例发生故障,可能导致订单超时处理不可用。为了解决这个问题,您可以使用 Redis Sentinel 或 Redis Cluster 来提高可用性。

  2. 不适合持久性数据:Redis 是一个内存数据库,不适合用于持久性数据存储。如果订单数据需要长期保留,您仍然需要在数据库中保留订单信息。

  3. 配置和维护:Redis 需要一些配置和维护工作,包括备份、监控、调整内存限制等。这可能需要额外的管理工作。

  4. 消息队列的竞争条件:如果多个实例同时处理订单超时,可能会引发竞争条件,需要在代码中进行处理。

  5. 性能成本:虽然 Redis 具有高性能,但在大规模订单处理时,可能需要更多的 Redis 实例和更强大的硬件,这可能带来一些成本。

在这里插入图片描述

  如果喜欢的话,欢迎 🤞关注 👍点赞 💬评论 🤝收藏  🙌一起讨论
  你的支持就是我✍️创作的动力!					  💞💞💞
  • 45
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 35
    评论
Spring Boot 中,我们可以通过添加 `spring-boot-starter-data-redis` 依赖来使用 Redis。然后,我们可以通过在 `application.properties` 或 `application.yml` 文件中添加以下属性来配置 Redis RDB 持久化: **application.properties:** ``` # Redis RDB 持久化 spring.redis.database=0 spring.redis.host=localhost spring.redis.port=6379 spring.redis.password= spring.redis.timeout=3000 spring.redis.jedis.pool.max-active=8 spring.redis.jedis.pool.max-idle=8 spring.redis.jedis.pool.min-idle=0 spring.redis.jedis.pool.max-wait=-1 spring.redis.redis-cluster=false spring.redis.sentinel.master= spring.redis.sentinel.nodes= spring.redis.sentinel.password= spring.redis.sentinel.pool.max-active=8 spring.redis.sentinel.pool.max-idle=8 spring.redis.sentinel.pool.min-idle=0 spring.redis.sentinel.pool.max-wait=-1 spring.redis.sentinel.pool.master-name= spring.redis.sentinel.pool.nodes= spring.redis.sentinel.pool.password= spring.redis.cluster.max-redirects=3 spring.redis.cluster.nodes=redis://localhost:6379 spring.redis.cluster.password= spring.redis.cluster.timeout=3000 spring.redis.cluster.max-redirects=3 spring.redis.lettuce.pool.max-active=8 spring.redis.lettuce.pool.max-idle=8 spring.redis.lettuce.pool.min-idle=0 spring.redis.lettuce.pool.max-wait=-1 spring.redis.lettuce.shutdown-timeout=100 spring.redis.lettuce.shutdown-timeout=100 ``` **application.yml:** ``` # Redis RDB 持久化 spring: redis: database: 0 host: localhost port: 6379 password: timeout: 3000 jedis: pool: max-active: 8 max-idle: 8 min-idle: 0 max-wait: -1 redis-cluster: false sentinel: master: nodes: password: pool: max-active: 8 max-idle: 8 min-idle: 0 max-wait: -1 pool: master-name: nodes: password: cluster: max-redirects: 3 nodes: redis://localhost:6379 password: timeout: 3000 max-redirects: 3 lettuce: pool: max-active: 8 max-idle: 8 min-idle: 0 max-wait: -1 shutdown-timeout: 100 shutdown-timeout: 100 ``` 其中,`spring.redis.database` 表示要使用的 Redis 数据库编号,默认为 0;`spring.redis.host` 和 `spring.redis.port` 表示 Redis 服务器的地址和端口号,默认为 `localhost` 和 `6379`;`spring.redis.password` 表示 Redis 认证密码,默认为空;`spring.redis.timeout` 表示连接 Redis 服务器的超时时间,默认为 3000 毫秒;`spring.redis.jedis.pool.max-active`、`spring.redis.jedis.pool.max-idle`、`spring.redis.jedis.pool.min-idle` 和 `spring.redis.jedis.pool.max-wait` 表示 Jedis 连接池的配置参数,可以根据实际情况进行调整。其他参数的含义可以参考官方文档。 配置完成后,我们可以通过在代码中注入 `RedisTemplate` 或 `StringRedisTemplate` 来进行 Redis 操作。例如: ``` @Autowired private RedisTemplate<String, Object> redisTemplate; public void set(String key, Object value) { redisTemplate.opsForValue().set(key, value); } public Object get(String key) { return redisTemplate.opsForValue().get(key); } ``` 注意,在使用 Redis RDB 持久化时,我们需要在 Redis 服务器的配置文件中开启 RDB 持久化功能。可以通过在配置文件中添加以下内容来开启 RDB 持久化: ``` save 900 1 save 300 10 save 60 10000 ``` 其中,`save` 表示 RDB 持久化的配置项,后面的三个数字分别表示多长时间内有多少次修改操作就会触发一次 RDB 持久化。例如,上面的配置表示如果在 900 秒内有至少一次修改操作、或者在 300 秒内有至少 10 次修改操作、或者在 60 秒内有至少 10000 次修改操作,就会触发一次 RDB 持久化。
评论 35
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

家有娇妻张兔兔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值