【Redis笔记(四)】 Redis数据结构 - list链表
来源:互联网 发布:贵阳大数据产业博览会 编辑:程序博客网 时间:2024/06/06 19:03
原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/article/details/50573605
经过前面的介绍,我们学习了Redis中string字符串、hash哈希这两种数据结构的常用命令。这篇文章将介绍Redis中的list – 列表的相关操作。
如果你还不知道string和hash是什么(插播一条“小广告”),可以先看看我的前两篇文章:
- 【Redis笔记(二)】 Redis数据结构-string字符串
- 【Redis笔记(三)】 Redis数据结构 - hash哈希
list类型介绍
Redis中的list类型其实就是string类型的双向链表。学过数据结构的童鞋都知道,既然是双向链表,就很容易找到从头部或尾部插入、删除元素。这样,list就可以当做栈或队列来使用。在Redis中,list的最大长度为2^32-1。
list相关命令
1、lpush命令
lpush命令将一个或多个元素插入到列表的头部,如果指定的key不存在,则先创建一个空列表,如果指定的key不是一个list类型,则返回一个错误。具体格式为:
lpush key value...
示例1:
127.0.0.1:6379> lpush mylist a b c(integer) 3127.0.0.1:6379> set mystr not_a_listOK127.0.0.1:6379> lpush mystr d(error) WRONGTYPE Operation against a key holding the wrong kind of value127.0.0.1:6379>
2、lrange命令
上面,我们使用lpush命令往列表中添加了元素,那么我们怎么知道指定的元素已经插入列表中呢?这是,我们可以使用lrange命令来查看列表中指定范围的元素。该命令的的具体格式如下:
lrange key start stop
对于lrange命令,我们需要知道一下几点:
- lrange返回列表中下标范围在[start, stop]中的元素。
- 列表的下标偏移量是基于0的,也就是从0开始。这跟我们编程语言中的数组下标的计算方式一致。
- 偏移量可以是负数,表示该偏移量是从列表的尾部开始计数。比如-1表示列表的最后一个元素。
如果给定的下标超出列表下标的范围,Redis不会产生错误。如果start大于列表尾部下标,返回一个空列表,如果stop大于列表尾部下标,则Redis会把列表的尾部下标当做实际的stop值。
示例2:
127.0.0.1:6379> lpush mylist a b c(integer) 3127.0.0.1:6379> lrange mylist 0 -11) "c"2) "b"3) "a"
3、lpushx命令
lpushx命令也用于在列表头部插入元素。与lpush不同的是,当指定key不存在时,该命令并不会创建一个空列表,二是不进行任何操作,直接返回。具体格式如下:
lpushx key value
示例3:
127.0.0.1:6379> lpushx mylist a(integer) 0127.0.0.1:6379> lrange mylist 0 -1(empty list or set)127.0.0.1:6379> lpush mylist a(integer) 1127.0.0.1:6379> lpushx mylist b(integer) 2127.0.0.1:6379> lrange mylist 0 -11) "b"2) "a"
4、rpush命令
前面我们介绍了,list实际上是一个双向链表,我们可以使用rpush命令从列表的尾部插入一个或多个元素。该命令操作成功后返回列表的长度。具体格式如下:
rpush key value
示例4:
127.0.0.1:6379> lpush mylist a b c(integer) 3127.0.0.1:6379> rpush mylist d e f(integer) 6127.0.0.1:6379> lrange mylist 0 -11) "c"2) "b"3) "a"4) "d"5) "e"6) "f"
5、rpushx命令
rpushx命令从列表尾部插入元素。与rpush不同的是,当指定列表不存在时,该命令并不会创建一个空列表,而是直接返回。具体格式如下:
rpushx key value
示例5:
127.0.0.1:6379> flushdbOK127.0.0.1:6379> rpushx mylist a(integer) 0127.0.0.1:6379> lrange mylist 0 -1(empty list or set)127.0.0.1:6379> lpush mylist a(integer) 1127.0.0.1:6379> rpushx mylist b(integer) 2127.0.0.1:6379> lrange mylist 0 -11) "a"2) "b"
6、lpop命令
lpop命令移除并返回list的表头元素。如果列表为空,则返回nil。具体格式如下:
lpop key
示例6:
127.0.0.1:6379> lpush mylist a(integer) 1127.0.0.1:6379> lpop mylist "a"127.0.0.1:6379> lpop mylist(nil)
7、rpop命令
rpop命令移除并返回列表的尾部元素,如果列表为空,则返回nil。具体格式如下:
rpop key
示例7:
127.0.0.1:6379> lpush mylist a b(integer) 2127.0.0.1:6379> rpop mylist"a"127.0.0.1:6379> rpop mylist"b"
8、lrem命令
lrem命令从列表中移除前count次出现的值为value的元素,返回被移除的元素个数。具体格式如下:
lrem key count value
其中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) 8127.0.0.1:6379> lrem mylist 0 a(integer) 3127.0.0.1:6379> lrange mylist 0 -11) "f"2) "e"3) "c"4) "b"5) "b"127.0.0.1:6379>
9、ltrim命令
ltrim命令用于剪切指定列表,并保留下标范围为[start, stop]的元素。其中,start、stop均是从0开始计数的,也支持用负数来表示与列表尾部的偏移量。具体格式如下:
ltrim key start stop
示例9:
127.0.0.1:6379> lpush mylist a b c d e f // 插入后列表为f e d c b a (integer) 6127.0.0.1:6379> ltrim mylist 0 2OK127.0.0.1:6379> lrange mylist 0 -11) "f"2) "e"3) "d"
10、lindex命令
lindex命令返回列表中指定下标的元素,下标从0开始计数,也可以使用负数表示从列表尾部开始的偏移值。如果指定的下标超出了列表的下标范围则返回nil。具体格式如下:
lindex key index
示例10:
127.0.0.1:6379> lpush mylist a b c d e f(integer) 6127.0.0.1:6379> lindex mylist 2"d"
11、llen命令
llen命令返回列表的长度,如果指定列表不存在,Redis会将其当做空列表并返回长度0。具体格式如下:
llen key
示例11:
127.0.0.1:6379> lpush mylist 1 2 3(integer) 3127.0.0.1:6379> llen mylist(integer) 3
12、linsert命令
linsert是插入命令,它会在列表中查找指定元素,并在该元素之前或之后插入一个元素。如果指定的列表不存在,则不进行任何操作。该命令的返回值为执行插入操作后列表的长度,如果没有找到指定的值,则返回-1。具体格式如下:
linsert key after|before search value
示例12:
127.0.0.1:6379> flushdbOK127.0.0.1:6379> rpush mylist a b c d(integer) 4127.0.0.1:6379> linsert mylist before b b1(integer) 5127.0.0.1:6379> lrange mylist 0 -11) "a"2) "b1"3) "b"4) "c"5) "d"127.0.0.1:6379> linsert mylist before z no(integer) -1
13、rpoplpush命令
rpoplpush命令对两个列表进行原子操作:将列表source的尾部元素拿出来放到dest列表的头部。如果列表source不存在,则返回nil值,并不进行任何操作。具体格式如下:
rpoplpush source dest:
示例13:
127.0.0.1:6379> flushdbOK127.0.0.1:6379> rpush mylist1 a b(integer) 2127.0.0.1:6379> rpush mylist2 c d(integer) 2127.0.0.1:6379> rpoplpush mylist1 mylist2"b"127.0.0.1:6379> lrange mylist1 0 -11) "a"127.0.0.1:6379> lrange mylist2 0 -11) "b"2) "c"3) "d"
14、lset命令
lset命令用来设置指定下标元素的值。具体格式如下:
lset key index value
示例14:
127.0.0.1:6379> rpush mylist a b(integer) 2127.0.0.1:6379> lset mylist 0 cOK127.0.0.1:6379> lrange mylist 0 -11) "c"2) "b"
除此之外,list的pop操作还有阻塞版本:
blpop key timeoutbrpop key timeout brpoplpush source destination timeout
timeout为等待超时时间,如果timeout为0则一直等待下去
- 【Redis笔记(四)】 Redis数据结构 - list链表
- Redis(四)Redis的数据结构
- redis数据结构指南:list
- redis数据结构-list
- Redis数据结构-List
- 四.Redis的数据结构
- Redis数据结构详解之List(二)
- Redis数据结构详解之List(二)
- Redis-数据结构(字符串列表list)
- Redis数据结构详解之List(二)
- Redis教程(四) 列表(LIST)类型
- Redis教程(四) 列表(LIST)类型
- redis数据结构详解之Hash(四)
- redis数据结构详解之Hash(四)
- redis源码分析(四)、redis命令学习总结—链表List
- redis 数据结构笔记
- 学习笔记:Redis数据结构
- Redis的数据结构之List
- duilib 界面库 实现timer定时器
- android mvp快速开发框架介绍(dileber的简介)
- 输入一个集合,求集合内最大乘积
- C++ primer P82 练习3.6
- 云主机安装SVN操作步骤
- 【Redis笔记(四)】 Redis数据结构 - list链表
- AndroidStudio快捷键汇总
- LeetCode(21)-Merge Two Sorted Lists
- 42. Trapping Rain Water leetcode Python 2016 new season
- C++ primer P82 练习3.10
- 详解UML中的关系(泛化、实现、依赖、关联【聚合、组合】)
- CEF中JavaScript与C++交互
- Yii2-高级应用程序模板在同一域名下使用配置
- 同步屏障CyclicBarrier