原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/article/details/50573605

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

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

  1. 【Redis笔记(二)】 Redis数据结构-string字符串
  2. 【Redis笔记(三)】 Redis数据结构 - 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> flushdb
OK
127.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> flushdb
OK
127.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> flushdb
OK
127.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 timeout
brpop key timeout  
brpoplpush source destination timeout        

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

【Redis笔记(四)】 Redis数据结构 - list链表的更多相关文章

  1. spring boot 自学笔记(四) Redis集成—Jedis

    上一篇笔记Reddis集成,操作Redis使用的是RedisTemplate,但实际中还是有一大部分人习惯使用JedisPool和Jedis来操作Redis, 下面使用Jedis集成示例. 修改Red ...

  2. Redis系列四 Redis常见配置

    redis.conf常见配置 参数说明redis.conf 配置项说明如下:1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程  daemonize no2. ...

  3. redis相关笔记(三.redis设计与实现(笔记))

    redis笔记一 redis笔记二 redis笔记三 1.数据结构 1.1.简单动态字符串: 其属性有int len:长度,int free:空闲长度,char[] bur:字符数组(内容) 获取字符 ...

  4. Redis学习笔记一:数据结构与对象

    1. String(SDS) Redis使用自定义的一种字符串结构SDS来作为字符串的表示. 127.0.0.1:6379> set name liushijie OK 在如上操作中,name( ...

  5. [redis读书笔记] 第一部分 数据结构与对象 对象类型

    - 从前面redis的基本数据结构来看,可以看出,redis都是在基本结构(string)的基础上,封装了一层统计的结构(SDS),这样让对基本结构的访问能够更快更准确,提高可控制度. - redis ...

  6. [redis读书笔记] 第一部分 数据结构与对象 简单动态字符串

    本读书笔记主要来自于<<redis设计与实现>> -- 黄键宏(huangz) redis主要设计了字符串,链表,字典,跳跃表,整数集合,压缩列表来做为基本的数据结构,实现键值 ...

  7. Redis 详解 (四) redis的底层数据结构

    目录 1.演示数据类型的实现 2.简单动态字符串 3.链表 4.字典 5.跳跃表 6.整数集合 7.压缩列表 8.总结 上一篇博客我们介绍了 redis的五大数据类型详细用法,但是在 Redis 中, ...

  8. Redis学习笔记之Redis中5种数据结构的使用场景介绍

    原来看过 redisbook 这本书,对 redis 的基本功能都已经熟悉了,从上周开始看 redis 的源码.目前目标是吃透 redis 的数据结构.我们都知道,在 redis 中一共有5种数据结构 ...

  9. 深入理解Redis 数据结构—双链表

    在 Redis 数据类型中的列表list,对数据的添加和删除常用的命令有 lpush,rpush,lpop,rpop,其中 l 表示在左侧,r 表示在右侧,可以在左右两侧做添加和删除操作,说明这是一个 ...

随机推荐

  1. git学习五:eclipse使用git下载项目

    原文:http://blog.csdn.net/u014079773/article/details/51597213 准备工作: 目的:从远程仓库github上down所需的项目 eclipse使用 ...

  2. Android开发——内存优化 图片处理

    8.  用缓存避免内存泄漏 很常见的一个例子就是图片的三级缓存结构,分别为网络缓存,本地缓存以及内存缓存.在内存缓存逻辑类中,通常会定义这样的集合类. private HashMap<Strin ...

  3. PS 如何用PS制作GIF图像

    首先我们准备好要依次播放的图片(这里使用的是CS的光标缩放,只有两张图) 然后在窗口中打开动画,则下方会出现动画的面板. 点击图层按钮可以添加一帧,我们让第一帧显示为大图片,第二帧为小图片.还可以设置 ...

  4. 【Scala类型系统】自身类型(self type)引用

    定义 特质能够要求混入它的类扩展自还有一个类型,可是当使用自身类型(self type)的声明来定义特质时(this: ClassName =>).这种特质仅仅能被混入给定类型的子类其中. 如果 ...

  5. Objective-C中单例

    单例模式,由于其简单好用容易理解.同时在出问题时也容易定位的特点,在开发中经常用到的一个设计模式. 一般在程序中,经常调用的类,如工具类.公共跳转类等,我都会采用单例模式 这个写法是苹果推荐的写法   ...

  6. (利用DOM)在新打开的页面点击关闭当前浏览器窗口

    1.在开发过程中我们前端的用户体验中有时候会要求点击一个按钮,关闭当前浏览器窗口,用HTML DOM就可做到 2.注意:本次写法要求在新窗口中关闭.target="_blank" ...

  7. ffmpeg 跟我学 视频教程

    最近一段时间找时间录制了一些Ffmpeg视频教程,还有录制完毕,会持续更新,内容会包含Ffmeg保存文件,网络流转发, 编码,解码,播放器制作,以及服务端搭建等等,适合初学者,有需要的朋友的可以关注: ...

  8. openshifit 安装 redis

    http://blog.csdn.net/lsx991947534/article/details/48860537 http://blog.csdn.net/aguangg_6655_la/arti ...

  9. Nginx学习——进程模型(master 进程)

    进程模型 Nginx分为Single和Master两种进程模型.Single模型即为单进程方式工作,具有较差的容错能力,不适合生产之用.Master模型即为一个master进程+N个worker进程的 ...

  10. kubernetes之PDB

    系列目录 上一节我们讲到了由于一些人为的或者不可避免的原因,pod可能会中断,而使用Pod Disruption Budget可以最大限度地保证在pod中断发生时集群仍然保持能够接受的状态. 一句话, ...