Redis:list类型

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.rhkb.cn/news/440490.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

案例-博客页面简单实现

文章目录 本文内容只涉及前端1. 内容要求2. 画面展示初始化面演示视频 3. 注意事项4. 代码区js文件夹下的jquery.min.js内容登录代码列表页面创作页面 本文内容只涉及前端 1. 内容要求 登录页面实现博客列表页面实现博客创作页面实现 链接: 开源在线 Markdown 编辑器文本框可…

MATLAB智能优化算法-学习笔记(4)——灰狼优化算法求解旅行商问题【过程+代码】

灰狼优化算法(Grey Wolf Optimizer, GWO)是一种基于灰狼社会行为的元启发式算法,主要模拟灰狼群体的捕猎行为(包括围攻、追捕、搜寻猎物等过程)。多旅行商问题(Multi-Traveling Salesman Problem, mTSP)是旅行商问题(TSP)的扩展,它涉及多个旅行商(车辆)从一个起点城…

免杀对抗—javaASMMSF源码特征修改汇编调用CS内联C

前言 今天讲最后的两个语言java和汇编&#xff0c;那么基本所有语言就讲了一个遍了。java在后门免杀这一块呢其实是有点鸡肋的&#xff0c;其它语言编译成的是exe&#xff0c;而java编译成的是jar包&#xff0c;而jar包又得有java环境才能运行&#xff0c;不像exe是个电脑都行…

C++ : STL容器之string剖析

STL容器之string剖析 一、string 的迭代器&#xff08;一&#xff09;起始迭代器&#xff08;二&#xff09;末尾迭代器&#xff08;三&#xff09;反向迭代器 二、容量相关的函数&#xff08;一&#xff09;size&#xff08;二&#xff09;capacity&#xff08;三&#xff09;…

【java】数据类型与变量以及操作符

各位看官&#xff1a;如果您觉得这篇文章对您有帮助的话 欢迎您分享给更多人哦 感谢大家的点赞收藏评论&#xff0c;感谢您的支持&#xff01;&#xff01;&#xff01; 目录 一.字面变量&#xff1a; 二&#xff1a;数据类型 1.1&#xff1a;int类型&#xff1a;&#xff0…

无人机(自组穿越机,航模)-芯片选型

飞控MCU: 型号尺寸子型号参数规格备注STM325*532位ARM Cortex-M3 CPU&#xff0c;72MHz&#xff0c;256KB Flash&#xff0c;20KB RAMLQFP 48F33*332位ARM Cortex-M4 CPU&#xff0c;72MHz&#xff0c;256KB Flash&#xff0c;40KB RAMMPU6050F45*532位ARM Cortex-M4 CPU&…

github学生认证(Github Copilot)

今天想配置一下Github Copilot&#xff0c;认证学生可以免费使用一年&#xff0c;认证过程中因为各种原因折腾了好久&#xff0c;记录一下解决方法供大家参考。 p.s.本文章只针对Github学生认证部分遇到的问题及解决方法&#xff0c;不包括配置copilot的全部流程~ 1、准备工作…

如何使用ssm实现基于Java的校园二手物品交易平台的设计与实现+vue

TOC ssm789基于Java的校园二手物品交易平台的设计与实现vue 绪论 1.1 研究背景 在这个推荐个性化的时代&#xff0c;采用新技术开发一个校园二手物品交易平台来分享和展示内容是一个永恒不变的需求。本次设计的校园二手物品交易平台有管理员&#xff0c;商家&#xff0c;用…

Git大框架总结

下面首先是我对于git的一个小总结&#xff0c;主要是大框架 首先是四区&#xff0c;因为大部分你所有的工作都是在这四个区里的实现的&#xff0c;包括要提交一个东西&#xff0c;是先是在工作区修改&#xff0c;后用add添加到暂存区&#xff0c;后提交到本地仓库&#xff0c;当…

系统架构设计师论文《论企业应用系统的分层架构风格》精选试读

