当前位置: 首页 > article >正文

【redis】数据类型之list

Redis的List数据类型是一个双向链表,支持在链表的头部(left)和尾部(right)进行元素的插入(push)和弹出(pop)操作。这使得List既可以用作栈(stack),也可以用作队列(queue)。

有关list类型的命令可以通过help @list命令来查看。有关命令的使用可以通过help 命令来查看,例如help lpush

简单使用

LPUSH

lpush:在列表的左边插入元素。

语法:

LPUSH key element [element ...]

使用:

127.0.0.1:6379> lpush k1 a b c d
(integer) 4

LRANGE

lrange:查看列表中的元素。

语法:

LRANGE key start stop

使用:

127.0.0.1:6379> lrange k1 0 -1
1) "d"
2) "c"
3) "b"
4) "a"

LPOP

lpop:从列表的左边取出一个元素。

语法:

LPOP key [count]

使用

127.0.0.1:6379> lpop k1
"d"

127.0.0.1:6379> lpop k1 3
1) "c"
2) "b"
3) "a"

RPUSH

rpush:在列表的右边插入元素。

语法:

RPUSH key element [element ...]

使用:

127.0.0.1:6379> rpush k1 a b c d
(integer) 4

RPOP

rpop:从列表的右边取出一个元素。

语法:

RPOP key [count]

使用:

127.0.0.1:6379> rpop k1
"d"

127.0.0.1:6379> rpop k1 3
1) "c"
2) "b"
3) "a"

LINDEX

lindex:查询指定索引的元素。

语法:

LINDEX key index

使用:

127.0.0.1:6379> lpush k1 a b c d
(integer) 4

127.0.0.1:6379> lindex k1 -1
"a"

LLEN

llen:获取列表的长度。

语法:

LLEN key

使用:

127.0.0.1:6379> llen k1
(integer) 4

LINSERT

linsert:在指定元素的前面或后面插入元素。

语法:

LINSERT key BEFORE|AFTER pivot element

使用:

127.0.0.1:6379> linsert k1 before b x
(integer) 5

127.0.0.1:6379> lrange k1 0 -1
1) "d"
2) "c"
3) "x"
4) "b"
5) "a"

LREM

lrem:根据指定个数的指定元素。

语法:

LREM key count element

使用:

127.0.0.1:6379> lrange k1 0 -1
1) "a"
2) "c"
3) "b"
4) "a"
5) "d"
6) "c"
7) "x"
8) "b"
9) "a"

127.0.0.1:6379> lrem k1 2 a
(integer) 2

127.0.0.1:6379> lrange k1 0 -1
1) "c"
2) "b"
3) "d"
4) "c"
5) "x"
6) "b"
7) "a"

使用的lrem的注意事项:

  • 指定的count超出列表中对应元素的个数,删除所有指定的元素。

  • count为负数,从右往左删除。

  • count为0,删除所有指定的元素。

  • count为正数,从左往右删除。

LSET

lset:设置指定索引位置的元素。

语法:

LSET key index element

使用:

127.0.0.1:6379> lset k1 3 y
OK

127.0.0.1:6379> lrange k1 0 -1
1) "c"
2) "b"
3) "d"
4) "y"
5) "x"
6) "b"
7) "a"

LTRIM

ltrim:截取保留列表中指定索引的元素。

语法:

LTRIM key start stop

使用:

127.0.0.1:6379> ltrim k1 3 6
OK

127.0.0.1:6379> lrange k1 0 -1
1) "y"
2) "x"
3) "b"
4) "a"

LPOS

lpos:在列表中匹配第一个找到的元素,可以指定范围,默认从头到尾扫描。

语法:

LPOS key element [RANK rank] [COUNT num-matches] [MAXLEN len]

使用:

127.0.0.1:6379> rpush k2 a b c 1 2 3 c c
(integer) 8

127.0.0.1:6379> lpos k2 c
(integer) 2

127.0.0.1:6379> lpos k2 c rank 2
(integer) 6

127.0.0.1:6379> lpos k2 c rank -1
(integer) 7

127.0.0.1:6379> lpos k2 c count 2
1) (integer) 2
2) (integer) 6

LMOVE

lmove:用于从一个列表弹出一个元素,并将其推入到另一个列表中。这个命令通常用于在两个列表之间转移元素,或者在处理消息队列时,从一个队列中取出任务并将其放入另一个队列中。

语法:

LMOVE source destination LEFT|RIGHT LEFT|RIGHT

使用:

127.0.0.1:6379> lmove k1 k3 LEFT RIGHT
"y"

LPUSHX

lpushx:用于将一个或多个值插入到已存在的列表的头部(左端)。与LPUSH命令不同的是,如果指定的列表不存在,LPUSHX命令不会创建新列表,而是直接返回操作失败。

语法:

LPUSHX key element [element ...]

使用:

127.0.0.1:6379> lpushx k1 xx
(integer) 5

127.0.0.1:6379> lpushx kk xx
(integer) 0

RPOPLPUSH

rpoplpush:从源列表的右端(尾部)弹出一个元素,并将该元素插入到目标列表的左端(头部)。这个命令通常用于在两个列表之间安全地传递元素,特别是在实现队列或任务调度时非常有用。

语法:

RPOPLPUSH source destination

使用:

127.0.0.1:6379> rpoplpush k1 k3
"a"

RPUSHX

rpushx:用于将一个或多个值插入到已存在的列表的尾部(右端)。与RPUSH命令不同的是,如果指定的列表不存在,RPUSHX命令不会创建新列表,而是直接返回操作失败。

语法:

RPUSHX key element [element ...]

使用:

127.0.0.1:6379> rpushx k3 a b
(integer) 4

127.0.0.1:6379> rpushx kv a b
(integer) 0

阻塞命令的使用

BLMOVE

blmove:用于将一个元素从一个列表移动到另一个列表,并在源列表为空时阻塞操作,直到有元素可用或达到超时时间。

语法:

BLMOVE source destination LEFT|RIGHT LEFT|RIGHT timeout

使用:

127.0.0.1:6379> blmove k1 k3 LEFT RIGHT 2000
"xx"

127.0.0.1:6379> blmove emptylist k3 LEFT RIGHT 2
(nil)
(2.03s)

BLPOP

blpop:从列表的左端(头部)弹出一个元素,并阻塞等待直到列表中出现元素可弹出或达到超时时间。

语法:

BLPOP key [key ...] timeout

使用:

127.0.0.1:6379> blpop k1 2
1) "k1"
2) "xx"

127.0.0.1:6379> blpop emptylist 2
(nil)
(2.02s)

BRPOP

brpop:从列表的右端(尾部)弹出一个元素,并阻塞等待直到列表中出现元素可弹出或达到超时时间。

语法:

BRPOP key [key ...] timeout

使用:

127.0.0.1:6379> brpop k1 2
1) "k1"
2) "b"

127.0.0.1:6379> brpop emptylist 2
(nil)
(2.02s)

BRPOPLPUSH

brpoplpush:BRPOPLPUSH命令的行为与RPOPLPUSH命令完全相同,即从source列表的尾部弹出一个元素,并将该元素推入到destination列表中。

当source列表为空时,Redis将阻塞连接,直到另一个客户端向source列表推送元素,或者直到指定的timeout时间达到。

语法:

BRPOPLPUSH source destination timeout

使用:

127.0.0.1:6379> brpoplpush k3 k4 2
"xx"

内部编码

列表类型的内部编码为quicklist

127.0.0.1:6379> rpush k3 a b c
(integer) 3

127.0.0.1:6379> object encoding k3
"quicklist"

使用场景

  1. 链表:lpush+rpop,rpush+lpop,反向命令的组合可以实现链表。

  2. 栈:lpush+lpop,rpush+rpop,同向命令的组合可以实现栈。

  3. 数组:rpush+lindex+lset,可以实现数组的功能。

  4. 消息队列:lpush+brpop。


http://www.kler.cn/a/534727.html

相关文章:

  • mysql 数据导出到文件
  • 机器学习-线性回归(参数估计之结构风险最小化)
  • SpringBoot+Dubbo+zookeeper 急速入门案例
  • 11. 9 构建生产级聊天对话记忆系统:从架构设计到性能优化的全链路指南
  • 【漫话机器学习系列】070.汉明损失(Hamming Loss)
  • Linux 安装 RabbitMQ
  • 深入解析色度二次采样 —— 4:4:4、4:2:2 和 4:2:0 的技术分析
  • API接口开发分享一些在实际开发中获取京东商品价格信息的方法
  • 【LeetCode】day15 142.环形链表II
  • 微服务知识——微服务拆分规范
  • 全能型免费内网穿透工具,全面支持macOS、Windows、Linux及Docker系统
  • 深入了解 MySQL:从基础到高级特性
  • 【实用技能】如何使用 DHTMLX JavaScript 组件加速初创企业发展?
  • 获取阿里云nacos注册接口状态
  • OpenHarmony的ArkTS如何进行JSON字符串的解析工作
  • 02-合并两个有序数组
  • 央行发布《贸易金融分布式账本技术要求》,参考架构包括5部分
  • Redis命令:列表模糊删除详解
  • Linux/C高级(精讲)----shell结构语句、shell数组
  • element-plus+vue3前端如何根据name进行搜索查到符合条件的数据
  • async-http-client使用示例
  • Linux网络 | 理解NATPT, 数据链路层Done
  • 如何查看 MySQL 是否处于运行状态
  • 开放式TCP/IP通信
  • Android 自定义View的详解
  • html转PDF文件最完美的方案(wkhtmltopdf)