博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Redis笔记(四)】 Redis数据结构 - list链表
阅读量:6151 次
发布时间:2019-06-21

本文共 4900 字,大约阅读时间需要 16 分钟。

原创作品,转载请标明:

经过前面的介绍,我们学习了Redis中string字符串、hash哈希这两种数据结构的常用命令。这篇文章将介绍Redis中的list – 列表的相关操作。

如果你还不知道string和hash是什么(插播一条“小广告”),可以先看看我的前两篇文章:


list类型介绍

Redis中的list类型其实就是string类型的双向链表。学过数据结构的童鞋都知道,既然是双向链表,就很容易找到从头部或尾部插入、删除元素。这样,list就可以当做栈或队列来使用。在Redis中,list的最大长度为2^32-1。

list相关命令

1、lpush命令

lpush命令将一个或多个元素插入到列表的头部,如果指定的key不存在,则先创建一个空列表,如果指定的key不是一个list类型,则返回一个错误。具体格式为:

lpush key value...
  • 1

示例1:

127.0.0.1:6379> lpush mylist a b c (integer) 3 127.0.0.1:6379> set mystr not_a_list OK 127.0.0.1:6379> lpush mystr d (error) WRONGTYPE Operation against a key holding the wrong kind of value 127.0.0.1:6379>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2、lrange命令

上面,我们使用lpush命令往列表中添加了元素,那么我们怎么知道指定的元素已经插入列表中呢?这是,我们可以使用lrange命令来查看列表中指定范围的元素。该命令的的具体格式如下:

lrange key start stop
  • 1

对于lrange命令,我们需要知道一下几点:

  • lrange返回列表中下标范围在[start, stop]中的元素。
  • 列表的下标偏移量是基于0的,也就是从0开始。这跟我们编程语言中的数组下标的计算方式一致。
  • 偏移量可以是负数,表示该偏移量是从列表的尾部开始计数。比如-1表示列表的最后一个元素。
  • 如果给定的下标超出列表下标的范围,Redis不会产生错误。如果start大于列表尾部下标,返回一个空列表,如果stop大于列表尾部下标,则Redis会把列表的尾部下标当做实际的stop值。

    示例2:

127.0.0.1:6379> lpush mylist a b c (integer) 3 127.0.0.1:6379> lrange mylist 0 -1 1) "c" 2) "b" 3) "a"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3、lpushx命令

lpushx命令也用于在列表头部插入元素。与lpush不同的是,当指定key不存在时,该命令并不会创建一个空列表,二是不进行任何操作,直接返回。具体格式如下:

lpushx key value
  • 1

示例3:

127.0.0.1:6379> lpushx mylist a (integer) 0 127.0.0.1:6379> lrange mylist 0 -1 (empty list or set) 127.0.0.1:6379> lpush mylist a (integer) 1 127.0.0.1:6379> lpushx mylist b (integer) 2 127.0.0.1:6379> lrange mylist 0 -1 1) "b" 2) "a"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

4、rpush命令

前面我们介绍了,list实际上是一个双向链表,我们可以使用rpush命令从列表的尾部插入一个或多个元素。该命令操作成功后返回列表的长度。具体格式如下:

rpush key value
  • 1

示例4:

127.0.0.1:6379> lpush mylist a b c (integer) 3 127.0.0.1:6379> rpush mylist d e f (integer) 6 127.0.0.1:6379> lrange mylist 0 -1 1) "c" 2) "b" 3) "a" 4) "d" 5) "e" 6) "f"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

5、rpushx命令

rpushx命令从列表尾部插入元素。与rpush不同的是,当指定列表不存在时,该命令并不会创建一个空列表,而是直接返回。具体格式如下:

rpushx key value
  • 1

示例5:

127.0.0.1:6379> flushdbOK127.0.0.1:6379> rpushx mylist a (integer) 0 127.0.0.1:6379> lrange mylist 0 -1 (empty list or set) 127.0.0.1:6379> lpush mylist a (integer) 1 127.0.0.1:6379> rpushx mylist b (integer) 2 127.0.0.1:6379> lrange mylist 0 -1 1) "a" 2) "b"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

6、lpop命令

lpop命令移除并返回list的表头元素。如果列表为空,则返回nil。具体格式如下:

lpop key
  • 1

示例6:

127.0.0.1:6379> lpush mylist a (integer) 1 127.0.0.1:6379> lpop mylist "a" 127.0.0.1:6379> lpop mylist (nil)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

7、rpop命令

rpop命令移除并返回列表的尾部元素,如果列表为空,则返回nil。具体格式如下:

rpop key
  • 1

示例7:

127.0.0.1:6379> lpush mylist a b (integer) 2 127.0.0.1:6379> rpop mylist "a" 127.0.0.1:6379> rpop mylist "b"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

8、lrem命令

lrem命令从列表中移除前count次出现的值为value的元素,返回被移除的元素个数。具体格式如下:

lrem key count value
  • 1

