Redis列表类型的常用命令小结
列表类型介绍
列表类型也是一个我们很长要用到的一个类型。比如我们发博客,要用到博客列表。如果没有列表我们就只能遍历键来获取所有文章或一部分文章了,这个语法是keys,但是这个命令需要遍历数据库中的所有键,处于性能方面的考虑,在生产环境是不推荐使用的。
列表类型可以存储一个有序的字符串列表,常用的操作是向列表两端添加、删除、获取元素,或者某个片段。在redis中,实际上是使用双向链表的方式实现的,所以在列表两端添加删除元素的时间复杂度是O(1),获取的元素越接近两端,速度越快。但是通过索引访问元素就会很慢,尤其是列表很长的时候。但是如果只是获得队列开头或结尾的前多少个元素,这个就和队列长度无关了。所以这里队列非常适合我们的评论功能,以及一些新鲜事等功能的开发,记录日志也很好用。
1、增加元素命令
向列表两端添加元素:
redis>lpushkeyvalue[value...] redis>rpushkeyvalue[value...]
这里也很容易明白,lpush的l是left,向列表左边添加元素,r自然就是right右边的意思了。 (lpush,rpush类似于操作队列,往左边push,往右边push)
C:\ProgramFiles\Redis>redis-cli.exe 127.0.0.1:6379>keys* (emptylistorset) 127.0.0.1:6379>lpushmylist0 (integer)1 127.0.0.1:6379>rpushmylist1 (integer)2 127.0.0.1:6379>lpushmylist-1-2 (integer)4 127.0.0.1:6379>lrangemylist0-1 1)"-2" 2)"-1" 3)"0" 4)"1"
返回值是列表的长度。这里push的值可以是多个,但是有一点要说明一下。像是上面这样左边push了两个值-1、-2,实际上现在列表的值是这样排序的,-2、-1、0、1,所以就算是同时push多个,实际上也是一个一个插入列表的,只不过这些操作都会是原子的。
2、弹出元素命令
redis>lpopkey redis>rpopkey
这里就很好理解了,分别是从左弹出,从右弹出,返回值是弹出的值。(弹出的意思就是把值移除并返回值)
127.0.0.1:6379>lrangemylist0-1 1)"-2" 2)"-1" 3)"0" 4)"1" 127.0.0.1:6379>lpopmylist "-2" 127.0.0.1:6379>rpopmylist "1" 127.0.0.1:6379>lrangemylist0-1 1)"-1" 2)"0"
综合上面四条命令,可以实现栈和队列了。
栈:lpush和lpop或者使用rpush和rpop。
队列:lpush和rpop或者使用rpush和lpop。
3、获取列表中元素的个数
redis>llenkey
当键不存在是返回0,这个如果一路学下来都可以猜到了。这里redis执行这条命令的时间复杂度是O(1),不像关系型数据库中的O(N)。
127.0.0.1:6379>llenmylist (integer)2
4、获取列表片段
redis>lrangekeystartstop
lrange命令比较常用,返回从start到stop的所有元素的列表,start和stop都是从0开始。
127.0.0.1:6379>lrangemylist0-1 1)"-1" 2)"0"
lrange还支持负值索引,这里是负值大家可以把负号加值直接理解成从从右数第多少个。
例如现在numbers的值是-2、-1、0、1,我们要是执行lrangenumbers-2-1,就会得到最后两个值。还有lrangenumbers0-1是我们常用的用来获取全部列表的命令。
这里有两点要注意一下:
(1)如果start索引比stop索引位置靠后(这里说的是位置,不是索引值的大小),则会返回空列表(emptylistorset)。
(2)如果stop大于实际的索引范围,则会返回列表最后变的元素。
5、删除列表中指定值
redis>lremkeycountvalue
lrem命令会删除列表中前count个值为value的元素,返回实际删除的元素个数。实际count大小不同,执行方式不同。
(1)count>0:从列表左边开始删除前count个值为value的元素
(2)count<0:从右边开始删除
(3)count=0:删除所有
返回值是删除值的个数。
6、获得/设置指定索引的元素值
redis>lindexkeyindex redis>lsetkeyindexvalue
这里应该很好理解了,特殊说明一下index如果是负值的话就是从右边开始计算索引,和lrange的负值是一个意思。
127.0.0.1:6379>lrangemylist0-1 1)"0" 2)"-1" 3)"-2" 4)"-3" 127.0.0.1:6379>lindexmylist0 "0" 127.0.0.1:6379>lindexmylist3 "-3" 127.0.0.1:6379>lindexmylist-1 "-3"
7、只保留列表中指定的片段
redis>ltrimkeystartend
这里也不做特殊说明了。
127.0.0.1:6379>lrangemylist0-1 1)"0" 2)"-1" 3)"-2" 4)"-3" 127.0.0.1:6379>lindexmylist0 "0" 127.0.0.1:6379>lindexmylist3 "-3" 127.0.0.1:6379>lindexmylist-1 "-3" 127.0.0.1:6379>ltrimmylist02 OK 127.0.0.1:6379>lrangemylist0-1 1)"0" 2)"-1" 3)"-2"
8、向列表中插入元素
现在我们列表中的值是0,-1,-2
redis>linsertkeybefore|afterpivotvalue
127.0.0.1:6379>linsertmylistbefore01 (integer)4//在0值前面插入1 127.0.0.1:6379>lrangemylist0-1 1)"1" 2)"0" 3)"-1" 4)"-2" 127.0.0.1:6379>linsertmylistafter11 (integer)5//在值为1的后面插入1 127.0.0.1:6379>lrangemylist0-1 1)"1" 2)"1" 3)"0" 4)"-1" 5)"-2" 127.0.0.1:6379>linsertmylistafter-1-1.5 (integer)6//在值为-1的后面插入-1.5 127.0.0.1:6379>lrangemylist0-1 1)"1" 2)"1" 3)"0" 4)"-1" 5)"-1.5" 6)"-2"
现在列表中的值为1,1,0,-1,-1.5,-2。linsert命令会先从列表中查找值为pivot的元素,然后根据是before还是after在前或是后添加元素。
9、将元素从一个列表转储到另一个列表
redis>rpoplpushsourcedestination
这个命令非常有意思,先执行rpop再执行lpush。这个命令会先从source右边弹出一个元素插入到destination列表的左边,并返回这个元素的值。整个过程同样是原子的。
总结
到这里我们列表类型的命令就都介绍完了,是不是很简单呢~希望这篇文章对大家的学习或者工作能带来一定的帮助,如果有问题大家可以留言交流。