redis列表list类型详解

列表类型简介

列表(list)用于存储多个有序的字符串。列表是一种比较灵活的数据结构,可以充当栈和队列的角色,在实际开发上有很多应用场景

列表的特点:

  1. 列表中的元素是有序的,可以通过索引下标来获取某个元素或者某个范围内的元素列表
  2. 列表中的元素是可以重复的

命令

添加操作

rpush key value [value ...] 从右边插入元素

127.0.0.1:6379> rpush testlist a b c
(integer) 3
127.0.0.1:6379> lrange testlist 0 -1
1) "a"
2) "b"
3) "c"

lpush key value [value ...] 从左边插入元素

linsert key before|after pivot value 向某个元素前或后插入元素

从列表中找到等于pivot的元素,在其前|后插入value

127.0.0.1:6379> linsert testlist before b python
(integer) 4
127.0.0.1:6379> lrange testlist 0 -1
1) "a"
2) "python"
3) "b"
4) "c"

查找

lrange key start end 获取指定范围内的元素列表 lrange会获取列表指定索引范围所有的元素 索引下标有两个特点:

  1. 索引下标从左到右分别是0到N-1,从右到左分别是-1到-N
  2. lrange中的end选项包含了自身

获取列表第2到第4个元素:

127.0.0.1:6379> lrange testlist 1 3
1) "python"
2) "b"
3) "c"

lindex key index 获取列表指定索引下标的元素

127.0.0.1:6379> lindex testlist 1
"python"

llen key 获取列表长度 (integer) 4

删除

lpop key 从列表左侧弹出元素

127.0.0.1:6379> lpop testlist
"a"

rpop key 从列表右侧弹出元素

lrem key count value 删除指定元素 lrem从从列表中找到等于value的元素进行删除,根据count的不同分为三种情况:

  1. count>0 从左到右,删除最多count个元素
  2. count<0 从右到左,删除最多count绝对值个元素
  3. count=0 删除所有
127.0.0.1:6379> lpush testlist a a a a
(integer) 7
127.0.0.1:6379> lrange testlist 0 -1
1) "a"
2) "a"
3) "a"
4) "a"
5) "python"
6) "b"
7) "c"
127.0.0.1:6379> lrem testlist 4 a
(integer) 4
127.0.0.1:6379> lrange testlist 0 -1
1) "python"
2) "b"
3) "c"

ltrim key start end 按照索引范围修剪列表

127.0.0.1:6379> del testlist
(integer) 1
127.0.0.1:6379> lpush testlist a b c d e f g
(integer) 7
127.0.0.1:6379> ltrim testlist 1 3
OK
127.0.0.1:6379> lrange testlist 0 -1
1) "f"
2) "e"
3) "d"

修改

lset key index newValue 修改指定索引下标的元素

127.0.0.1:6379> lindex testlist 2
"d"
127.0.0.1:6379> lset testlist 2 python
OK
127.0.0.1:6379> lindex testlist 2
"python"

阻塞操作

blpop key [key ...] timeout brpop key [key ...] timeout

timeout参数:阻塞时间(秒)

blpop 和 brpop 是 lpop 和 rpop 的阻塞版本

  1. 列表为空,如果timeout=3,那么客户端要等到3秒后返回,如果timeout=0, 那么客户端一直阻塞等下去:
127.0.0.1:6379> brpop list:test 3
(nil)
(3.07s)
127.0.0.1:6379> brpop list:test 0
... 

因为列表为空,brpop会一直阻塞着等待元素的进入

此时新开一个redis-cli,新增元素入列表

127.0.0.1:6379> lpush list:test 1
(integer) 1

brpop立即返回元素:

127.0.0.1:6379> brpop list:test 0
1) "list:test"
2) "1"
(59.07s)
  1. 列表不为空,客户端立即返回结果
127.0.0.1:6379> lpush list:test 2
(integer) 1
127.0.0.1:6379> brpop list:test 1
1) "list:test"
2) "2"

注意:

  1. 如果有多个键,那么brpop会从左到右遍历键,一旦有一个键能弹出元素,客户端会立即返回
  2. 如果多个客户端对同一个键执行brpop,那么最先执行brpop命令的客户端可以获取到弹出的值

时间复杂度

列表的时间复杂度

应用场景

消息队列

redis的lpush+brpop命令组合即可实现阻塞队列,生产者客户端使用lrpush从列表左侧插入元素,多个消费者客户端使用brpop命令阻塞式的抢列表尾部的元素,多个客户端保证了消费的负载均衡和高可用性

列表的使用场景很多,以下是命令组合口诀: lpush + lpop = stack(栈) lpush + rpop = queue(队列) lpush + ltrim = capped collection(有限集合) lpush + brpop = message queue(消息队列)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏海天一树

NOIP 2018普及组复赛第1题答案详解

本题考察的知识点有两个: (1)输入带空格的字符串 常用的scanf和cin,遇到第一个空格就会停止输入。 C语言可以使用gets()输入带空格的字符串。当然使...

1935
来自专栏nnngu

015 反射中的 Class.forName() 与 ClassLoader.loadClass() 的区别

Class.forName() 与 ClassLoader.loadClass() 大家都知道是反射用来构造类的方法,但是他们的用法还是有一定区别的。 在讲区别...

2583
来自专栏从零开始的linux

用python解释mapreduce

map import sys #输入为标准输出stdin for line in sys.stdin: #删除开头和结尾的空行 line = ...

3284
来自专栏有趣的Python和你

Python数据分析之groupby语法糖对分组进行迭代语法糖一:选取一个或多个列

1194
来自专栏coding for love

JS入门难点解析5-变量对象

(注1:如果有问题欢迎留言探讨,一起学习!转载请注明出处,喜欢可以点个赞哦!) (注2:更多内容请查看我的目录。)

954
来自专栏转载gongluck的CSDN博客

Lua学习笔记

--Lua笔记-- --0.Lua开篇-- --http://www.cnblogs.com/stephen-liu74/archive/2012/06/11/...

5086
来自专栏java学习

Java每日一练(2017/7/7)

1 (单选题)有以下程序片段,下列哪个选项不能插入到行 1 。()。 1. 2.public class A{ 3.//do sth 4. } A publ...

36011
来自专栏C#

解析.NET对象的跨应用程序域访问(上篇)

   在目前的项目开发中,分布式开发已经逐渐成为主流。一个项目要是没有采用分布式架构,都不好意思跟别人说这是一个完整的项目。这句话虽然有些过激,但是随着人们对效...

2055
来自专栏mukekeheart的iOS之旅

Java基础——异常体系

在Java中,异常对象都是派生于Throwable类的一个实例,Java的异常体系如下图所示: ?    所有的异常都是由Throwable继承而来,在下一层立...

2747
来自专栏Java 源码分析

Java 虚拟机运行时数据区

运行时数据区: Java 虚拟机的运行时数据区按照大的可以分为线程独立使用的数据区,和所有线程共享的数据区。 一.线程独立使用数据区 1.程序计数器 程序计数器...

3334

扫码关注云+社区