Redis数据类型之列表(list)
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)的更多相关文章
- Redis数据类型之列表List
Redis列表简介 Redis列表是简单的字符串列表,一个列表最多可以包含 232 - 1 个元素.列表按照插入顺序排序,可以从列表的头部或者尾部添加元素 上图演示了使用LPUSH向列表中插入元素,并 ...
- 【Redis学习之五】Redis数据类型:列表和散列
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 redis-2.8.18 一.列表 基于Linked Lis ...
- Redis数据类型之列表操作
redis 目录: 1.自动分配(redis) - 批量导入 2.微信自动绑定 3.django的ORM做不了的操作,怎么自定义操作数据库 extra ’ 4.报表 公司每个月销售的业绩 5.权限 = ...
- redis 数据类型之列表
1.lpush lpush(name,values) # 在name对应的list中添加元素,每个新的元素都添加到列表的最左边 # 如: # conn.lpush('oo', 11,22,33) # ...
- Redis数据类型之散列表
Redis五大数据类型以及操作 目录: 一.redis的两种链接方式 二.redis的字符串操作(string) 三.redis的列表操作(list) 四.redis的散列表操作(类似于字典里面嵌套字 ...
- 初识redis数据类型
初识redis数据类型 1.String(字符串) string是redis最基本的类型,一个key对应一个value. string类型是二进制安全的.意思是redis的string可以包含任何数据 ...
- redis数据类型及使用场景
Redis数据类型 String: Strings 数据结构是简单的key-value类型,value其实不仅是String,也可以是数字. 常用命令: set,get,decr,incr,mge ...
- Redis数据类型介绍
Redis 数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). String(字符串) st ...
- redis数据类型
Redis 数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). String(字符串) st ...
随机推荐
- rfid工作原理
RFID的工作原理是:标签进入磁场后,如果接收到阅读器发出的特殊射频信号,就能凭借感应电流所获得的能量发送出存储在芯片中的产品信息(即Passive Tag,无源标签或被动标签),或者主动发送某一频率 ...
- php判断是否https
function is_https() { if ( !empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'o ...
- php多维数组排序 3
本文实例讲述了php简单实现多维数组排序的方法.分享给大家供大家参考,具体如下: 之前在做一个功能的时候,必须要把数据放到二维数组里并且排序,然后上网找找解决思路, 这时候会用到array_multi ...
- 大家好,请问在DELPHI中#13和#10是表示什么含义的?
#13: 表示"回车"#10: 表示"换行" ASCII码 Delphi字符 C程序 含义------- ---------- ----- ------ ...
- VS NuGet离线包(缓存包)nupkg安装
最近项目需要在NuGet添加一个依赖项,无奈公司开发机没网... 说出来各位看官可能不信,做开发的开发机居然没网!!!!!(那你还不赶快离职闪人) 没办法,项目需要还是得把东西扔进VS里面去,只有想办 ...
- Graph-Based image segmentation method
1.Graph-Based 方法简介 基于图的图像分割方法将图像伪造成带权值无向图的形式 : G = (V, E) 其中,V是顶点集合,把图像中的每个像素或者每个区域看成图的一个顶点:E是边的集合,连 ...
- Impala:新一代开源大数据分析引擎--转载
原文地址:http://www.parallellabs.com/2013/08/25/impala-big-data-analytics/ 文 / 耿益锋 陈冠诚 大数据处理是云计算中非常重要的问题 ...
- 【数据库_Mysql】Mysql知识汇总
1.将多列字段合并显示用CONCAT(XX,XX,...): 2.查询表中某字段重复的数据: 查重复字段:select 字段 from table group by 字段 having count(* ...
- 【刷题】BZOJ 5248 [2018多省省队联测]一双木棋
Description 菲菲和牛牛在一块n行m列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手.棋局开始时,棋盘上没有任何棋子, 两人轮流在格子上落子,直到填满棋盘时结束.落子的规则是:一个格子可以落子 ...
- 【刷题】洛谷 P3676 小清新数据结构题
题目背景 本题时限2s,内存限制256M 题目描述 在很久很久以前,有一棵n个点的树,每个点有一个点权. 现在有q次操作,每次操作是修改一个点的点权或指定一个点,询问以这个点为根时每棵子树点权和的平方 ...