Redis核心数据结构之List(三)

243 阅读2分钟

一、特性说明

  • list是字符串列表,按照插入顺序排序。可以往头部或尾部填充数据
  • list底层是类似链表的数据结构,元素有序且可重复的。读取方式可按下标读取或范围读取
  • list最后一个元素出列后,列表会被删除且内存被回收

二、常用命令

(一)LPUSH

命令格式: lpush key value [value]

功能:将一个或多个值value插入到key列表的表头(最左边)

demo说明:
image.png

(二)RPUSH

命令格式: rpush key value [value]

功能:将一个或多个值value插入到key列表的表头(最右边)

demo说明:
image.png

(三)LPOP

命令格式: lpop key

功能:将移除并返回key列表的头元素

demo说明:
image.png

(四)RPOP

命令格式: rpop key

功能:将移除并返回key列表的尾元素

demo说明: image.png

(五)LRANGE

命令格式: lrange key

功能:返回列表key中指定区间内的元素,区间以偏移量start和stop指定

demo说明:
image.png

(六)BLPOP

命令格式: blpop key [key] timeout

功能:返从key列表表头弹出一个元素,若列表中没有数据。阻塞等待timeout秒,如果timeout=0,一直阻塞

demo说明:

image.png

(七)BRPOP

命令格式: brpop key [key] timeout

功能:返从key列表表头弹出一个元素,若列表中没有数据。阻塞等待timeout秒,如果timeout=0,一直阻塞

demo说明:
image.png

image.png

三、应用场景

(一)异步发送推送消息

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