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. Java 中 Vector、ArrayList、List 使用深入剖析

    线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中.本文试图通过简单的描述,向读者阐述各个类的作用以 ...

  2. Java Map获取key和value 以及String字符串转List方法

    一.问题描述 这里描述两个问题: 1.Java Map获取key和value的方法: 2.String字符串转List的方法: 二.解决方法 1.Java Map获取key和value的方法   2. ...

  3. 解决Qt creator无法输入中文

    详细的方法来自以下网址: http://my.oschina.net/lieefu/blog/505363?p={{currentPage+1}} 需要说明的几点: 设置qmake 的路径使用自身的路 ...

  4. 【明哥报错簿】之 mybatis异常invalid comparison: java.util.Date and java.lang.String

    背景:数据库为postgresql,表字段属性为timestamp格式 原因是mybatis 3.3.0中对于时间参数进行比较时的一个bug. 如果拿传入的时间类型参数与空字符串''进行对比判断则会引 ...

  5. C++解析(28):异常处理

    0.目录 1.C语言异常处理 2.C++中的异常处理 3.小结 1.C语言异常处理 异常的概念: 程序在运行过程中可能产生异常 异常(Exception)与 Bug 的区别 异常是程序运行时可预料的执 ...

  6. CF605E Intergalaxy Trips 贪心 概率期望

    (当时写这篇题解的时候,,,不知道为什么,,,写的非常冗杂,,,不想改了...) 题意:一张有n个点的图,其中每天第i个点到第j个点的边都有$P_{i, j}$的概率开放,每天可以选择走一步或者留在原 ...

  7. 解题:JLOI 2016 侦查守卫

    题面 经典的$cov-unc$树形dp(这词是你自己造的吧=.=) 设$cov[i][j]$表示覆盖完$i$的子树后至少向外再覆盖$j$层的最小代价,$unc[i][j]$表示$i$的子树中还剩下至少 ...

  8. Oracle10g数据泵impdp参数详解--摘自网络

    Oracle10g数据泵impdp参数详解 2011-6-30 12:29:05 导入命令Impdp •      ATTACH 连接到现有作业, 例如 ATTACH [=作业名]. •      C ...

  9. bzoj 2530 [Poi2011]Party 构造

    2530: [Poi2011]Party Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 364  Solved:  ...

  10. H5禁止手机虚拟键盘弹出

    点击输入框弹出自定义弹窗,输入框是input标:但是在移动端,input会默认触发手机的虚拟键盘,如何阻止手机虚拟键盘弹起呢?目前我试过有两个方案,一个是给input添加readonly属性,另一个就 ...