2025/12/27 18:08:38
网站建设
项目流程
旅游网站有哪些功能,网站费用标准,怎么删除一个wordpress,宁波网站建设58同城目录
Redis 为什么能够作为消息队列三种消息队列实现方式概览Redis List 队列机制及 Spring 实战Redis Pub/Sub 发布订阅机制及使用方式Redis Stream#xff1a;最强队列机制#xff08;含 ACK、消费组#xff09;Spring Boot 整合 Stream#xff08;完整可运行#xff09…目录Redis 为什么能够作为消息队列三种消息队列实现方式概览Redis List 队列机制及 Spring 实战Redis Pub/Sub 发布订阅机制及使用方式Redis Stream最强队列机制含 ACK、消费组Spring Boot 整合 Stream完整可运行Redis Stream 与 Kafka 的特点对比使用场景总结1. Redis 为什么可以用作消息队列Redis 是一个基于内存的高性能 Key-Value 数据库它的数据结构丰富且操作均为 O(1)。队列的本质是“先进先出按顺序取出”而 Redis 的 List、Pub/Sub 与 Stream 结构分别可以满足不同层次的队列需求List可以充当普通队列Pub/Sub提供实时的发布订阅Stream提供带持久化、消费组、ACK 确认机制的专业队列能力这让 Redis 在轻量级 MQ 场景下非常灵活也非常高效。2. Redis 三种消息队列方案对比方案持久化是否丢消息是否支持消费组是否需要 ACK使用难度适用场景ListLPUSH/RPOP支持有可能丢失不支持不支持最简单简单后台任务、异步执行Pub/Sub不支持订阅者离线即丢失不支持不支持中等实时消息推送、广播通知Stream支持不容易丢失支持支持相对复杂订单处理、任务调度、分布式队列从功能完善度来看Stream 是最推荐的方案。从使用简单度来看List 是最容易上手的。3. Redis List 队列机制LPUSH RPOPList 是 Redis 最经典的队列实现方式。通过“左进右出”就可以模拟一个典型的 FIFO 队列。特点说明实现简单可快速上手使用 RedisTemplate 就能轻松实现不支持消费者确认机制消息投递后无法保证成功处理多消费者会导致竞争同一条消息不适合任务分布式分发因此List 更适合简易异步任务、低可靠场景。生产者示例AutowiredprivateStringRedisTemplateredisTemplate;publicvoidsendMessage(Stringmsg){redisTemplate.opsForList().leftPush(task_queue,msg);}消费者示例Scheduled(fixedDelay1000)publicvoidconsumer(){StringmsgredisTemplate.opsForList().rightPop(task_queue);if(msg!null){System.out.println(处理任务msg);}}这种方式虽然简单但不具备强队列能力。4. Redis Pub/Sub 发布订阅模式Pub/Sub 提供了一种非常实时化的消息推送方式它不存储历史消息只有在线订阅者才能收到。模式特点适合实时通知如系统消息、广播消息、在线聊天不会保存消息订阅者掉线即丢失没有 ACK无法保证每条消息被处理Pub/Sub 不适合作为任务队列但适合“实时推送”。监听器配置ConfigurationpublicclassRedisConfig{BeanMessageListenerAdapterlistenerAdapter(MessageReceiverreceiver){returnnewMessageListenerAdapter(receiver,onMessage);}BeanRedisMessageListenerContainercontainer(RedisConnectionFactoryfactory,MessageListenerAdapterlistenerAdapter){RedisMessageListenerContainercontainernewRedisMessageListenerContainer();container.setConnectionFactory(factory);container.addMessageListener(listenerAdapter,newPatternTopic(notice));returncontainer;}}消费者ComponentpublicclassMessageReceiver{publicvoidonMessage(Stringmessage){System.out.println(收到通知message);}}生产者redisTemplate.convertAndSend(notice,系统通知服务器即将维护);5. Redis Stream专业级消息队列方案Stream 是 Redis 5.0 引入的全新数据结构是一套完整的消息队列系统特点如下支持持久化数据不会因断电丢失支持消费者组可由多个消费者组成消费集群支持 ACK 确认机制确保消息不会丢失单条消息被确定处理后自动从 Pending 列表中移除支持自动或手动 Claim保证消息不会被遗忘顺序性和性能都非常优秀Stream 可以被认为是小型版的 Kafka但更轻量、更容易部署。6. Spring Boot 整合 Redis Stream1依赖引入dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId/dependency2初始化消息队列的消费组为了防止不存在的消费组导致报错一般在项目启动时创建消费组ComponentpublicclassStreamInit{AutowiredprivateStringRedisTemplateredisTemplate;PostConstructpublicvoidinit(){try{redisTemplate.opsForStream().createGroup(order_stream,order_group);}catch(Exceptionignored){}}}3生产者发送消息AutowiredprivateStringRedisTemplateredisTemplate;publicvoidsendOrder(StringorderNo){MapString,StringmapnewHashMap();map.put(orderNo,orderNo);redisTemplate.opsForStream().add(order_stream,map);}4消费者处理消息包含 ACKComponentpublicclassOrderConsumerimplementsStreamListenerString,MapRecordString,String,String{AutowiredprivateStringRedisTemplateredisTemplate;OverridepublicvoidonMessage(MapRecordString,String,Stringrecord){StringorderNorecord.getValue().get(orderNo);System.out.println(正在处理订单orderNo);redisTemplate.opsForStream().acknowledge(order_stream,order_group,record.getId());}}5注册 Stream 监听器ConfigurationpublicclassStreamConfig{BeanpublicRedisMessageListenerContainerlistenerContainer(RedisConnectionFactoryfactory,OrderConsumerconsumer){RedisMessageListenerContainercontainernewRedisMessageListenerContainer();container.setConnectionFactory(factory);StreamMessageListenerContainer.StreamMessageListenerContainerOptionsString,MapRecordString,String,StringoptionsStreamMessageListenerContainer.StreamMessageListenerContainerOptions.builder().pollTimeout(Duration.ofSeconds(2)).build();StreamMessageListenerContainerString,MapRecordString,String,StringstreamContainerStreamMessageListenerContainer.create(factory,options);streamContainer.receiveAutoAck(Consumer.from(order_group,consumer_1),StreamOffset.create(order_stream,ReadOffset.lastConsumed()),consumer);streamContainer.start();returncontainer;}}至此Redis Stream 的生产-消费整体链路完整实现可以直接在实际项目中使用。7. Redis Stream 与 Kafka 的对比分析特点Redis StreamKafka吞吐量中等偏高极高消费机制消费组 ACK消费组 Offset持久化方式内存主导 AOF磁盘顺序写依赖环境极简部署容易较复杂需要 Zookeeper 或 Kraft使用场景中小型业务订单流、异步任务海量日志、实时流处理、大型数据系统结论当系统规模较小时Redis Stream 是简单高效的队列方案当系统达到大规模吞吐需求时Kafka 才是更合适的选择。8. 使用场景总结以下场景适合完全使用 Redis Stream 或 List/PubSub订单创建后的异步处理秒杀请求异步落库延迟任务队列短信/邮件异步发送系统通知、用户消息推送日志或审计消息收集数据同步、事件驱动架构Redis 的灵活性使它能够同时承担缓存、分布式锁和消息队列等多种角色适用于多种中小型分布式系统架构。结语Redis 不仅是一个高性能的缓存数据库同时也是一个非常灵活且强大的轻量级消息队列解决方案。依托于其多样化的数据结构、极高的读写性能以及简单易部署的特点Redis 在现代微服务架构中扮演着远超“缓存”本身的角色。在许多中小型项目中它可以承担消息传递、事件驱动、异步任务处理等职责甚至可以在一定程度上替代专业消息中间件。在 Spring 体系中Redis 的集成方式非常成熟且丰富无论是基于 List 的简易队列、基于 Pub/Sub 的实时广播消息还是基于 Stream 的分布式消息队列都可以通过 Spring Data Redis 顺畅地接入应用系统。其中 Redis Stream 是目前最值得推荐的方案它具备消息持久化、消费者组、消息确认机制ACK、Pending 列表管理、顺序性保证等能力能够提供接近 Kafka 那样的消息投递可靠性同时又保持了 Redis 一贯的简单部署和轻量成本。