其中count的含义如下:

  • count = 0:移除所有值为value的元素
  • count > 0:从头部往尾部移除count个值为value的元素
  • count < 0:从尾部往头部移除|count|(绝对值)个值为count的元素

    示例8:

127.0.0.1:6379> lpush mylist a b a b c a e f (integer) 8 127.0.0.1:6379> lrem mylist 0 a (integer) 3 127.0.0.1:6379> lrange mylist 0 -1 1) "f" 2) "e" 3) "c" 4) "b" 5) "b" 127.0.0.1:6379>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

9、ltrim命令

ltrim命令用于剪切指定列表,并保留下标范围为[start, stop]的元素。其中,start、stop均是从0开始计数的,也支持用负数来表示与列表尾部的偏移量。具体格式如下:

ltrim key start stop
  • 1

示例9:

127.0.0.1:6379> lpush mylist a b c d e f // 插入后列表为f e d c b a (integer) 6 127.0.0.1:6379> ltrim mylist 0 2 OK 127.0.0.1:6379> lrange mylist 0 -1 1) "f" 2) "e" 3) "d"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

10、lindex命令

lindex命令返回列表中指定下标的元素,下标从0开始计数,也可以使用负数表示从列表尾部开始的偏移值。如果指定的下标超出了列表的下标范围则返回nil。具体格式如下:

lindex key index
  • 1

示例10:

127.0.0.1:6379> lpush mylist a b c d e f (integer) 6 127.0.0.1:6379> lindex mylist 2 "d"
  • 1
  • 2
  • 3
  • 4

11、llen命令

llen命令返回列表的长度,如果指定列表不存在,Redis会将其当做空列表并返回长度0。具体格式如下:

llen key
  • 1

示例11:

127.0.0.1:6379> lpush mylist 1 2 3 (integer) 3 127.0.0.1:6379> llen mylist (integer) 3
  • 1
  • 2
  • 3
  • 4

12、linsert命令

linsert是插入命令,它会在列表中查找指定元素,并在该元素之前或之后插入一个元素。如果指定的列表不存在,则不进行任何操作。该命令的返回值为执行插入操作后列表的长度,如果没有找到指定的值,则返回-1。具体格式如下:

linsert key after|before search value
  • 1

示例12:

127.0.0.1:6379> flushdbOK127.0.0.1:6379> rpush mylist a b c d (integer) 4 127.0.0.1:6379> linsert mylist before b b1 (integer) 5 127.0.0.1:6379> lrange mylist 0 -1 1) "a" 2) "b1" 3) "b" 4) "c" 5) "d" 127.0.0.1:6379> linsert mylist before z no (integer) -1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

13、rpoplpush命令

rpoplpush命令对两个列表进行原子操作:将列表source的尾部元素拿出来放到dest列表的头部。如果列表source不存在,则返回nil值,并不进行任何操作。具体格式如下:

rpoplpush source dest:
  • 1

示例13:

127.0.0.1:6379> flushdbOK127.0.0.1:6379> rpush mylist1 a b (integer) 2 127.0.0.1:6379> rpush mylist2 c d (integer) 2 127.0.0.1:6379> rpoplpush mylist1 mylist2 "b" 127.0.0.1:6379> lrange mylist1 0 -1 1) "a" 127.0.0.1:6379> lrange mylist2 0 -1 1) "b" 2) "c" 3) "d"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

14、lset命令

lset命令用来设置指定下标元素的值。具体格式如下:

lset key index value

1

示例14:

127.0.0.1:6379> rpush mylist a b (integer) 2 127.0.0.1:6379> lset mylist 0 c OK 127.0.0.1:6379> lrange mylist 0 -1 1) "c" 2) "b"

除此之外,list的pop操作还有阻塞版本:

blpop key timeoutbrpop key timeout  brpoplpush source destination timeout        

timeout为等待超时时间,如果timeout为0则一直等待下去

你可能感兴趣的文章
批量删除oracle中以相同类型字母开头的表
查看>>
Java基础学习总结(4)——对象转型
查看>>
BZOJ3239Discrete Logging——BSGS
查看>>
SpringMVC权限管理
查看>>
spring 整合 redis 配置
查看>>
redhat6.1下chrome的安装
查看>>
cacti分组发飞信模块开发
查看>>
浅析LUA中游戏脚本语言之魔兽世界
查看>>
飞翔的秘密
查看>>
Red Hat 安装源包出错 Package xxx.rpm is not signed
查看>>
编译安装mysql-5.6.16.tar.gz
查看>>
类与成员变量,成员方法的测试
查看>>
活在当下
查看>>
每天进步一点----- MediaPlayer
查看>>
PowerDesigner中CDM和PDM如何定义外键关系
查看>>
跨域-学习笔记
查看>>
the assignment of reading paper
查看>>
android apk 逆向中常用工具一览
查看>>
MyEclipse 报错 Errors running builder 'JavaScript Validator' on project......
查看>>
Skip List——跳表,一个高效的索引技术
查看>>