Redis list
Redis 的 list(列表) 数据结构常用来作为异步消息队列使用,使用rpush/lpush操作入队列,
使用 lpop和 rpop来出队列。
rpush
RPUSH key value [value …]
将一个或多个值 value 插入到列表 key 的表尾(最右边)。
如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表尾:比如对一个空列表 mylist 执行 RPUSH mylist a b c ,得出的结果列表为 a b c ,等同于执行命令 RPUSH mylist a 、 RPUSH mylist b 、 RPUSH mylist c 。
如果 key 不存在,一个空列表会被创建并执行 RPUSH 操作。
当 key 存在但不是列表类型时,返回一个错误。
lpush
LPUSH key value [value …]
将一个或多个值 value 插入到列表 key 的表头
如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表头: 比如说,对空列表 mylist 执行命令 LPUSH mylist a b c ,列表的值将是 c b a ,这等同于原子性地执行 LPUSH mylist a 、 LPUSH mylist b 和 LPUSH mylist c 三个命令。
如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作。
当 key 存在但不是列表类型时,返回一个错误。
lpop
LPOP key
移除并返回列表 key 的头元素。
rpop
RPOP key
移除并返回列表 key 的尾元素。
StringRedisTemplete实现消息队列

消息生产者
/ * @author xianping * @version 1.0 * @classname MessagePublisher * @description 消息生产者 * @date 2020/12/07 11:48 */ @Component public class MessagePublisher {
@Resource private StringRedisTemplate stringRedisTemplate; //消息消费者 @Resource private MessageCustomer messageCustomer; //队列 private ListOperations<String, String> listOperations; //初始化队列 @PostConstruct private void init() {
this.listOperations = stringRedisTemplate.opsForList(); } /* * @description 发布消息 * @author xianping * @date 2020/12/7 * @param queue * @param message * @return void / public void publishMessage(String message) {
//消费者线程开启 if (!messageCustomer.isAlive()) messageCustomer.start(); listOperations.leftPush(MessageCustomer.REPORTQUEUE, message); } }
消息消费者
/ * @author xianping * @version 1.0 * @classname MessageCustom * @description * @date 2020/12/07 12:00 */ @Component @SuppressWarnings("All") public class MessageCustomer extends Thread {
@Resource private StringRedisTemplate stringRedisTemplate; @Resource private MatterReportService reportService; private ListOperations<String, String> listOperations; public final static String REPORTQUEUE = "QUEUE::NAME"; @PostConstruct private void init() {
this.listOperations = stringRedisTemplate.opsForList(); } /* * @description 消息消费者 * @author xianping * @date 2020/12/7 * @return void / @Override public void run() {
//消费者循环等待 while (true) {
String message = listOperations.rightPop(REPORTQUEUE); //队列中有消息则弹出消费 if (StringUtils.isNotBlank(message)) {
System.out.println("message = " + message); } } } }
使用
@RunWith(SpringRunner.class) @SpringBootTest public class SpringBootApplicationTests {
@Autowired private MessagePublisher publisher; @Test public void testRedisQueue() {
publisher.publishMessage("redis消息队列测试!"); } }
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/221051.html原文链接:https://javaforall.net
