Redis——list类型详解

news/2024/12/5 8:51:14/

概要

Redis中的list类型相当于双端队列,支持头插,头删,尾插,尾删,并且列表中的内容是可以重复的。

如果搭配使用rpush和lpop,那么就相当于队列
如果搭配使用rpush和rpop,那么就相当于栈
在这里插入图片描述

lpush

向列表中头插一个或多个元素,返回list的长度。如果key已经存在,并且对应的value不是list类型,则报错

当插入多个元素时,是一次头插,例如插入1,2,3,4,那么列表中是4,3,2,1
在这里插入图片描述
演示:
在这里插入图片描述

lrange

查看list指定区间内的元素,前闭后闭,支持负数(-1就相当于倒数第一个元素),下标从0开始,因此查看全部元素就是0,-1
在这里插入图片描述演示:
在这里插入图片描述
展示的元素前面的序号并不是下标,而是结果集专用的序号

需要注意的是,如果我们给的下标超出了list的范围,如果是其他语言,可能就会报错或者抛出异常。但是在Redis中会尽可能的获取对应的内容,这体现了Redis的鲁棒性
在这里插入图片描述

lpushx

从左侧插入,当key不存在,用法和lpush一致,当key存在,则插入失败,返回0
在这里插入图片描述
演示:
在这里插入图片描述

Rpush

向列表中尾插一个或多个元素,返回list的长度。如果key已经存在,并且对应的value不是list类型,则报错
在这里插入图片描述
演示:
在这里插入图片描述

rpushx

从右侧插入,当key不存在,用法和lpush一致,当key存在,则插入失败,返回0
在这里插入图片描述
演示:
在这里插入图片描述

lpop

头删list中的元素,返回取出的元素的值。当列表为空则返回nil
在这里插入图片描述
演示:
在这里插入图片描述

rpop

尾删list中的元素,返回取出的元素的值。当列表为空则返回nil
在这里插入图片描述
演示:
在这里插入图片描述

lindex

获取到指定位置的元素,时间复杂度为O(N),如果下标非法则返回nil
在这里插入图片描述

演示:
在这里插入图片描述

linsert

在list的指定处插入元素,如果是before就插入在基准值前面,如果是after就插入到基准值后面,基准值是在list中存在的值而非下标,时间复杂度是O(N)

在这里插入图片描述
演示:
在这里插入图片描述
如果存在多个相同的基准值,那么只插入到第一个基准值处

llen

获取列表的长度,如果key不存在则返回0

在这里插入图片描述

lrem

删除指定的值,count为要删除的个数

count的值作用
count > 0从头到尾,删除count个指定的元素
count < 0删除所有指定的元素
count = 0从尾到头,删除count个指定的元素

在这里插入图片描述
演示:
在这里插入图片描述

ltrim

保留列表中start和stop之间的元素,删除两边的元素

在这里插入图片描述
演示:
在这里插入图片描述

lset

根据指定的下标,修改元素,如果下标越界,则报错
在这里插入图片描述
演示:
在这里插入图片描述

blpop/brpop

类似于阻塞队列,如果队列为空,尝试出队列,阻塞队列根据阻塞时间产生阻塞,期间Redis可以执行其他命令,直到队列不空,返回元素(如果超时了就返回nil)

命令中可以设置多个key,从左到右遍历key,哪个key的list中不空,则返回元素
在这里插入图片描述
演示:
队列不为空:
在这里插入图片描述
队列为空时:
先设置过期时间是100s
在这里插入图片描述
这边的客户端就阻塞了,启动另一个服务器,往队列里插入元素
在这里插入图片描述
这个服务器插入完元素,上一个服务器就返回元素了
在这里插入图片描述

内部编码

编码方式细节
ziplist 压缩列表列表元素个数小于512个同时每个元素的长度小于64字节
linkedlist 俩表不满足上述条件

上述编码方式是老版本的Redis使用的,新版本的Redis使用了quicklist,相当于链表和压缩列表的结合,整体是一个链表,每个链表的节点是一个压缩链表
在这里插入图片描述

应用场景

作为数组存储多个元素

例如sql中有下面这两张表
在这里插入图片描述
那么在Redis中可以通过以下关联关系进行组织数据
在这里插入图片描述

作为消息队列

在这里插入图片描述
这三个消费者谁先执行brpop命令,谁就可以先拿到新来的元素


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

相关文章

低代码平台全套源码,支持二次开发

低代码开发平台&#xff1a;只需要编写简单的配置文件即可构建企业级应用程序。 一、低代码PaaS平台可以在云端开发、部署、运行低代码应用程序。使用独立数据库模型&#xff0c;基于Kubernetes云原生技术&#xff0c;每个租户均可拥有一套独立的存储、数据库、代码和命名空间&…

ardupilot开发 --- log篇

懂的都懂&#xff0c;你也要懂 log作用记录您的飞行数据&#xff1b; 两种方式或类型&#xff1a; Data flash log &#xff0c;通常记录在SD卡上&#xff0c;可通过地面站下载&#xff1b; Telemetry logs&#xff08;Tlogs&#xff09;&#xff0c;地面站通过无线设备进行实…

算法修炼Day52|● 300.最长递增子序列 ● 674. 最长连续递增序列 ● 718. 最长重复子数组

LeetCode:300.最长递增子序列 300. 最长递增子序列 - 力扣&#xff08;LeetCode&#xff09; 1.思路 dp[i]的状态表示以nums[i]为结尾的最长递增子序列的个数。 dp[i]有很多个&#xff0c;选择其中最大的dp[i]Math.max(dp[j]1,dp[i]) 2.代码实现 1class Solution {2 pub…

2020年3月全国计算机等级考试真题(C语言二级)

2020年3月全国计算机等级考试真题&#xff08;C语言二级&#xff09; 第1题 有以下程序 void fun1 (char*p) { char*q; qp; while(*q!\0) { (*Q); q&#xff1b; } } main() { char a[]{"Program"},*p; p&a[3]; fun1(p); print…

【分类讨论】CF1674 E

Problem - E - Codeforces 题意&#xff1a; 思路&#xff1a; 样例&#xff1a; 这种分类讨论的题&#xff0c;主要是去看答案的最终来源是哪几种情况&#xff0c;这几种情况得不重不漏 Code&#xff1a; #include <bits/stdc.h>#define int long longusing i64 lon…

全国三网优惠话费充值接口开发指南

一、文档综述 近期想做项目的看过来~三网&#xff08;全国移动、联通、电信&#xff09;话费、电费充值接口能够实现将接口接入到小程序或者app上面&#xff0c;通过接口提交号码和金额进行充值&#xff0c;可以帮助相关人员快速完成接口对接与联调&#xff0c;平台用户可以通…

[国产MCU]-BL602开发实例-OLED-SSD1306驱动与U8g2移植

OLED-SSD1306驱动与U8g2移植 文章目录 OLED-SSD1306驱动与U8g2移植1、OLED介绍2、SSD1306介绍2、U8g2介绍3、U8g2移植3.1 定义U8g2图形库的移植函数3.2 移植函数实现3.3 移植函数调用4、驱动测试本文将详细介绍如何在BL602中移植U8g2图形库,并通过U8g2库驱动OLED SSD1306显示屏…

Vue使用jspdf和html2canvas组件库结合导出PDF文件

效果图&#xff1a; 1、安装依赖&#xff1a; npm install html2canvas --save npm install jspdf --save 或 yarn add html2canvas --save yarn add jspdf --save 2、封装全局调用方法&#xff1a;this.$exportPDF(#id,文件名) 新建js文件&#xff1a;/utils/html2Pdf.js&am…