当前位置: 首页 > news >正文

Redis数据类型之list

上篇文章:

Redis数据类型之hashhttps://blog.csdn.net/sniper_fandc/article/details/149139615?fromshare=blogdetail&sharetype=blogdetail&sharerId=149139615&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link

目录

1 lpush、lpushx和lrange

2 rpush和rpushx

3 lpop和rpop

4 lindex、linsert和llen

5 lrem

6 ltrim和lset

7 blpop和brpop

8 list的使用场景


        list是列表,实际上更接近双端队列,支持头插、尾差、头删和尾删等基本操作,可以用来充当栈或队列的使用。

1 lpush、lpushx和lrange

        命令:lpush key value1 value2 ...

        头插插入list多个元素。时间复杂度O(N),N表示插入元素的个数。返回值是list的长度。如果key不存在就创建;如果key存在就头插。因为是头插,所以最后插入的元素会在list的第一个位置。

        命令:lrange key start end

        查询list下标范围[start,end]的元素。时间复杂度O(N),N表示查询元素的个数。返回值按下标顺序的各元素。同样,下标也支持负数下标(表示倒数第几个)。如果下标超出范围,redis就会尽可能纠正下标到正确范围

        命令:lpushx key value1 value2 ...

        如果key存在,头插插入list多个元素;否则不插入。时间复杂度O(N),N表示插入元素的个数。返回值是list的长度。

2 rpush和rpushx

        命令:rpush key value1 value2 ...

        尾插插入list多个元素。时间复杂度O(N),N表示插入元素的个数。返回值是list的长度。如果key不存在就创建;如果key存在就尾插。因为是尾插,所以最先插入的元素会在list的第一个位置。

        命令:rpushx key value1 value2 ...

        如果key存在,尾插插入list多个元素;否则不插入。时间复杂度O(N),N表示插入元素的个数。返回值是list的长度。

3 lpop和rpop

        命令:lpop key

        头删key的list的元素。时间复杂度O(1)。返回值是被删除的元素或nil。

        命令:rpop key

        尾删key的list的元素。时间复杂度O(1)。返回值是被删除的元素或nil。

        可以搭配lpush和rpush实现队列或栈。(lpush和lpop)或(rpush和rpop)是栈,(lpush和rpop)或(rpush和lpop)是队列。

        注意:在redis 6.2版本后引入count参数可以一次删除多个元素。比如lpop key count,连续头删key对应list的count个元素。

4 lindex、linsert和llen

        命令:lindex key index

        获取list中下标index的元素。时间复杂度O(N),N是list的长度,这里因为list的底层实现可能是链表,链表查询是O(N)的复杂度。返回值是查询的元素或nil。

        命令:linsert key before | after element value

        在element元素前(before)或后(after)插入value。时间复杂度O(N),N是list的长度。返回值是list的长度。

        如果list中有重复的元素,就会从list头开始从左向右遍历找到第一个重复的元素进行插入:

        命令:llen key

        返回list的长度。时间复杂度O(1)。

5 lrem

        命令:lrem key count element

        删除list中count个元素element。时间复杂度O(N+M),N是list长度,M是删除的个数。如果count>0,从左往右删:

        如果count<0,从右往左删:

        如果count==0,删除全部满足value==element的元素:

6 ltrim和lset

        命令:ltrim key start end

        保留[start,end]的元素,其余的全部删除。时间复杂度O(N),N是list长度。

        命令:lset key index element

        把下标index的元素修改为element。时间复杂度O(N),N是list长度。如果下标越界则报错。

7 blpop和brpop

        blpop和brpop是lpop和rpop的阻塞版本,即当list为空时,执行blpop和brpop会阻塞(在此期间redis服务器可以执行其他命令),直到超出设置的阻塞时间或list不空;如果list不空,执行效果就如同lpop和rpop。

        blpop和brpop命令可以同时指定多个key,从左向右遍历key,只要有一个key的list弹出元素,就视为执行成功,命令立即返回。

        如果多个客户端并发对一个key执行blpop或brpop,在list为空时,如果阻塞时间内list有新元素,则会优先给最先执行的命令返回元素。

        命令:blpop key1 key2 ... timeout

        返回值是二元组,包括哪个key和对应弹出的元素。

        当list6和list7都没有元素了,此时再执行命令就会阻塞,直到其他客户端使用相关命令向list6或list7插入元素。

        31.63s表示阻塞的时间。brpop命令类似,不再演示。

        注意:timeout在redis 5设置时必须是整数的秒,但是redis 6以后就引入了小数的秒。

8 list的使用场景

        list最常用于多个同属于一个元素的值的存储(一对多场景),比如一个班级有多个学生。还有个作用是作为消息队列使用:消息队列需要使用阻塞队列作为数据结构,而list的实现类似双端队列,提供两端的存和取。利用lpush和brpop(需要用到阻塞),可以实现生产者往阻塞队列放元素,消费者取元素,如果没有元素可取就阻塞等待。

        在分布式系统中,往往需要解耦。对消息的传递也可以解耦,即利用多个频道,每个频道传递不同的消息,生产者负责往不同频道写消息,消费者负责从多个不同频道读消息,这里的多个频道就是多个list。

下篇文章:

http://www.dtcms.com/a/273880.html

相关文章:

  • Vue3的组件通信方式
  • (1-7-2)Mysql 数据表的相关操作
  • ollama大模型spring单机集成
  • 输入输出练习
  • C++入门基础篇(二)
  • 【C语言网络编程】HTTP 客户端请求(域名解析过程)
  • P9755 [CSP-S 2023] 种树
  • 浮点测试初探
  • Genus:设计信息结构以及导航方式(路径种类)
  • Java中的泛型继承
  • 【C语言进阶】带你由浅入深了解指针【第四期】:数组指针的应用、介绍函数指针
  • 【Spring Boot】Spring Boot 4.0 的颠覆性AI特性全景解析,结合智能编码实战案例、底层架构革新及Prompt工程手册
  • mysql的LIMIT 用法
  • 1 APP-OneNET 生成token密钥
  • Ubuntu2404修改国内镜像
  • 我的第一个开源项目|Geex:道阻且长的开源之路
  • docker的学习
  • React中Redux基础和路由介绍
  • 将手工建模模型(fbx、obj)转换为3dtiles的免费工具!
  • threejs案例开发-中国3D国旗动画
  • PostgreSQL 查询库中所有表占用磁盘大小、表大小
  • [Meetily后端框架] 多模型-Pydantic AI 代理-统一抽象 | SQLite管理
  • 共享储能电站在工业用户经济调度中的matlab仿真
  • 需求升级,创新破局!苏州金龙赋能旅游客运新生态
  • Go中使用wire进行统一依赖注入管理
  • 【JavaScript高级】构造函数、原型链与数据处理
  • 3 OneNET-调试器模拟上报数据
  • 深入理解Spring声明式事务的同步管理机制
  • C++ 面向对象 - 对象定义方法汇总
  • MySQL:分析表锁的常见问题