Spring Boot监听redis过期的key

Redis支持过期监听,可以实现监听过期数据,实现过程如下

1、pom依赖

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

2、配置类

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


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * @Author: best_liu
 * @Description:
 * @Date Create in 14:51 2023/12/11
 * @Modified By:
 */
@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;
    }
}

3、配置监听

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

import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.stereotype.Component;

/**
 * @Author: best_liu
 * @Description:
 * @Date Create in 14:53 2023/12/11
 * @Modified By:
 */
@Slf4j
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {


    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("订单号为【" + key + "】超时未支付-*****");
        } catch (Exception e) {
            e.printStackTrace();
            log.error("【修改支付订单过期状态异常】:" + e.getMessage());
        }
    }
}

4、log输出

5、优缺点

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 实例和更强大的硬件,这可能带来一些成本。

 

相关推荐

  1. springboot 监听redis key

    2023-12-11 16:14:01       40 阅读
  2. spring项目监听rediskey失效事件

    2023-12-11 16:14:01       14 阅读
  3. 监听 Redis key 过期事件无效问题

    2023-12-11 16:14:01       13 阅读
  4. Redisbig key问题介绍以及监控手段

    2023-12-11 16:14:01       25 阅读
  5. Spring boot 实现监听 Redis key 失效事件

    2023-12-11 16:14:01       32 阅读
  6. redis模糊查询rediskey

    2023-12-11 16:14:01       12 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-11 16:14:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-11 16:14:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-11 16:14:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-11 16:14:01       18 阅读

热门阅读

  1. H3C网络设备交换机风扇亮黄灯故障处理

    2023-12-11 16:14:01       74 阅读
  2. PTA 7-226 sdut-C语言实验-矩阵输出(数组移位)

    2023-12-11 16:14:01       42 阅读
  3. C项目编译和链接[CL]

    2023-12-11 16:14:01       31 阅读
  4. docker的镜像创建 dockerfile

    2023-12-11 16:14:01       32 阅读
  5. SQL注入一般过程

    2023-12-11 16:14:01       34 阅读
  6. Linux 服务器内开放指定的端口

    2023-12-11 16:14:01       39 阅读
  7. 【React】react-router-dom路由导航的跳转及传参

    2023-12-11 16:14:01       43 阅读
  8. 深度学习为什么要进行训练

    2023-12-11 16:14:01       32 阅读
  9. PHP中对象数组化

    2023-12-11 16:14:01       36 阅读
  10. vue项目列表跳转详情返回列表页保留搜索条件

    2023-12-11 16:14:01       40 阅读
  11. 了解linux计划任务

    2023-12-11 16:14:01       41 阅读
  12. c++基础 循环遍历 新手学习

    2023-12-11 16:14:01       36 阅读