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消息队列测试!");
}
}