API的理解和使用——列表类型的命令
| 操作 | 命令 | 功能 | 时间复杂度 |
| 添加 | rpush key value [value ...] | 向右插入 | O(k),k是元素个数 |
| lpush key value [value....] | 向左插入 | O(k),k是元素个数 | |
| linsert ket before|after pivot value | 指定的元素前后插入 |
O(n),n是pivot距离列表头或尾的距离 |
|
| 查找 | lrange key start end | 根据范围查找 | O(s+n),s是start偏移量,n是start到end的范围 |
| lindex key index | 根据索引查找某个元素 | O(n),n是索引的偏移量 | |
| llen key | 获取列表长度 | O(1) | |
| 删除 | lpop key | 从左弹出一个元素 | O(1) |
| rpop key | 从右弹出一个元素 | O(1) | |
| lrem key count value | 删除指定元素 | O(n),n是列表长度 | |
| ltrim key start end | 裁剪 | O(n),n是要裁剪的元素总数 | |
| 修改 | lset key index newvalue | 根据索引修改元素的值 | O(n),n是索引的偏移量 |
| 阻塞操作 | blpop key [key ...] timeout | 从左弹出阻塞 | O(1) |
| brpop key [key...] timeout | 从右弹出阻塞 | O(1) |
列表(list)类型是用来存储多个有序的字符串,如下图所示,a、b、c、d、e五个元素从左到右组成了一个有序的列表,
列表中的每个字符串称为元素(element),一个列表最多可以存储2**32 -1个元素。
在Redis中,可以对列表两端插入(push)和弹出(pop),还可以获取指定范围内的元素、获取指定索引下标的元素等。
列表是一种比较灵活的数据结果,它可以充当栈和队列的角色。


列表类型有两个特点:
第一、列表种的元素是有序的,这就意味着可以通过索引下标获取某个元素或着某个范围内的元素列表。
例如要获取下图中的第5个元素,可以执行lindex user:1:message 4(索引从0算起)就可以得到元素e。
第二、列表中的元素是可以重复的。

