Redis:list类型

news/2024/10/10 20:05:04/

Redis:list类型

    • list命令
      • 非阻塞
        • LPUSH
        • LRANGE
        • LPUSHX
        • RPUSH
        • RPUSHX
        • LPOP
        • RPOP
        • LINDEX
        • LINSERT
        • LLEN
        • LREM
        • LTRIM
        • LSET
      • 阻塞
        • BLPOP
        • BRPOP
    • 内部编码
      • ziplist
      • linkedlist
      • quicklist


几乎每种语言都有顺序表数组链表这样的顺序结构,Redis也做出了相应的支持。

在这里插入图片描述

如图,Redisvalue值可以是一个列表list,其支持头尾的插入删除,下标访问等功能。也支持正负数下标,正数下标从0开始,负数下标从-1开始。


list命令

非阻塞

LPUSH
  • 头插元素到list中,如果key不存在就创建
lpush key element [element ...]

返回list插入后的长度。如果一开始key不存在,就创建一个key


LRANGE
  • 获取指定范围的list元素
lrange key start stop

访问区间为[start, end]的闭区间,支持负数下标。

示例:

接下来通过lrange测试刚刚的lpush接口:

在这里插入图片描述

由于lpush是头部插入,所以按顺序插入1 2 3 4 5,最后存储顺序为5 4 3 2 1

如果在Redis中数组越界,Redis不会报错,而是尽可能输出范围内存在的数据。

在这里插入图片描述

第一次查询0 - 100,但是list中只有0 - 4,那么此时把0 - 4全部输出。第二次查询50 -60list内没用这部分数据,但是它不报错,而是输出empty表示空。


LPUSHX
  • key存在,头插元素到list
lpushx key element [element ...]

返回插入后,list中元素的个数。

示例:

在这里插入图片描述

第一次插入list1,由于已经存在,此时插入成功,返回9表示当前有九个元素。第二次插入了一个不存在的list2,但是它不存在,返回0表示插入后一个元素也没有,也就是插入失败。


RPUSH
  • 尾插元素到list中,如果key不存在就创建
rpush key element [element ...]

返回插入后list元素个数。

示例:

在这里插入图片描述

同样插入1 2 3 4 5,顺序与之前lpush插入刚好是反着的,因为rpush是尾插。

此处list有一个命名上的注意点:

  • lpushleft push,从左侧插入,即头插
  • rpushright push,从右侧插入,即尾插
  • lrangelist range,输出列表指定范围

同样是l开头,有时候表示list,有时候表示left,这个要注意。

另外的:

  • lpushxleft push exists,存在时插入

此处的x是选用了exsis中的一个字母,表示只有key存在才插入。


RPUSHX
  • key存在,尾插元素到list
rpushx key element [element ...]

返回插入后,list中元素的个数。


LPOP
  • 头删list元素
lpop key [count]

返回被删除的头部count个元素,如果list为空,没有可以删的元素了,返回nil

示例:

在这里插入图片描述

先创建一个1 2 3 4 5的列表,第一次lpop不带任何参数,只输出一个头部元素。第二次带参数4,此时输出剩余的四个元素。最后一次lpop,由于已经没有元素了,返回nil


RPOP
  • 尾删list元素
rpop key [count]

返回被删除的尾部count个元素,如果list为空,没有可以删的元素了,返回nil


LINDEX
  • 获取指定下标的元素
lindex key index

返回指定下标的元素,支持负数下标。

示例:

在这里插入图片描述


LINSERT
  • 在指定位置插入元素
linsert key before|after pivot element

在元素pivot的前面或者后面插入element元素。

示例:

在这里插入图片描述

此处指令的作用是,在元素c前面插入hello

如果有多个pivot元素,那么只在第一个元素的位置插入。


LLEN
  • 获取list的长度
llen key

返回list长度,如果不存在则返回0


LREM
  • 删除元素
lrem key count element

删除countelement元素。

此处count的取值有三种:

  • count > 0:从左往右删除
  • count < 0:从右往左删除
  • count = 0:删除所有元素

示例:

在这里插入图片描述

此处插入了1 2 3 hello循环四次,删除3 hello,即从左往右删除三个hello每次出只有最后一个hello被保留。

在这里插入图片描述

如果传入-3 hello,此时从右往左删除,只有第一个hello被保留。


LTRIM
  • 指定范围内元素保留,剩余的元素删除
ltrim key start stop

只保留[start, stop]闭区间内部的元素,其余的元素全部删除。

示例:

在这里插入图片描述


LSET
  • 修改指定下标的元素
lset key index element

将下标为index的元素改为element,支持负数下标。如果下标越界,会返回一个报错。

示例:

在这里插入图片描述

第一次修改,将下标为3的元素修改为666。第二次插入,操作下标为100的元素,由于不存在,报错了。


阻塞

先前的所有的命令,都是非阻塞的,直接操作就可以得到结果,而list还提供了一些阻塞性质的命令。

在多线程中,有一个生产消费模型,其可以基于阻塞队列实现,主要满足以下两个性质:

  1. 如果阻塞队列满了,那么生产者阻塞
  2. 如果阻塞队列空了,那么消费者阻塞

Redis中,list只考虑队列为空的情况,也就是消费者。用户读取数据时,队列为空,那么用户陷入阻塞,直到队列有数据

BLPOP
  • 读取并删除list头部元素,如果没有元素则陷入阻塞
blpop key [key ...] timeout

blpop可以同时指定多个key,也就是多个list,只要任何一个list有数据,就返回结果。还可以设置超时时间timeout,以秒为单位,如果超过时间了,返回nil

如果超时时间设置为0,则一直阻塞,不会超时。

