7.Redis-list

list

    • list常用命令
      • lpush
      • lrange
      • lpushx
      • rpush
      • rpushx
      • lpop / rpop
      • lindex
      • linsert
      • llen
      • lrem
      • ltrim
      • lset
    • 阻塞版本命令
      • blpop/brpop
    • 总结
    • 内部编码
    • 应用场景
      • 使用redis作为消息队列


redis中的 list 是一个双端队列, list 相当于是数组或者顺序表。list 并非是一个简单的数组,而是更接近于 c++中 std::deque。列表类型是⽤来存储多个有序的字符串,列表中的每个字符串称为元素(element),⼀个列表最多可以存储2^32 - 1 个元素。

list常用命令

lpush

作用:将⼀个或者多个元素头插到list中。
语法:
LPUSH key element [element ...]
返回值:插⼊后 list 的⻓度。
在这里插入图片描述

lrange

作用:获取从 start 到 end 区间的所有元素,左闭右闭。
语法:
LRANGE key start stop
在这里插入图片描述

lpushx

其中x -> exists的意思。
作用:在 key 存在时,将⼀个或者多个元素从左侧放⼊(头插)到 list 中。不存在,直接返回
语法:
LPUSHX key element [element ...]
在这里插入图片描述

rpush

作用:将⼀个或者多个元素尾插到 list 中。当key不存在时会创建这个key再插入
语法:
RPUSH key element [element ...]
在这里插入图片描述

rpushx

作用:当 key 存在时,将⼀个或者多个元素尾插 到 list 中。
语法:
RPUSHX key element [element ...]
在这里插入图片描述

lpop / rpop

lpop:头删。rpop:尾删
语法:lpop/rpop key [count]
在当前的 redis 5 版本中,都是没有count参数的,从 redis 6.2版本,新增了一个count 参数,表示的是要删除几个元素~~
在这里插入图片描述

lindex

作用:根据下标找到list中对应下标的元素
语法:
LINDEX key index
在这里插入图片描述
返回值:取出的元素或者 nil
时间复杂度:O(N)

linsert

作用:在特定位置插⼊元素,其中 pivot 不是下标,是基准值
语法:
LINSERT key <BEFORE | AFTER> pivot element
在这里插入图片描述
当基准值不存在时,则插入失败
在这里插入图片描述

llen

作用:获取 list ⻓度
语法:
llen key
在这里插入图片描述

lrem

其中rem 是 remove 的缩写
语法:
lrem key count element

  • count 表示的是要删除的个数
  • element 表示要删除的值
  • count > 0:删除从头到尾相等的count个元素。
  • count<0:删除从尾到头部coutn个相等的元素。
  • count = 0:删除与元素相等的所有元素。

count > 0示例如下:
在这里插入图片描述
count < 0 示例如下:
在这里插入图片描述
count = 0 示例如下:
在这里插入图片描述

ltrim

作用:保留 start 和 stop 之间区间内的元素。(区间外面两边的元素就直接被删除了)
语法:
ltrim key start stop
在这里插入图片描述

lset

作用:根据下标修改元素
语法:
lset key index element
在这里插入图片描述
时间复杂度:O(n)

阻塞版本命令

blpop/brpop

blpop 和 brpop 是 lpop 和 rpop 的阻塞版本,和对应非阻塞版本的作用基本⼀致,除了:

  • 在列表中有元素的情况下,阻塞和非阻塞表现是⼀致的。但如果列表中没有元素,非阻塞版本会理解返回 nil,但阻塞版本会根据 timeout,阻塞⼀段时间,期间 Redis 可以执行其他命令,但要求执行该命令的客户端会表现为阻塞状态。
  • 命令中如果设置了多个键,那么会从左向右进⾏遍历 key,⼀旦有⼀个 key 对应的列表中可以弹出元素,命令立即返回。
  • 如果多个客户端同时对⼀个键执行 pop,则最先执⾏命令的客户端会得到弹出的元素。

作用:用途主要就是用来作为“消息队列”
语法:
BLPOP/BRPOP key [key ...] timeout
在redis 5当中,timeout 时间只能是整数,但在redis 6及之后timeout时间允许设定成小数,timeout单位是秒。

当列表不为空时,lpop与blpop没有区别
在这里插入图片描述
当列表为空时且后续timeout时间内没有元素插入,lpop与blpop区别如下
在这里插入图片描述

当列表为空时且后续timeout时间内有元素插入,lpop与blpop区别如下
在这里插入图片描述

  1. 针对一个非空列表操作,有元素时立即返回弹出的元素与lpop一致
    在这里插入图片描述
  2. 针对一个空列表进行操作,当在timeout时间内有新元素插入
    在这里插入图片描述
    3.针对多个 key 进行操作
    在这里插入图片描述

总结

ps:本来是想弄成表格的,但是不会 markdown 这种将某几行的某一列合并成一个单元格这种语法,然后只能以图片的方式展现了,希望有会的人再评论区教教我,thanks~
在这里插入图片描述

内部编码

在之前的版本中 list 的内部编码为以下两种

  • ziplist(压缩列表):当列表的元素个数⼩于 list-max-ziplist-entries 配置(默认 512 个),同时列表中每个元素的⻓度都⼩于 list-max-ziplist-value 配置(默认 64 字节)时,Redis 会选⽤iplist 来作为列表的内部编码实现来减少内存消耗。
  • linkedlist(链表):当列表类型⽆法满⾜ ziplist 的条件时,Redis 会使⽤ linkedlist 作为列表的内部实现

