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消息队列测试!");
}
}
本文介绍了如何在Spring Boot应用中利用Redis的List数据结构实现消息队列,展示了生产者使用`StringRedisTemplate`进行消息发布和消费者通过循环监听队列的示例。
8429

被折叠的 条评论
为什么被折叠?