另外的,此处的阻塞不是Redis阻塞,而是客户端阻塞。如果阻塞,Redis将指令放到后台去等待,自己去执行其他指令。

示例:

在这里插入图片描述

此处list8有元素,而list9为空,返回了list8的元素。此时会同时返回两个内容,list8表示该数据是从哪一个列表中拿到的,3则是拿到的数据。

在这里插入图片描述

此处启用了两个客户端,左侧客户端blpop一个空列表,等待20s,随后陷入阻塞。接着右侧客户端插入一个元素到list9,随后左侧客户端立刻拿到数据并输出,并且输出了自己的阻塞市场18.15s


BRPOP
  • 读取并删除list尾部元素,如果没有元素则陷入阻塞
brpop key [key ...] timeout

总结:

操作类型命令
添加rpushlpushinsert
查找lrangelindexllen
删除lpoprpoplremltrim
修改lset
阻塞blpopbrpop

内部编码

ziplist

压缩列表是一种内存紧凑的存储方式,适合存储数量较少且元素较小的列表。具体来说,当list类型的元素个数小于 list-max-ziplist-entries (默认 512 个),并且所有值的长度都小于 list-max-ziplist-value (默认 64 字节)时,Redis 会使用 ziplist 作为列表的内部实现。

这些配置在/etc/redis/redis.conf内修改。

优点:

  1. 内存节省ziplist 使用连续的内存块来存储数据,这种紧凑的存储方式可以有效地减少内存碎片和开销。
  2. 结构简单:适合小规模数据,尤其是在内存资源有限的情况下。

缺点:

  1. 操作效率:随着数据量的增加,ziplist 的读写效率会下降。尤其是在需要频繁更新的场景中,ziplist 的线性查找特性使得操作复杂度较高。
  2. 扩展性差:不适合大规模数据存储。

linkedlist

当列表类型无法满足ziplist的条件时,会使用linkedlist链表作为list的内部实现。这就是一个基本的双向链表。

优点:

  1. 头尾的插入删除非常高效

缺点:

  1. 中间部分的插入删除时间复杂度较高

quicklist

linkedlistziplist 编码在 Redis 4.0 版本之后不再是默认的列表编码方式,因为引入了更高效的 quicklist 编码,它是基于压缩列表和双向链表的组合,旨在结合两者的优点。

对于quicklist,其外层列表依然是linkedlist双链表结构,但是每一个链表节点都是一个quicklist,对于中间部分的节点,会进行一定程度的压缩,提高效率。



http://www.ppmy.cn/news/1537097.html

相关文章

力扣(leetcode)每日一题 871 最低加油次数 | 贪心

871. 最低加油次数 题干 汽车从起点出发驶向目的地&#xff0c;该目的地位于出发位置东面 target 英里处。 沿途有加油站&#xff0c;用数组 stations 表示。其中 stations[i] [positioni, fueli] 表示第 i 个加油站位于出发位置东面 positioni 英里处&#xff0c;并且有 f…

LeetCode 2187.完成旅途的最少时间:二分查找

【LetMeFly】2187.完成旅途的最少时间&#xff1a;二分查找 力扣题目链接&#xff1a;https://leetcode.cn/problems/minimum-time-to-complete-trips/ 给你一个数组 time &#xff0c;其中 time[i] 表示第 i 辆公交车完成 一趟旅途 所需要花费的时间。 每辆公交车可以 连续…

英文论文安全的免费查重网站

关注B站可以观看更多实战教学视频&#xff1a;hallo128的个人空间 英文论文安全的免费查重网站 对于英文论文查重&#xff0c;以下是一些相对安全、且免费使用的查重网站推荐。不过请注意&#xff0c;免费工具通常只能提供基础查重功能&#xff0c;对于学术论文的全面查重&…

FiBiNET模型实现推荐算法

1. 项目简介 A031-FiBiNET模型项目是一个基于深度学习的推荐系统算法实现&#xff0c;旨在提升推荐系统的性能和精度。该项目的背景源于当今互联网平台中&#xff0c;推荐算法在电商、社交、内容分发等领域的广泛应用。推荐系统通过分析用户的历史行为和兴趣偏好&#xff0c;预…

小程序会取代APP吗?——零工市场小程序和APP的区别

小程序在某些场景下有着取代了APP的潜力&#xff0c;特别是零工市场这样的领域中&#xff0c;单其中能不能完全取代还有待分析。 1.小程序无需下载&#xff0c;想用的时候随时打开&#xff0c;在零工市场领域&#xff0c;小程序可以快速连接求职者和雇主&#xff0c;满足临时工…

前端的全栈混合之路Meteor篇:开发环境的搭建 -全局安装或使用docker镜像

Meteor 是一个全栈 JavaScript 框架&#xff0c;适用于构建实时 Web 应用程序&#xff0c;前面已经出了一系列的文章介绍。 Meteor的前后端分离 发布订阅示例代码及如何将Meteor的响应数据映射到vue3的reactive系统 RPC方法注册及调用 行在浏览器端的数据库-MiniMongo介绍及其前…

深度学习:深度学习的主流框架

深度学习主流框架 深度学习框架是用于构建、训练和部署深度学习模型的软件库和接口。这些框架大多数提供了高效的数值计算功能&#xff0c;并支持数据流图、自动微分以及高效的资源管理。选择合适的深度学习框架取决于项目的需求、预期的功能性、社区支持以及个人或团队的熟练…

LeetCode hot100---哈希表专题(C++语言)

常用的哈希数据结构 &#xff08;1&#xff09;unordered_set 只关心value&#xff0c;不关心key,set中的数据会自动升序&#xff08;2&#xff09;unordered_map 既关心value&#xff0c;又关心key,map中的数据会自动升序1、两数之和 &#xff08;1&#xff09;题目描述以…