redis监听超时
- 概述
- 修改配置文件
- redis配置
- yml/properties配置
- pom依赖
- 配置类
- 创建订单时设置超时时间
- 监听类
- 优缺点
主页传送门:📀 传送
概述
Redis支持过期监听,可以根据这个监听过期数据来进行订单的超时处理
流程如下:
修改配置文件
redis配置
在redis安装目录下找到下图文件
搜索notify-keyspace-events 配置一下键过期的参数,开启key过期回调监听,如下图所示:
配置完之后重启下服务才能生效
yml/properties配置
配置 Redis 连接:在 application.properties
或 application.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监听订单超时主要的优缺点:
优点:
-
实时性:使用 Redis 来监听订单超时,可以实现实时性处理。当订单超时时,处理操作可以立即触发,而不需要定期轮询数据库或其他方式。
-
高性能:Redis 是一个内存数据库,因此具有高性能。它能够快速存储和检索数据,适合用于订单超时处理。
-
可扩展性:Redis 支持分布式部署,因此您可以轻松扩展应用程序以处理更多订单。您可以使用 Redis Sentinel 或 Redis Cluster 来实现高可用性和负载均衡。
-
减轻数据库压力:将订单超时的检查和处理从数据库转移到 Redis,可以减轻数据库服务器的负载,因为不再需要频繁地查询数据库。
-
简化代码:Redis 提供了内置的过期键和发布/订阅功能,这些功能使订单超时的处理逻辑更加简单和可维护。
缺点:
-
单一点故障:如果 Redis 实例发生故障,可能导致订单超时处理不可用。为了解决这个问题,您可以使用 Redis Sentinel 或 Redis Cluster 来提高可用性。
-
不适合持久性数据:Redis 是一个内存数据库,不适合用于持久性数据存储。如果订单数据需要长期保留,您仍然需要在数据库中保留订单信息。
-
配置和维护:Redis 需要一些配置和维护工作,包括备份、监控、调整内存限制等。这可能需要额外的管理工作。
-
消息队列的竞争条件:如果多个实例同时处理订单超时,可能会引发竞争条件,需要在代码中进行处理。
-
性能成本:虽然 Redis 具有高性能,但在大规模订单处理时,可能需要更多的 Redis 实例和更强大的硬件,这可能带来一些成本。
如果喜欢的话,欢迎 🤞关注 👍点赞 💬评论 🤝收藏 🙌一起讨论 你的支持就是我✍️创作的动力! 💞💞💞