论文真题 软件架构风格是描述一类特定应用领域中系统组织方式的惯用模式&#xff0c;反映了领域中诸多系统所共有的结构特征和语义特征&#xff0c;并指导如何将各个模块和子系统有效组织成一个完整的系统。分层架构是一种常见的软件架构风格&#xff0c;能够有效简化设计&…

基于WxJava框架的集客微信公众号的设计与实现(项目运行说明)

项目运行说明 数据库 系统采用MySQL数据库和Redis数据库,读者可参考在码云项目(code/yok/src/main/resources)中的application.yml中自行配置MySQL数据库,在redis.properties中配置Redis。 数据库表的创建语句在yok项目中的create_dataBase.sql文件中。 项目启动 后端项目…

JAVA思维提升

利用java做一个双色球彩票系统 要求 package ZY; import java.util.Random; import java.util.Scanner; public class Test9双色球 { //目标&#xff1a;模拟双色球//规则投注号码由6个红色球号码和1个蓝色球号码组成。红色球号码从1-33中选择;蓝色球号码从1-16中选择。publi…

ElasticSearch备考 -- Alias

一、题目 1) Create the alias hamlet that maps both hamlet-1 and hamlet-2 Verify that the documents grouped by hamlet are 8 2) Configure hamlet-3 to be the write index of the hamlet alias 二、思考 可以通过指定别名&#xff0c;来指向一个或多个索引&#xff0c…

Java环境配置

下载安装JDK 选择长期稳定的版本jdk-21 安装 安装好之后查看bin目录&#xff0c;里面存放了各种工具命令&#xff0c;有比较重要的javac和java。 javac.exe 是 Java 编译器&#xff0c;用于将 Java 源代码&#xff08;.java 文件&#xff09;编译成字节码&#xff08;.class…

白嫖EarMaster Pro 7简体中文破解版下载永久激活

EarMaster Pro 7 简体中文破解版功能介绍 俗话说得好&#xff0c;想要成为音乐家&#xff0c;就必须先拥有音乐家的耳朵&#xff0c;相信很多小伙伴都已经具备了一定的音乐素养&#xff0c;或者是说想要进一步得到提升。那我们就必须练好听耳的能力&#xff0c;并且把这种能力…

[C语言]指针和数组

目录 1.数组的地址 2.通过指针访问数组 3.数组和指针的不同点 4.指针数组 1.数组的地址 数组的地址是什么&#xff1f; 看下面一组代码 #include <stdio.h> int main() { int arr[5] {5,4,3,2,1}; printf("&arr[0] %p\n", &arr[0]); printf(&qu…

使用C语言进行图形化编程:从入门到实践的全面指南

1. 引言 随着技术的进步和个人电脑性能的提升&#xff0c;图形用户界面&#xff08;Graphical User Interface, GUI&#xff09;已经成为软件开发的重要组成部分。尽管C语言本身并不直接支持GUI编程&#xff0c;但借助各种库和框架&#xff0c;C语言也能成为创建功能强大且美观…

嵌入式硬件设计

嵌入式硬件设计是指针对嵌入式系统&#xff08;一种专用的计算机系统&#xff0c;通常嵌入到其他设备中&#xff09;进行的硬件设计工作。嵌入式系统广泛应用于消费电子、工业控制、医疗设备、汽车电子、航空航天等领域。以下是嵌入式硬件设计的主要内容和步骤&#xff1a; 1.…

【unity游戏开发】彻底理解AnimatorStateInfo,获取真实动画长度

前言 前置知识&#xff1a;设置参数后&#xff0c;下一个循环才会切换对应动画&#xff0c;所以在下一个循环获取真实的动画长度 AnimatorStateInfo是结构体&#xff01;值类型&#xff0c;要不断重复获取才是最新的 主要是自动设置trigger切换的动画自动切回上一个动画&#x…

域名劫持怎么处理?如何判断dns是否被劫持

随着网络环境的日益复杂&#xff0c;网站安全问题也日益凸显。域名劫持怎么处理&#xff1f;域名劫持是网站运营中不容忽视的安全威胁&#xff0c;在遇到域名劫持的时候应该学会应急响应、加强安全防护措施以及持续的安全维护&#xff0c;我们可以有效降低其带来的风险。 域名劫…