6、Redis五大数据类型---列表(List)

一、列表(List)简介

  1. 单键多值:Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
  2. 它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。
  3. 其底层有linkedList、zipList和quickList这三种存储方式。

list在redis常用作堆,栈。

二、常用命令

1、lpush/rpush lpush/rpush<key><value1> <value2><value3> 从左边/右边插入一个或多个值。
127.0.0.1:6379> lpush list a				#在list左边插入a值
(integer) 1
127.0.0.1:6379> lpush list b				#在list左边插入b值
(integer) 2
127.0.0.1:6379> lrange list 0 -1			#获取当前list所有值
1) "b"
2) "a"
127.0.0.1:6379> rpush list c				#在list右边插入c值
(integer) 3
127.0.0.1:6379> rpush list d				#在list右边插入d值
(integer) 4
127.0.0.1:6379> lrange list 0 -1			#获取list所有值
1) "b"
2) "a"
3) "c"
4) "d"
127.0.0.1:6379>

2、lpop/rpop lpop/rpop <key>从左边/右边吐出一个值。(值在键在,值光键亡。)
127.0.0.1:6379> lrange list 0 -1				#查看当前list所有值
1) "b"
2) "a"
3) "c"
4) "d"
127.0.0.1:6379> lpop list 1						#在左边弹出一个值
1) "b"
127.0.0.1:6379> rpop list 1						#在右边弹出一个值
1) "d"
127.0.0.1:6379> lrange list 0 -1				#获取list当中所有的值
1) "a"
2) "c"
127.0.0.1:6379> keys *							#查看数据库的键
1) "list"
127.0.0.1:6379> rpop list 2						#将list中所有的都弹出去
1) "c"
2) "a"
127.0.0.1:6379> keys *							#查看键是否存在
(empty array)
127.0.0.1:6379>

通过上述测试验证了,值在键在,值光键亡。

3、lrange lrange <key><start><stop> 按照索引下标获得元素(从左到右)
127.0.0.1:6379> lrange mylist 0 -1				#获取mylist里面的所有值,-1右边第一个
1) "d"
2) "c"
3) "b"
4) "a"
127.0.0.1:6379> lrange mylist 0 2				#获取下标0到2的值
1) "d"
2) "c"
3) "b"
127.0.0.1:6379> lrange mylist 0 1				#获取下标0到1的值
1) "d"
2) "c"
127.0.0.1:6379>
4、lindex lindex<key><index>按照索引下标获得元素(从左到右)
127.0.0.1:6379> lrange mylist 0 -1			#获取mylist里面的所有值,-1右边第一个
1) "d"
2) "c"
3) "b"
4) "a"
127.0.0.1:6379> lindex mylist 0				#获取mylist集合中第0个元素
"d"
127.0.0.1:6379> lindex mylist 1				#获取mylist集合中第1个元素
"c"
127.0.0.1:6379> lindex mylist 2				#获取mylist集合中第2个元素
"b"
5、llen llen <key>获得列表长度
127.0.0.1:6379> lrange mylist 0 -1			#
1) "d"
2) "c"
3) "b"
4) "a"
127.0.0.1:6379> llen mylist					#获取mylist的长度
(integer) 4
127.0.0.1:6379> lpush mylist1 l				#将l值加入mylist1中
(integer) 1
127.0.0.1:6379> llen mylist1				#获取mylist1的值
(integer) 1
6、linsert linsert <key> before/after <value><newvalue>的后面插入插入值
127.0.0.1:6379> lrange mylist 0 -1			#获取mylist里面的所有值,-1右边第一个
1) "d"
2) "c"
3) "b"
4) "a"
127.0.0.1:6379> linsert mylist before a m	#在指定的值前面添加一个元素m
(integer) 5
127.0.0.1:6379> lrange mylist 0 -1			#查看mylist里面的所有值
1) "d"
2) "c"
3) "b"
4) "m"
5) "a"
127.0.0.1:6379> linsert mylist after a n	#在指定的值后边添加一个元素n
(integer) 6
127.0.0.1:6379> lrange mylist 0 -1			#查看mylist里面的所有值
1) "d"
2) "c"
3) "b"
4) "m"
5) "a"
6) "n"
127.0.0.1:6379>
7、lrem lrem <key><n><value>从左边删除n个value(从左到右)
127.0.0.1:6379> lrange mylist 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
127.0.0.1:6379> lrem mylist 2 z				#移除mylist中z元素,没有返回0
(integer) 0
127.0.0.1:6379> lrem mylist 2 a				#移除mylist中2个a元素,如果只有一个a,就只能移除一个
(integer) 1
8、lset lset <key><index><value>将列表key下标为index的值替换成value
127.0.0.1:6379> lrange mylist 0 -1			#获取mylist立面的值
1) "d"
2) "c"
3) "b"
4) "a"
127.0.0.1:6379> lset mylist 0 m				#将第0个元素替换成m
OK
127.0.0.1:6379> lrange mylist 0 -1			#获取mylist所有元素
1) "m"
2) "c"
3) "b"
4) "a"
127.0.0.1:6379>

三、总结

  • list实际上是一个链表,before Node after ,left right都可以插入值

  • 如果key不存在,创建新的链表

  • 如果key存在,新增内容

  • 如果移除了所有值,空链表,代表不存在

  • 在两边插入或者改动值,效率最高!中间元素效率相对较低

  • 消息队列(Lpush Rpop) 栈(Lpush Lpop)

posted @ 2021-11-12 15:00  不起眼的程序员  阅读(200)  评论(0)    收藏  举报