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. 如何在windows下Apache环境开启htaccess伪静态功能

     以下文章来自于网络,只做学习用 很多国人习惯用windows服务器或者在windows系统下调试PHP程序,在调试货使用的时候就遇到开启伪静态的各种问题,今天在网络上搜集了一些开启伪静态需要注意 ...

  2. 淘宝免费ip地址查询导致服务堵死的坑

    1.业务中因为想根据用户ip来做一些友好的提示,所以在网上找了个免费的ip查询地址 http://ip.taobao.com/service/getIpInfo.php?ip= 虽然说淘宝的这个地址会 ...

  3. 理解promise 02

    1:promise是什么? 就是(链式)包装的回调函数. 2:语法 new Promise( function(resolve, reject) {...} /* executor */ ); exe ...

  4. idea tomcat debug 失效

    idea 开发神器 有时候遇到各种问题 这不 现在遇到了一个问题 启动容器时 debug断点不能进入 在网上找了老半天 终于找到答案了 原因是使用tomcat的时候 没有选择"pass en ...

  5. 51nod 1526 分配笔名(字典树+贪心)

    题意: 班里有n个同学.老师为他们选了n个笔名.现在要把这些笔名分配给每一个同学,每一个同学分配到一个笔名,每一个笔名必须分配给某个同学.现在定义笔名和真名之间的相关度是他们之间的最长公共前缀.设笔名 ...

  6. 【比赛】HNOI2018 排列

    这题原题... 这题题面七绕八绕,有点麻烦,反正最后转化就是一棵树,每个点有一个值,要把所有点选完,要求选择一个点必须是它的父亲和祖先已经全部被选了,贡献是这个点的权值乘上它被选择的排名 如果一个点是 ...

  7. [FJWC2018]全排列 DP

    题面 题面 题解 (表示第一段文字导致我在考场上没看懂题--因为我以为这个定义是定义在整个排列上的,所以相似 = 相同.结果其实是可以应用在一个区间上--) 首先我们发现,2个区间相似,其实就是离散化 ...

  8. Linux内核分析5

    周子轩 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.学习总结 通过gdb ...

  9. 【bzoj4002】有意义的字符串

    Portal --> bzoj4002 Solution ​ 虽然说这题有点强行但是感觉还是挺妙的,给你通项让你反推数列的这种==有点毒 ​​ 补档时间 ​ 首先有一个东西叫做特征方程,我们可以 ...

  10. python 之 strip()--(转载)

    原博地址:http://www.jb51.net/article/37287.htm 函数原型 声明:s为字符串,rm为要删除的字符序列 s.strip(rm)        删除s字符串中开头.结尾 ...