1. 什么是列表

redis的列表使用双向链表实现,往列表中放元素的时候复杂度是O(1),但是随机访问的时候速度就不行了,因为需要先遍历到指定的位置才可以取到元素。

既然列表是使用链表实现的,那么就说明它是有序的,元素按照放入的顺序排列。

列表支持从两端放元素或者取元素,这样的话就可以使用列表实现栈或者队列,如果只从队列的左边或者只从队列的右边取和放数据的话,列表就成了一个栈,如果从列表的左边取数据,右边放数据,或者从右边放数据,从左边取数据的话,列表就成了队列,列表比较常用的就是用来做队列。

2. 基本使用

放元素

放元素的时候可以从左边往里放,也可以从右边往里放,分别对应着lpush和rpush:

lpush <key> <value> [<value> …]
rpush <key> <value> [<value> …]

放置元素的时候返回值是放置之后列表中元素的个数。

放置元素的时候可以一次放多个,可以看做是支持一种批量操作。

取元素

同理,取元素的时候可以从左边取,也可以从右边取,分别对应着lpop、rpop:

lpop <key>
rpop <key>

取元素的时候返回值是取到的元素,如果列表是空的或者列表不存在的话返回值就是nil。

按下标访问和赋值

既然是列表,就可以按照下标方式访问。

lindex <key> <index>
lset <key> <index> <value>

往列表中放元素的时候需要不能超过列表当前的长度,不然就越界了。

向列表中插入元素

linsert <key> before|after pivot value

会首先从列表中查找值为pivot的元素,然后来把value放在它的before或after。

因为列表是使用双向链表实现的,所以插入元素的时候只需要修改头尾的指向就可以了,无需移动元素。

删除列表元素,只保留指定区间的元素

ltrim <key> <start> <stop>

ltrim用来删除指定列表中指定区间之外的元素,只保留指定区间的元素。

通常使用ltrim来限制列表的大小,比如做一个功能只需要取前N个的时候可以使用ltrim删除掉索引100之后的元素.

获取列表长度

llen <key>

当列表为空或者不存在的时候返回值都是0.

取列表长度的复杂度为O(1),因为redis会维护一个值表示列表的长度,当使用llen命令的时候直接返回这个值就可以了。

取子列表

lrange <key> <start> <stop>

取子列表可以看做是java中的subList(),只是redis的取子列表的时候越界也没关系的,另外比较奇葩的是redis的子列表是包含头和尾的,在编写程序的时候说一个区间的时候一般的都是只包含头不包含尾。

元素的索引从0开始,并且取子列表并不会将元素从原列表中去除,而是会生成一个新的列表返回。

结束索引可以为负,当结束索引为负的时候表示从结束位置是从列表的最右边往左数abs(stop)个,比如有这么一个列表:

表示取从左边数第二个到从右边数第二个之间的数,并且是包含头和尾的。

当只想查看列表中有哪些元素但是并不想把这些元素移除的时候,比如使用列表做了一个队列,现在想看下这个队列中都有哪些元素但是并不想对原有的东西有啥影响,可以使用lrange <list> 0 -1来取列表中的所有元素:

删除元素

lrem <key> <count> <value>

删除列表中前count个值为value的元素。

根据count值得不同,执行方式有所不同:

count>0 从左边开始,删除count个值为value的元素

count=0 删除所有值为value的元素

count<0 从右边开始,删除abs(count)个值为value的元素

lrem的返回值是被删除的元素的个数。

列表之间转移元素

 rpoplpush <source> <destination>

这个命令会先对source列表指定rpop弹出一个元素,然后对destination列表指定lpush把刚刚那个元素放进去,这是一个原子操作。

参考资料:

1. 《redis入门指南》 第二版

.

