一、特性说明
- list是字符串列表,按照插入顺序排序。可以往头部或尾部填充数据
- list底层是类似链表的数据结构,元素有序且可重复的。读取方式可按下标读取或范围读取
- list最后一个元素出列后,列表会被删除且内存被回收
二、常用命令
(一)LPUSH
命令格式: lpush key value [value]
功能:将一个或多个值value插入到key列表的表头(最左边)
demo说明:
(二)RPUSH
命令格式: rpush key value [value]
功能:将一个或多个值value插入到key列表的表头(最右边)
demo说明:
(三)LPOP
命令格式: lpop key
功能:将移除并返回key列表的头元素
demo说明:
(四)RPOP
命令格式: rpop key
功能:将移除并返回key列表的尾元素
demo说明:
(五)LRANGE
命令格式: lrange key
功能:返回列表key中指定区间内的元素,区间以偏移量start和stop指定
demo说明:
(六)BLPOP
命令格式: blpop key [key] timeout
功能:返从key列表表头弹出一个元素,若列表中没有数据。阻塞等待timeout秒,如果timeout=0,一直阻塞
demo说明:
(七)BRPOP
命令格式: brpop key [key] timeout
功能:返从key列表表头弹出一个元素,若列表中没有数据。阻塞等待timeout秒,如果timeout=0,一直阻塞
demo说明:
三、应用场景
(一)异步发送推送消息
1、需求
订单流程中下单支付成功、物流信息、申请售后等需要推送消息到微信公众号
2、设计
- 定义一个消息队列,key为 "msg"+{msgChannel}
- 客户端push消息进入队列
- 服务端监听队列获取消息消费
3、开发
public void sendMsg() throws Exception {
String key = "msg" + "1";
//这里大家需要根据业务去定义一个对象封装,我这里随便写个json字符串
String content = "{"id":"10000"}";
redisTemplate.opsForList().leftPush(key,content);
}
定时任务接收消费消息
public void getMsg() throws Exception {
String key = "msg" + "1";
//阻塞读取消息
String result = (String)redisTemplate.opsForList().rightPop(key, 0, TimeUnit.SECONDS);
System.out.println(result);
//获取到消息就去继续去消费
}
(二)实现不同的数据结构
实现栈:lpush+lpop(后进先出)
队列:lpush+rpop(先进先出)
阻塞队列 lpush+brpop