基于 Redis 的 list 实现队列的方式也有多种,先说第一种不推荐的方式,即使用LPUSH
生产消息,然后 while(true) 中通过RPOP
消费消息,这种方式的确可以实现,但是不断代码不断的轮询,势必会消耗一些系统的资源。
第二种方式也是不推荐的方式,也是通过 LPUSH
生产消息,然后通过 BRPOP
进行阻塞地等待并消费消息,这种方式较第一种方式减少了无用的轮询,降低系统资源的消耗,但是可能会存在队列消息丢失的情况,如果取出了消息然后处理失败,这个被取出的消息就将丢失。
第二种方式就是下文要介绍的方式,首先也是通过 LPUSH
生产消息,然后通过 BRPOPLPUSH
阻塞地等待 list 新消息到来,有了新消息才开始消费,同时将消息备份到另外一个 list 当中,这种方式具备了第二种方式的优点,即减少了无用的轮询,同时也对消息进行了备份不会丢失数据,如果处理成功,可以通过 LREM
对备份的 list 中当前的这条消息进行删除处理。
Redis 基础
1 2 3 4 5 6 7 8 |
|
代码实现队列消息生产者
笔者使用的是 Spring 相关 API 实现对 Redis 指令的调用。首先实现消息的生产代码,封装到一个工具类方法当中。这里很简单,就是调用了 lpush 方法,将序列化的 key 和 value 添加到列表当中去。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|