Redis数据类型之列表(list)的更多相关文章

  1. Redis数据类型之列表List

    Redis列表简介 Redis列表是简单的字符串列表,一个列表最多可以包含 232 - 1 个元素.列表按照插入顺序排序,可以从列表的头部或者尾部添加元素 上图演示了使用LPUSH向列表中插入元素,并 ...

  2. 【Redis学习之五】Redis数据类型:列表和散列

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 redis-2.8.18 一.列表 基于Linked Lis ...

  3. Redis数据类型之列表操作

    redis 目录: 1.自动分配(redis) - 批量导入 2.微信自动绑定 3.django的ORM做不了的操作,怎么自定义操作数据库 extra ’ 4.报表 公司每个月销售的业绩 5.权限 = ...

  4. redis 数据类型之列表

    1.lpush lpush(name,values) # 在name对应的list中添加元素,每个新的元素都添加到列表的最左边 # 如: # conn.lpush('oo', 11,22,33) # ...

  5. Redis数据类型之散列表

    Redis五大数据类型以及操作 目录: 一.redis的两种链接方式 二.redis的字符串操作(string) 三.redis的列表操作(list) 四.redis的散列表操作(类似于字典里面嵌套字 ...

  6. 初识redis数据类型

    初识redis数据类型 1.String(字符串) string是redis最基本的类型,一个key对应一个value. string类型是二进制安全的.意思是redis的string可以包含任何数据 ...

  7. redis数据类型及使用场景

    Redis数据类型  String: Strings 数据结构是简单的key-value类型,value其实不仅是String,也可以是数字. 常用命令:  set,get,decr,incr,mge ...

  8. Redis数据类型介绍

    Redis 数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). String(字符串) st ...

  9. redis数据类型

    Redis 数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). String(字符串) st ...

随机推荐

  1. ssh: Could not resolve hostname问题终于解决了?

    1.如果系统为64位,无法启动启动hdfs: ./sbin/start-dfs.sh.并有以下错误: sed: -e expression #1, char 6: unknown option to  ...

  2. sleep() 与 wait()的比较

    1.这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类. sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用了b的sleep方法,实际上还 ...

  3. PHP对象类型转换

    其他数据类型转换为对象类型 其他数据类型转换为对象类型,得到的结果是:内置标准类(stdclass)的一个对象! 语法形式为: $obj1  =  (object) 其他类型数据: 数组转换为对象:数 ...

  4. jmeter 安装tps插件

    1.下载  jpgc-graphs-basic-2.0.zip 2.解压并将lib 目录下的 jmeter-plugins-cmn-jmeter-0.4.jar 拷贝到 %JMeter%/lib 目录 ...

  5. java map的 keyset()方法

  6. 【bzoj5206】[Jsoi2017]原力 根号分治+STL-map

    题目描述 一个原力网络可以看成是一个可能存在重边但没有自环的无向图.每条边有一种属性和一个权值.属性可能是R.G.B三种当中的一种,代表这条边上原力的类型.权值是一个正整数,代表这条边上的原力强度.原 ...

  7. Python基础数据类型题

    Python基础数据类型 题考试时间:三个小时 满分100分(80分以上包含80分及格)1,简述变量命名规范(3分) 1.必须是字母,数字,下划线的任意组合. 2.不能是数字开头 3.不能是pytho ...

  8. 【交换机在江湖】第十三章 VLAN划分篇

    江湖各位大侠重温了VLAN的基础知识,是否想过4094个VLAN可以怎样划分,哪种方式又是好用简单的?细心的小编特地整理了一番,给各位大侠把玩把玩. VLAN划分的方式: Ø 基于接口划分VLAN:  ...

  9. 线段树之Sum

    题面: 给定一数列,规定有两种操作,一是修改某个元素,二是求区间的连续和. Input: 输入数据第一行包含两个正整数n,m(n<=100000,m<=500000),以下是m行, 每行有 ...

  10. [HNOI2006]最短母串问题 AC自动机

    题面:洛谷 题解: 如果我们对这些小串建出AC自动机,那么我们所求的大串就是要求满足遍历过所有AC自动机上的叶子节点,且经过步数最少的串.如果有多个步数相同的串,要输出字典序最小的串. 在AC自动机上 ...