Redis 实现简单的消息队列
异步消息队列
说道消息队列,你肯定会想到Kafka、Rabbitmq等消息中间件,这些专业的消息中间件提供了很多功能特性,当然他的部署使用维护都是比较麻烦的。如果你对消息队列没那么高要求,想要轻量级的,使用Redis就没错啦。
Redis通过list数据结构来实现消息队列.主要使用到如下命令:
- lpush和rpush入队列
- lpop和rpop出队列
- blpop和brpop阻塞式出队列
缺点:
- 做消费者确认ACK麻烦,不能保证消费者消费消息后是否成功处理的问题(宕机或处理异常等),通常需要维护一个Pending列表,保证消息处理确认。
- 不能做广播模式,如pub/sub,消息发布/订阅模型
- 不能重复消费,一旦消费就会被删除
- 不支持分组消费
实现代码
消息生产
private static Logger log = LoggerFactory.getLogger(MQServiceImpl.class); private static final String MESSAGE_KEY = "message:queue"; @Autowired private RedisTemplate redisTemplate; @Override public void produce(String data) { redisTemplate.opsForList().leftPush(MESSAGE_KEY,data); }
消息消费
@Override public void consume() { String data = (String) redisTemplate.opsForList().rightPop(MESSAGE_KEY); log.info("consume : {}",data); }
测试
@RestController @RequestMapping(value = "/mqapi") public class MQController { @Autowired private MQService mqService; @GetMapping("/produce") public void produce(@RequestParam(name = "key") String key) { mqService.produce(key); } @GetMapping("/consume") public void cosume() throws InterruptedException { while (true) { mqService.consume(); Thread.sleep(10000); } } }
代码已上传到码云上,欢迎star
https://gitee.com/msetget/redis-bpush.git