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

相关推荐
jnrjian10 分钟前
USE_CONCAT in list OR 以及 filter Nest LOOP
数据结构·list
卡兰芙的微笑10 分钟前
get_property --Cmakelist之中
前端·数据库·编辑器
Z_W_H_22 分钟前
【PostgreSQL】安装及使用(Navicat/Arcgis),连接(C#)
数据库·postgresql
andrew_121923 分钟前
腾讯 IEG 游戏前沿技术 一面复盘
java·redis·sql·面试
豆姐姐29 分钟前
金九银十,分享一波用例设计、数据库、编程笔试题!
自动化测试·数据库·测试用例·软件测试面试
计算机程序设计开发31 分钟前
计算机毕业设计公交站点线路查询网站登录注册搜索站点线路车次/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序
数据库·vue.js·spring boot·课程设计·计算机毕业设计
waterHBO1 小时前
ER 图 Entity-Relationship (ER) diagram 101 电子商城 数据库设计
数据库
青云交1 小时前
大数据新视界 --大数据大厂之Kubernetes与大数据:容器化部署的最佳实践
数据库·kubernetes·容器编排·资源管理·大数据处理·扩展性、故障恢复·存储持久化·监控、日志管理、性能提升
liangbm32 小时前
MATLAB系列07:输入/输入函数
开发语言·数据库·笔记·matlab·函数·自定义函数·matlab函数
skate2 小时前
达梦disql支持上翻历史命令-安装rlwrap
数据库