一、list简介
Redis列表是简单的字符串列表,按照插入顺序排序,可以在头部或尾部插入数据。底层是一个双向链表
list实现了一个key对应多个value,这些value被维护在一个链表中。
二、常用指令
1.lpush <key> <value> [<value>…]
向key对应的列表头部插入数据
127.0.0.1:6379> lpush k1 1 2 3
(integer) 3
127.0.0.1:6379> lrange k1 0 -1
1) "3"
2) "2"
3) "1"
2.rpush <key> <value> [<value>…]
向key对应的列表尾部插入数据
127.0.0.1:6379> rpush k1 9 9
(integer) 6
127.0.0.1:6379> lrange k1 0 -1
1) "2"
2) "3"
3) "2"
4) "1"
5) "9"
6) "9"
3.lpop <key>
从key对应的列表头部弹出数据
127.0.0.1:6379> lrange k1 0 -1
1) "2"
2) "3"
3) "2"
4) "1"
5) "9"
6) "9"
127.0.0.1:6379> lpop k1
"2"
注意,若弹出数据后key对应的列表为空,key也会被删除。(值在键在,值亡键亡)
4.rpop <key>
从key对应的列表尾部弹出数据
5.rpoplpush <source> <destination>
从source的尾部弹出元素并插入dest头部。
6.lrange <start> <stop>
显示下标从start到stop的元素,若下标为负数表示从右到左数
127.0.0.1:6379> lpush k1 5 6 3 2 1
(integer) 5
127.0.0.1:6379> lrange k1 0 -2
1) "1"
2) "2"
3) "3"
4) "6"
7.lindex <key> <index>
显示key对应的列表下标为index的元素:
127.0.0.1:6379> lrange k1 0 -1
1) "1"
2) "2"
3) "3"
4) "6"
5) "5"
127.0.0.1:6379> lindex k1 3
"6"
8.linsert <key> before|after <pivot>
查找list中第一个值为pivot的元素并在其前面或后面插入value,若找不到则拒绝插入;
127.0.0.1:6379> lrange k1 0 -1
1) "1"
2) "2"
3) "3"
4) "3"
5) "6"
6) "5"
127.0.0.1:6379> linsert k1 before 3 99
(integer) 7
#未找到100拒绝插入
127.0.0.1:6379> linsert k1 before 100 100
(integer) -1
9.lrem <key> <count>
从左到右移除count个值为value的元素,若list中value元素小于count个,则全部移除。
10.lset <key> <index>
设置下标为index的元素的值。若越界则报错,否则修改。
二、底层数据结构
list的底层数据结构是quicklist,当元素较少时list被分配在一块连续的内存区域,也就是ziplist。而当元素变多时,数据会分配在多个ziplist中,通过指针链接形成双向链表,这个链表就是quicklist。
使用这种结构在保证了快速插入删除的同时减少了内存的开销,因为节省了存储大量的next和prev指针的空间。