在redis 3.2之后,redis内部编码只是 quicklist 一种。

  • quicklist 相当于是 链表 和压缩列表的结合,整体还是一个链表,链表的每个节点是一个压缩列表。
    在这里插入图片描述

应用场景

使用redis作为消息队列

Redis 可以使⽤ lpush + brpop 命令组合实现经典的阻塞式⽣产者-消费者模型队列,⽣产者客户端使⽤ lpush 从列表左侧插⼊元素,多个消费者客户端使⽤ brpop 命令阻塞式地从队列中 “争抢” 队⾸元素。通过多个客户端来保证消费的负载均衡和高可用性。
在这里插入图片描述
选择列表类型时,请参考:
同侧存取(lpush + lpop 或者 rpush + rpop)为栈
异侧存取(lpush + rpop 或者 rpush + lpop)为队列

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/90180.html

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

相关文章

数据驱动的生活:探索未来七天生活指数API的应用

前言 随着科技的不断发展&#xff0c;数据已经成为我们生活中不可或缺的一部分。从社交媒体上的点赞和分享&#xff0c;到电子邮件和搜索引擎的历史记录&#xff0c;数据正在以前所未有的速度积累。而这些数据的利用不仅仅停留在社交媒体或商业领域&#xff0c;它们还可以为我…

natApp内网穿透工作原理

如图所示&#xff0c;用户启动内网穿透工具会将token传入natapp服务器与我们自己的主机建立一个类似于websocket的长链接&#xff0c;当从外网访问我们主机的接口时&#xff0c;会进行一个本地接口地址的截取&#xff0c;然后进行拼接成我们主机应用的真实地址。然后将数据返回…

利用 IDEA IDE 的轻量编辑模式快速查看和编辑工程外的文本文件

作为程序员, 我们都知道 IDE 的很好用的, 它的文本编辑器功能也非常的强大, 用起来非常便捷. 在长年累月的使用中, 我们也变得对其非常熟悉, 以致于使用起其它简单地轻量级的文本编辑器来, 比如什么记事本, Notepad, UltraEdit 等等呀, 觉得既不方便又不熟悉. 关键是很多的操作…

【Go 基础篇】Go语言结构体基本使用

在Go语言中&#xff0c;结构体是一种重要的数据类型&#xff0c;用于定义和组织一组不同类型的数据字段。结构体允许开发者创建自定义的复合数据类型&#xff0c;类似于其他编程语言中的类。本文将深入探讨Go语言中结构体的定义、初始化、嵌套、方法以及与其他语言的对比&#…

SQL Server 2019导入txt数据

1、选择导入数据 2、选择Flat file Source 选择文件&#xff0c;如果第一行不是列名&#xff0c;就不勾选。 3、下一步 可以看看数据是否是对的 4、下一步 选择SQL server Native Client 11&#xff0c;数据库选择导入进的库 输入连接数据库的名字和要导入的数据库 下一…

postgis数据库从一张表中过滤出一部分数据到新表中

你可以使用以下步骤在PostGIS数据库中过滤objectid<100的数据&#xff0c;并将其创建为新表&#xff1a;打开PostGIS数据库的终端或客户端工具&#xff08;如Psql&#xff09;。 选择你要过滤数据的表。假设表名为"original_table"&#xff0c;该表包含一个名为&q…

自动泊车的自动驾驶控制算法

1. 自动泊车系统 自动泊车系统(AutomatedParkingASSiSt,APA)利用车辆搭载的传感器感知车辆周边环境,扫描满足当前车辆停放的障碍物空间车位或线车位,并通过人机交互(HumanMachine Interface,HMI)获取驾驶员对目标车位的选择或自动确定目标车位,自动规划泊车路径,通过控制器向车…

学生管理系统VueAjax版本

学生管理系统VueAjax版本 使用Vue和Ajax对原有学生管理系统进行优化 1.准备工作 创建AjaxResult类&#xff0c;对Ajax回传的信息封装在对象中 package com.grg.Result;/*** Author Grg* Date 2023/8/30 8:51* PackageName:com.grg.Result* ClassName: AjaxResult* Descript…

快速制作餐厅签到抽奖营销活动,吸引更多顾客

在如今竞争激烈的市场中&#xff0c;吸引用户参与活动是企业获取关注和提升转化率的重要手段。而签到抽奖活动无疑是一种简单而又有效的方式。本文将教你如何利用乔拓云平台后台制作一个快速而有效的签到抽奖活动。 首先&#xff0c;登录乔拓云平台后台&#xff0c;进入【营销活…

浅谈红队资产信息收集经验

文章目录 子公司资产收集备案号|官网收集子域名|ip收集fofa灯塔ARLX情报社区 资产确认目录扫描Google Hacking绕过CDNnmap端口扫描参数技巧其他常用工具 子公司资产收集 红蓝对抗中往往只会给你目标企业的名称&#xff0c;以及对应的靶标系统地址&#xff0c;而很少有直接从靶标…

Docker常见配置实验

1、使用mysql:5.6和 owncloud 镜像&#xff0c;构建一个个人网盘。 1、拉取mysql5.6与owncloud的镜像 docker pull mysql:5.6 docker pull mysql:5.6 2、生成容器实例&#xff0c;构建个人网盘 docker run -d --name mydb1 --env MYSQL_ROOT_PASSWORD123456 mysql:5.6 docker …

理论转换实践之keepalived+nginx实现HA

背景&#xff1a; keepalivednginx实现ha是网站和应用服务器常用的方法&#xff0c;之前项目中单独用nginx实现过负载均衡和服务转发&#xff0c;keepalived一直停留在理论节点&#xff0c;加之最近工作编写的一个技术文档用到keepalived&#xff0c;于是便有了下文。 服务组件…