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

Redis中的List数据类型

这里的list相当于数组或者顺序表,但是并非是一个简单的数组,而是更像双端队列

List的指令:

1.LPUSH key element  [element ......]

这是头插,一次可以插入一个元素,也可以同时插入多个元素。

时间复杂度是O(1),返回值是list的长度。但是操作的key已经存在,而且value不是list,那么下面操作就会报错。

第二个命令,就是查看list指定范围的,LRANGE

2.LRANGE key start stop

这里的start和stop是闭区间。同时下标也支持负数。

-1代表倒数第一个,以此类推。

3.LPUSHX key element [element.....]

x代表EXISTS,存在的意思。如果key不存在,则不能成功头插成功,返回0。

返回结果还是key对应list的长度。

4.RPUSH key element [element .....]

在尾部插入元素。

5.RPUSHX key element [element ....]

上面解释过了x的意思,x代表EXISTS,存在的意思。如果key不存在,则不能成功尾插成功,返回0。

6.LPOP key 头删 RPOP key尾删

返回的是删除的元素。

不存在就返回nil

注意:
如果搭配rpush和lpop,就可以把list当成队列使用。

如果搭配rpush和rpop,就相当于把list当成栈使用。

7.lindex key index

获取index下标的元素

如果不存在该下标,则返回nil

8.LINSERT key BEFORE/AFTER index element

   这里的index并不是下标,而是list其中的元素。

    element是指要插入的元素。

before/after代表要插在index之前还是之后。

返回值是list的长度。

如果使用了不存在的元素就会返回nil

9.LLEN key

查看list中的元素的个数,如果不存在该key,则返回0

10.LREM key count element

rem代表remove删除的意思。element代表删除的元素。

这里的count有不同的情况。

当count>0,则代表从左往右删除对应个数的element

当count<0,则代表从右往左删除对应个数的element

当count=0,则代表删除所有的的element

                      

11.LTRIM key start stop

保留start和stop区间内的元素,其他的元素全部删除。

即使越界了也可以删除成功。

12.LSET key index element

index是下标,这个指令是根据下标修改元素。

如果使用了不存在的下标,就会直接报错

List阻塞版指令:

BLPOP key [key ...] timeout   从左侧弹出第一个元素

BRPOP key [key ...] timeout   从右侧弹出最后一个元素

B代表是block(阻塞),使用blpop和brpop可以显式的设置阻塞时间(不一定是无休止的阻塞)

阻塞时只支持“队列为空”的情况,不考虑‘“队列满的情况”,因为满这个不好定义。

针对空列表进行处理

如果处理非空的列表

针对多个key进行操作

此时blpop阻塞中

List内部编码格式:

ziplist压缩列表 把数据按照更加紧凑的压缩形式进行表示,节省空间

linkedlist链表

上面的编码格式是之前的Redis使用的,现在的Redis使用的是quicklist,相当于链表和压缩列表的结合。

整体还是一个链表,但是每个节点是一个压缩列表。

这是关于Redis里面的具体配置数据。

也可以通过object encoding key进行查看具体的内部编码格式。

List的应用场景:

1.把List作为数组这样的结构,用来储存多个元素。

可以用来表示学生和班级的关系,Redis提供的查询能力不像MySQL这么强大。

2.使用Redis作为消息队列(生产者消费者模型)

 

谁先执行的这个brpop命令,谁就能先拿到新来的元素。

这样就构成了一个“轮询”的效果。

比如消费者执行顺序是 1 2 3 ,此时当新元素到达后,就会按照执行brpop的命令的先后来决定谁获取到的。

消费者1先拿到元素后,就从brpop中返回了,这个命令就执行完了,如果消费者1还想继续消费,就要重新执行brpop,然后就要“排队”到消费者3后面。

如果还有消费者4要消费,就更要“排队”了。这就是轮询的效果

3.微博TimeLine

1.有序性与插入效率:微博TimeLine需要按发布时间进行排序,List从lpush或者Rpush命令,能在O(1)的时间插入到头部或者尾部,保证时间不混乱。

2.高效的范围查询:用户查看TimeLine时,通常是加载最新的N条记录,或者翻看历史动态。List的LRANGE key start stop指令可以在O(k)的时间内查询到k条记录。无需全量遍历,反应速率快

3.天然的去重和顺序维护:每条微博的插入都按照时间顺序进行插入,无需额外维护排序逻辑。且插入时已经按照时间排序了,不需要后续再进行排序。简化了TimeLine实现逻辑。

http://www.xdnf.cn/news/1473409.html

相关文章:

  • 002 -Dephi -Helloworld
  • 浅谈前端框架
  • Redis-主从复制-哨兵模式
  • 【音视频】H264编码参数优化和cbr、vbr、crf模式设置
  • 在Ubuntu 22.04系统中无需重启设置静态IP地址
  • C++协程理解
  • PCL的C++底层原理
  • 【洛谷】队列相关经典算法题详解:模板队列、机器翻译、海港
  • 【UE】 实现指向性菲涅尔 常用于圆柱体的特殊菲涅尔
  • 分享一种常被忽略的芯片死锁
  • 【Linux基础】Linux系统管理:MBR分区实践详细操作指南
  • IO进程线程;多线程;线程互斥同步;互斥锁;无名信号量;条件变量;0905
  • FEMDRW032G-88A19江波龙,工业级宽温EMMC存储FEMDRW032G采用eMMC5.1协议,具备32GB存储容量提供方案
  • 可搜索且多选的下拉式列表
  • Linux查看设备树信息
  • C++Primerplus 编程练习 第十二章
  • CUDA编程12 - 使用OpenMP控制多个GPU示例
  • 1个工具管好15+网盘(批量转存/分享实测)工具实测:批量转存 + 自动换号 + 资源监控 账号添加失败 / 转存中断?这样解决(含功能详解)
  • 【leetcode】46. 全排列
  • 【C++】vectore
  • 裸机程序(3)
  • 【C++】 priority_queue 容器模拟实现解析
  • GDAL 开发起步
  • MySQL抛出的Public Key Retrieval is not allowed
  • nextcyber——暴力破解
  • c++ 压缩与解压缩
  • C++语言编程规范-初始化和类型转换
  • 技术面:Java并发(线程池、ForkJoinPool)
  • Acrobat-2025.001.20643_Win中文_PDF编辑器_便携版安装教程
  • Go初级之十:错误处理与程序健壮性