Redis——常用数据类型List

目录

List列表

Redis中的list相当于数组,或者 顺序表,一些常用的操作可以通过下面这张图来理解

实际上,这个并不是一个简单的数组,而是类似于一个"双端队列"

列表类型的特点:

  1. 列表中的元素是有序的,这意味着可以通过索引下标获取某个元素或者某个范围的元素列表,例如要上图的第 5 个元素,可以执行 lindex user:1:messages 4 或者倒数第 1 个元素,lindexuser:1:messages -1 就可以得到元素 e
  2. 区分获取和删除的区别,例如图 2-20 中的 lrem 1 b 是从列表中把从左数遇到的前 1 个 b 元素删除,这个操作会导致列表的长度从 5 变成 4;但是执⾏ lindex 4 只会获取元素,但列表长度是不会变化的
  3. 列表中的元素是允许重复的,如下图
常用命令
lpush
复制代码
LPUSH key element [element ...]

//将⼀个或者多个元素从左侧放⼊(头插)到 list 中
//时间复杂度:只插⼊⼀个元素为 O(1), 插⼊多个元素为 O(N), N 为插⼊元素个数
//返回值:插⼊后 list 的⻓度
lpushx
复制代码
 LPUSHX key element [element ...]
 
//在 key 存在时,将⼀个或者多个元素从左侧放⼊(头插)到 list 中。不存在,直接返回
//时间复杂度:只插⼊⼀个元素为 O(1), 插⼊多个元素为 O(N), N 为插⼊元素个数
//返回值:插⼊后 list 的⻓度
rpush
复制代码
RPUSH key element [element ...]

//将⼀个或者多个元素从右侧放⼊(尾插)到 list 中
//时间复杂度:只插⼊⼀个元素为 O(1), 插⼊多个元素为 O(N), N 为插⼊元素个数
//返回值:插⼊后 list 的⻓度
rpush
复制代码
RPUSHX key element [element ...]

//在 key 存在时,将⼀个或者多个元素从右侧放⼊(尾插)到 list 中
//时间复杂度:只插⼊⼀个元素为 O(1), 插⼊多个元素为 O(N), N 为插⼊元素个数
//返回值:插⼊后 list 的⻓度
lrange
复制代码
 LRANGE key start stop
 
//获取从 start 到 end 区间的所有元素,左闭右闭,下标支持负数
//时间复杂度:O(N)
//返回值:指定区间的元素,如果给定区间非法,比如超出下标,Redis中会尽可能的获取区间的内容
lpop
复制代码
LPOP key [count](redis 6.2版本及其以上支持这个count,一次pop多个)
 
//从 list 左侧取出元素(即头删)
//时间复杂度:O(1)
//返回值:取出的元素或者 nil
rpop
复制代码
RPOP key [count](redis 6.2版本及其以上支持这个count,一次pop多个)

//从 list 右侧取出元素(即尾删)
//时间复杂度:O(1)
//返回值:取出的元素或者 nil
lindex
复制代码
LINDEX key index

//获取从左数第 index 位置的元素
//时间复杂度:O(N)
//返回值:取出的元素或者 nil
linsert
复制代码
LINSERT key <BEFORE | AFTER> pivot element

//在特定位置插⼊元素 , before和after选一个,在privot之前插入,或者之后插入,这个pivot是元素的值,不是下标
//时间复杂度:O(N)
//返回值:插⼊后的 list ⻓度
llen
复制代码
LLEN key

//获取 list ⻓度
//时间复杂度:O(1)
//返回值:list 的⻓度
lrem
复制代码
LREM key count element

//指定一个元素精准删除

//count为要删除的个数,element为要删除的值
//count>0,从左往右删除element两次
//count<0,从右往左删除element两次
//count=0,删除所有的element
ltrim key start stop
复制代码
LTRIM key start stop

//保留start和stop之间的元素(区间外两边的元素就直接被删除了)
//时间复杂度O(n)
lset
复制代码
LSET key index element

//根据下标修改元素
//时间复杂度O(n)
阻塞版本命令

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

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

redis中的list也相当于阻塞队列一样,线程安全是通过单线程模型支持的,阻塞。则只支持队列为空的情况,不考虑队列满

blpop和brpop都是可以同时去尝试多个key的列表的元素的,多个key对应多个list,这多个list哪个有元素了,就会返哪个元素

blpop
复制代码
BLPOP key [key ...] timeout

//LPOP 的阻塞版本
//时间复杂度:O(1)
//返回值:取出的元素或者 nil
brpop
复制代码
BRPOP key [key ...] timeout

//RPOP 的阻塞版本
//时间复杂度:O(1)
//返回值:取出的元素或者 nil
list的编码方式

列表类型的内部编码有两种:

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

消息队列

**微博 Timeline

相关推荐
TDengine (老段)5 分钟前
TDengine 字符串函数 CHAR 用户手册
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
qq74223498416 分钟前
Python操作数据库之pyodbc
开发语言·数据库·python
姚远Oracle ACE40 分钟前
Oracle 如何计算 AWR 报告中的 Sessions 数量
数据库·oracle
Dxy12393102161 小时前
MySQL的SUBSTRING函数详解与应用
数据库·mysql
码力引擎1 小时前
【零基础学MySQL】第十二章:DCL详解
数据库·mysql·1024程序员节
杨云龙UP1 小时前
【MySQL迁移】MySQL数据库迁移实战(利用mysqldump从Windows 5.7迁至Linux 8.0)
linux·运维·数据库·mysql·mssql
l1t2 小时前
利用DeepSeek辅助修改luadbi-duckdb读取DuckDB decimal数据类型
c语言·数据库·单元测试·lua·duckdb
睡前要喝豆奶粉2 小时前
在.NET Core Web Api中使用redis
redis·c#·.netcore
安当加密2 小时前
Nacos配置安全治理:把数据库密码从YAML里请出去
数据库·安全
ColderYY2 小时前
Python连接MySQL数据库
数据库·python·mysql