这两个特点在后面介绍集合和有序集合后,会显得更加突出。
下面介绍列表的5个操作命令。
1.添加操作
(1)从右边值插入元素
命令:rpush key value [value ... ]
127.0.0.1:> rpush list: a b c #一直向右插入
(integer)
127.0.0.1:> lrange list: -) "a"
) "b"
) "c"
(2)从左边取值插入元素
命令:lpush key value [value ... ]
127.0.0.1:> lpush list: a b c #一直向左插入
(integer)
127.0.0.1:> lrange list: -
) "c"
) "b"
) "a"
如果对于上面的插入方法还不够清晰,那么可以看下下面这个例子:
127.0.0.1:> lrange list: -
) "python"
) "b"
127.0.0.1:> lpush list: a1 a2 a3
(integer)
127.0.0.1:> rpush list: c1 c2 c3
(integer)
127.0.0.1:> lrange list: -
) "a3"
) "a2"
) "a1"
) "python"
) "b"
) "c1"
) "c2"
) "c3"
(3)向某个元素前或着后插入元素
命令:linsert key before|after pivot value
linsert命令会从列表中找到等于pivot的元素,在其前(before)或者后(after)插入一个新的元素value:
127.0.0.1:> linsert list: before b python
(integer) 4 #当前长度为4
127.0.0.1:> lrange list: -
) "a"
) "python"
) "b"
) "c"
2.查找
(1)获取指定范围内的元素列表
命令:lrange key start end
lrange操作会获取列表指定索引范围所有的元素。索引下标有两个特点:
第一,索引下标从左到右分别是0到N-1,但是从右到左分别是-1到-N。
第二,lrange中的end选项包含了自身,这和许多编程语言不包含end不大相同。
127.0.0.1:> lrange list: - #第一个到最后一个,就是所有
) "a"
) "python"
) "b"
) "c"
127.0.0.1:> lrange list: #第二个和第三个
) "python"
) "b"
(2)获取列表指定索引下标的元素
命令:lindex key index
127.0.0.1:> lrange list: -
) "a"
) "python"
) "b"
) "c"
127.0.0.1:> lindex list: #获取第二个元素
"python"
(3)获取列表长度
命令:llen key
127.0.0.1:> lrange list: -
) "a"
) "python"
) "b"
) "c"
127.0.0.1:> llen list:
(integer)
3.删除
(1)从列表左侧弹出元素
命令:lpop key
127.0.0.1:> lrange list: -
) "a"
) "python"
) "b"
) "c"
127.0.0.1:> lpop list:
"a"
127.0.0.1:> lrange list: -
) "python"
) "b"
) "c"
(2)从列表右侧弹出元素
命令:rpop key
127.0.0.1:> lrange list: -
) "python"
) "b"
) "c"
127.0.0.1:> rpop list:
"c"
127.0.0.1:> lrange list: -
) "python"
) "b"
(3)删除指定元素
命令:lrem key count value
lrem命令会从列表中找到等于value的元素进行删除,根据count的不同分为三种情况:
count > 0:从左到右,删除最多count个元素,前提是要有。
count = 0:删除所有
count < 0:从右到左,删除最多count绝对值个元素
127.0.0.1:> lrange list: -
) "d"
) "c"
) "b"
) "a"
) "c"
) "b"
) "a"
) "b"
) "a"
) "python"
) "a"
) "b"
) "a"
) "b"
) "c"
) "a"
) "b"
) "c"
) "d"
127.0.0.1:> lrem list: a #从左边开始删
(integer)
127.0.0.1:> lrange list: -
) "d"
) "c"
) "b"
) "c"
) "b"
) "b"
) "python"
) "a"
) "b"
) "a"
) "b"
) "c"
) "a"
) "b"
) "c"
) "d"
127.0.0.1:> lrem list: - a #从右边开始删
(integer)
127.0.0.1:> lrange list: -
) "d"
) "c"
) "b"
) "c"
) "b"
) "b"
) "python"
) "b"
) "b"
) "c"
) "b"
) "c"
) "d"
127.0.0.1:> lrem list: c #删除所有
(integer)
127.0.0.1:> lrange list: -
) "d"
) "b"
) "b"
) "b"
) "python"
) "b"
) "b"
) "b"
) "d"
lrem会从一个方向开始,匹配count个目标元素,如果遍历了所有元素,没有找到,那就会删除已有的。
127.0.0.1:> lrange list: -
) "d"
) "b"
) "b"
) "b"
) "python"
) "b"
) "b"
) "b"
) "d"
127.0.0.1:> lrem list: d
(integer)
(4)按照索引范围修剪列表
命令:ltrim key start end
ltrim会删除范围之外的所有元素:
127.0.0.1:> lrange list: -
) "b"
) "b"
) "b"
) "python"
) "b"
) "b"
) "b"
127.0.0.1:> ltrim list: - #保留中间3个
OK
127.0.0.1:> lrange list: -
) "b"
) "python"
) "b"
4.修改
命令:lset key index newValue
127.0.0.1:> lrange list: -
) "b"
) "python"
) "b"
127.0.0.1:> lset list: - NB #将最后一个修改为NB
OK
127.0.0.1:> lrange list: -
) "b"
) "python"
) "NB"
5.阻塞操作
命令:
blpop key [key ... ] timeout
brpop key [key ...] timeout
参数说明:
key [key ...]:多个列表的键
timeout:阻塞时间(单位为秒)
(1)列表不为空:客户端会立即返回
127.0.0.1:> lrange list: -
) "b"
) "python"
) "NB"
127.0.0.1:> blpop list: timeout = #从左边取值
) "list:1"
) "b"
127.0.0.1:> brpop list: timeout = #从右边取值
) "list:1"
) "NB"
127.0.0.1:> lrange list: -
) "python" 127.0.0.1:> brpop list: timeout =
) "list:1"
) "python"
当列表不为空的时候,不论时间设置为几秒都会立即返回一个值。
(2)列表为空:如果timeout = 3,那么客户端要等到3秒后返回,如果timeout = 0,那么客户端一直阻塞等下去:
127.0.0.1:> brpop list: timeout =
(nil)
(.01s)
127.0.0.1:> brpop list: timeout =
...等待中...
如果在此期间添加了元素,客户端会立即返回:
#另一台机器
127.0.0.1:> lpush list: a b c
(integer) ——》列表 c b a
#被阻塞那台
127.0.0.1:> brpop list: timeout =
) "list:1" #从右边取值所以为a
) "a"
(.39s) #已经等了100多秒
在使用brpop时,有两点需要注意。
第一,如果多个键,那么brpop会从左至右遍历键,一旦有一个键能弹出元素,客户端会立即返回:
127.0.0.1:> brpop list: list: list: timeout =
...等待中...
此时在另一客户端list:3插入元素:
127.0.0.1:> brpop list: list: list: timeout =
) "list:3"
) "a"
(.90s)
在键元素的个数不大时,并不能体现brpop是从左到右遍历键。
第二,如果多个客户端对同一个键执行brpop,那么最先执行brpop命令的客户端先返回值
客户端1
127.0.0.1:> brpop list: timeout =
...等着... 客户端2
127.0.0.1:> brpop list: timeout =
...等着...
在另一台机器上往list:1上插入一个元素:
先请求的的会得到值,另一台等着
127.0.0.1:> brpop list: timeout =
) "list:1"
) "a1"
(.99s)
API的理解和使用——列表类型的命令的更多相关文章
- redis之(六)redis的列表类型的命令
[一]向列表两端添加元素 -->命令:LPUSH key value [value ...] -->向列表的左侧添加元素,返回值表示增加元素后列表的长度 -->命令:RPUSH ke ...
- Redis常用命令入门3:列表类型
列表类型 列表类型也是一个我们很长要用到的一个类型.比如我们发博客,要用到博客列表.如果没有列表我们就只能遍历键来获取所有文章或一部分文章了,这个语法是keys,但是这个命令需要遍历数据库中的所有键, ...
- 第二百九十九节,python操作redis缓存-SortSet有序集合类型,可以理解为有序列表
python操作redis缓存-SortSet有序集合类型,可以理解为有序列表 有序集合,在集合的基础上,为每元素排序:元素的排序需要根据另外一个值来进行比较,所以,对于有序集合,每一个元素有两个值, ...
- 从零开始学习PYTHON3讲义(八)列表类型跟冒泡排序
<从零开始PYTHON3>第八讲 前面我们见过了不少的小程序,也见过了不少不同类型的变量使用的方法.但目前我们涉及到的,还都是单个的变量和单个的立即数.以变量来说,目前我们见到的,基本都 ...
- python列表类型
列表类型简介 列表类型是一个容器,它里面可以存放任意数量.任意类型的数据. 例如下面的几个列表中,有存储数值的.字符串的.内嵌列表的.不仅如此,还可以存储其他任意类型. >>> L ...
- 玩一把redis源码(一):为redis添加自己的列表类型
2019年第一篇文档,为2019年做个良好的开端,本文档通过step by step的方式向读者展示如何为redis添加一个数据类型,阅读本文档后读者对redis源码的执行逻辑会有比较清晰的认识,并且 ...
- redis 学习(5)-- 列表类型
redis 学习(5)-- 列表类型 列表特点 有序.可以重复.左右两边插入弹出 索引相关知识 索引从左往右,从0开始逐个增大 0 1 2 3 4 5 索引从右往左,从-1开始逐个减小 -6 -5 - ...
- 2.API的理解和使用
标题 : 2.API的理解和使用 目录 : Redis 序号 : 2 zset的成员是唯一的,但分数(score)却可以重复. 有序集合的内部编码 1.ziplist(压缩列表):当有序集合的 ...
- Redis从基础命令到实战之列表类型(List)
经过上一篇基于Redis散列类型的改造后,实战练习中的商品管理已经具备了增加.修改整体.修改部分属性和分页查询功能,但仍然不支持删除商品的功能.这是因为商品总数是以一个自增数字记录的,且关联了新商品k ...
随机推荐
- JS: document.getElementBy(), setInerval()
ylbtech-JavaScript-DOM document.getElementBy(),setInerval() 1.A,document.getElementBy()返回顶部 document ...
- (转)python装饰器二
Python装饰器进阶之二 保存被装饰方法的元数据 什么是方法的元数据 举个栗子 def hello(): print('Hello, World.') print(dir(hello)) 结果如下: ...
- NVIDIA® Quadro® 四路缓冲 3D立体方案
http://www.nvidia.cn/object/quadro_pro_graphics_boards_cn.html NVIDIA® Quadro® 专业显卡让地球学家以及时装设计师等许多专业 ...
- JAVA基础针对自己薄弱环节总结01(循环之前的知识)
java中的标识符 组成:数字.字母.下划线.美元$符号组成. 规则:不能由数字开头. 类名:每一个单词的首字母大写 包名:所有小写 变量名.方法名:第一个单词首字母小写.后面首字母大写 常 ...
- useradd umask报错 root用su 切换到普通用户提示输入密码并报密码错误
添加新用户与以下文件有关联: /etc/default/useradd [root@localhost pam.d]# cat /etc/default/useradd # useradd defau ...
- 【Android实战】Gallary+ImageSwicther图片查看器
仿照如今各大新闻站点图片新闻的浏览模式,上面展示详细图片(ImageSwitch),以下是能够滑动的小图片(Gallery). 当中须要注意的是ImageSwitch须要定义一个工厂返回的组件,而且能 ...
- Android后退事件的处理
当我们想退出应用程序时,一般都会采用按物理按键(后退键)的做法,当用户在按两次后退键的时候就将应用程序退出,即销毁当前的Activity(): 重写onBackPressed()方法即可: 代码如下: ...
- jquery判断复选框是否被选中
$("#isUse").click(function(){ if($(this).is(':checked')){ $(this).attr('checked','checked' ...
- MagicZoom bug-Strict Standards: Only variables should be assigned by reference Error
问题:zencart Strict standards: Only variables should be assigned by reference in jscript_zen_magiczoo ...
- 【Atheros】如何在驱动中禁用ACK
上一篇文章讲了如何禁用载波侦听(CSMA)和退避(BACKOFF)的方法,这一篇介绍如何禁用ACK. 禁用ACK主要分为三部分: 1. 在发送端设置不等待ACK回来就继续发送: 2. 在接收端设置收到 ...