redis 任务队列

https://www.cnblogs.com/doyourself/p/6861374.html
### 如何在 Spring Boot 中实现基于 Redis任务队列 #### 添加依赖项 为了使 Spring Boot 应用程序能够与 Redis 协同工作,需引入必要的 Maven 或 Gradle 依赖。对于 Maven 用户来说,在 `pom.xml` 文件中加入如下片段: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 这会自动配置好大部分所需组件并简化开发流程[^1]。 #### 配置 Redis 连接参数 编辑项目的 application.properties (或 .yml),指定 Redis 数据库的位置以及认证凭证(如果有的话)。例如: ```properties spring.redis.host=localhost spring.redis.port=6379 ``` 这些设置允许应用程序找到本地运行的 Redis 实例,并建立网络连接。 #### 创建 RedisConfig 类 定义一个名为 `RedisConfig.java` 的 Java 类用于自定义化 RedisTemplate 及其他必要对象实例。此部分代码展示了如何调整序列化方式以便更好地处理复杂数据结构: ```java @Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory){ RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(factory); Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); template.setValueSerializer(jackson2JsonRedisSerializer); template.afterPropertiesSet(); return template; } } ``` 上述方法返回已配置好的 RedisTemplate 对象,它被用来执行各种命令操作数据库中的键值对。 #### 设计生产者消费者模式下的消息传递机制 现在可以构建两个主要的服务接口——ProducerService 和 ConsumerService 来模拟实际场景下发送和接收待办事项的过程。这里给出简单的例子说明怎样向列表左侧追加新条目(`LPUSH`)作为入栈动作;而从右侧弹出最老记录(`RPOP`)则代表出栈行为[^2]。 ##### 生产者服务 ProducerServiceImpl.java 每当有新的工作任务到来时就调用 pushTask 方法将其推送到共享资源池里等待后续处理: ```java @Service public class ProducerServiceImpl implements ProducerService { private static final String QUEUE_NAME = "task_queue"; @Autowired private RedisTemplate<String,Object> redisTemplate; @Override public void pushTask(String task) { System.out.println("Pushed Task: "+task+" into queue"); redisTemplate.opsForList().leftPush(QUEUE_NAME , task); } } ``` ##### 消费者服务 ConsumerServiceImpl.java 启动后台线程轮询检查是否有可用的任务可取出来做进一步加工。一旦发现目标即刻取出并打印日志确认完成情况: ```java @Component @Slf4j @RequiredArgsConstructor(onConstructor_=@Autowired) public class ConsumerServiceImpl implements ApplicationRunner{ private final RedisTemplate<String,Object> redisTemplate; private static final String QUEUE_NAME = "task_queue"; @Override public void run(ApplicationArguments args)throws Exception { while(true){ try{ Thread.sleep(500L); ListOperations<String, Object> listOps = this.redisTemplate.opsForList(); Long size=listOps.size(QUEUE_NAME ); if(size!=null && !size.equals(0)){ log.info("Popped Task: {}",listOps.rightPop(QUEUE_NAME )); }else{ continue; } }catch(Exception e){ throw new RuntimeException(e.getMessage()); } } } } ``` 这段逻辑实现了基本的任务分发框架,其中涉及到了阻塞式的读取消息的方式以确保即使面对高并发环境也能稳定可靠地运作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值