博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Redis常用命令入门3:列表类型
阅读量:6711 次
发布时间:2019-06-25

本文共 3302 字,大约阅读时间需要 11 分钟。

列表类型

列表类型也是一个我们很长要用到的一个类型。比如我们发博客,要用到博客列表。如果没有列表我们就只能遍历键来获取所有文章或一部分文章了,这个语法是keys,但是这个命令需要遍历数据库中的所有键,处于性能方面的考虑,在生产环境是不推荐使用的。

列表类型可以存储一个有序的字符串列表,常用的操作是向列表两端添加、删除、获取元素,或者某个片段。在redis中,实际上是使用双向链表的方式实现的,所以在列表两端添加删除元素的时间复杂度是O(1),获取的元素越接近两端,速度越快。但是通过索引访问元素就会很慢,尤其是列表很长的时候。但是如果只是获得队列开头或结尾的前多少个元素,这个就和队列长度无关了。所以这里队列非常适合我们的评论功能,以及一些新鲜事等功能的开发,记录日志也很好用。

1、增加元素命令

向列表两端添加元素:

这里也很容易明白,lpush的l是left,向列表左边添加元素,r自然就是right右边的意思了。  (lpush,rpush 类似于操作队列,往左边push,往右边push

返回值是列表的长度。这里push的值可以是多个,但是有一点要说明一下。像是上面这样左边push了两个值-1、-2,实际上现在列表的值是这样排序的,-2、-1、0、1,所以就算是同时push多个,实际上也是一个一个插入列表的,只不过这些操作都会是原子的。

2、弹出元素命令

综合上面四条命令,可以实现栈和队列了

栈:lpush和lpop或者使用rpush和rpop。

队列:lpush和rpop或者使用rpush和lpop。

3、获取列表中元素的个数

当键不存在是返回0,这个如果一路学下来都可以猜到了。这里redis执行这条命令的时间复杂度是O(1),不像关系型数据库中的O(N)。

127.0.0.1:6379> llen mylist(integer) 2

4、获取列表片段

lrange命令比较常用,返回从start到stop的所有元素的列表,start和stop都是从0开始。

lrange还支持负值索引,这里是负值大家可以把负号加值直接理解成从从右数第多少个

例如现在numbers的值是-2、-1、0、1,我们要是执行lrange numbers -2 -1,就会得到最后两个值。还有lrange numbers 0 -1是我们常用的用来获取全部列表的命令。

这里有两点要注意一下:

(1)如果start索引比stop索引位置靠后(这里说的是位置,不是索引值的大小),则会返回空列表(empty list or set)。

(2)如果stop大于实际的索引范围,则会返回列表最后变的元素。

5、删除列表中指定值

lrem命令会删除列表中前count个值为value的元素,返回实际删除的元素个数。实际count大小不同,执行方式不同。

(1)count > 0:从列表左边开始删除前count个值为value的元素

(2)count < 0:从右边开始删除

(3)count = 0:删除所有

返回值是删除值的个数。

6、获得/设置指定索引的元素值

这里应该很好理解了,特殊说明一下index如果是负值的话就是从右边开始计算索引,和lrange的负值是一个意思。

127.0.0.1:6379> lrange mylist 0 -11) "0"2) "-1"3) "-2"4) "-3"127.0.0.1:6379> lindex mylist 0"0"127.0.0.1:6379> lindex mylist 3"-3"127.0.0.1:6379> lindex mylist -1"-3"

 

7、只保留列表中指定的片段

这里也不做特殊说明了。

127.0.0.1:6379> lrange mylist 0 -11) "0"2) "-1"3) "-2"4) "-3"127.0.0.1:6379> lindex mylist 0"0"127.0.0.1:6379> lindex mylist 3"-3"127.0.0.1:6379> lindex mylist -1"-3"127.0.0.1:6379> ltrim mylist 0 2OK127.0.0.1:6379> lrange mylist 0 -11) "0"2) "-1"3) "-2"

 

8、向列表中插入元素

现在我们列表中的值是0,-1,-2

redis> linsert key before|after pivot value
127.0.0.1:6379> linsert mylist before 0 1(integer) 4    //在0值前面插入1127.0.0.1:6379> lrange mylist 0 -11) "1"2) "0"3) "-1"4) "-2"127.0.0.1:6379> linsert mylist after 1 1(integer) 5  //在值为1的后面插入1127.0.0.1:6379> lrange mylist 0 -11) "1"2) "1"3) "0"4) "-1"5) "-2"127.0.0.1:6379> linsert mylist after -1 -1.5(integer) 6  //在值为-1的后面插入-1.5127.0.0.1:6379> lrange mylist 0 -11) "1"2) "1"3) "0"4) "-1"5) "-1.5"6) "-2"

现在列表中的值为1,1,0,-1,-1.5,-2 。linsert命令会先从列表中查找值为pivot的元素,然后根据是before还是after在前或是后添加元素。

9、将元素从一个列表转储到另一个列表

这个命令非常有意思,先执行rpop再执行lpush。这个命令会先从source右边弹出一个元素插入到destination列表的左边,并返回这个元素的值。整个过程同样是原子的。

到这里我们列表类型的命令就都介绍完了,是不是很简单呢~

转载地址:http://uxalo.baihongyu.com/

你可能感兴趣的文章
中国人工智能学会通讯——AI如何深度应用于消费金融的风控决策 1.2 在人工智能的业务实践中,长尾数据和特征能很大提升信用评分的准确性。...
查看>>
如何对有双因子认证站点进行钓鱼攻击?
查看>>
数据到底怎么用?运营报告的6个必备要素
查看>>
长见识了!5G竟然这样“改变社会”
查看>>
威胁情报 = 数据 + 人
查看>>
西门子与新创事业合作进军区块链微电网电力交易市场
查看>>
由学习《软件设计重构》所想到的代码review(一)
查看>>
业内人的“针砭时弊”:AI医疗界的3大乱象以及如何评价医学人工智能的成果?...
查看>>
美国科技股遭抛售 独立分析师为苹果鸣不平
查看>>
南通电信推广定制化云服务
查看>>
去芜存精:如何选择最优质的CRM软件研发商?
查看>>
为精简成本 诺基亚将在芬兰本土进行裁员
查看>>
实现数据科学研究结果可复制的十条规则
查看>>
智能家居行业步入死胡同 未来何去何从?
查看>>
《HTML 5与CSS 3权威指南(第3版·下册)》——19.2 属性选择器
查看>>
意法半导体:加大中国市场投入 重点布局物联网/车联网
查看>>
一场百万级别的电子盛事是如何造就的?
查看>>
测试框架的利好和繁荣:Java单元测试框架之争
查看>>
成功的CIO是怎样炼成的?
查看>>
物联网大数据行业应用分析
查看>>