(二)Redis 数据类型之字符串List

List的实现原理是双向循环链表

List

image

查找方向可以是从左往右也可以是从右往左,但是要实现从右往左还需要终端节点的地址,所以通常会设计成双向的循环链表;

若链表为空:

image

lpush

1
2
3
4
5
6
7
8
9
10
11
12
lpush key element [element ...]

lpush mylist 'test'
lpush mylist 'test2'
lpush mylist 'test3'
lpush mylist 'test4'
lrange mylist 0 -1

1) "test4"
2) "test3"
3) "test2"
4) "test"

从左边插入元素, 从左边依次追加进栈,先进后出,后进先出

rpush

1
2
3
4
5
6
7
8
9
10
11
12
rpush key element [element ...]

rpush mylist2 'test'
rpush mylist2 'test2'
rpush mylist2 'test3'
rpush mylist2 'test4'
lrange mylist2 0 -1

1) "test"
2) "test2"
3) "test3"
4) "test4"

从右边插入元素, 从右边依次追加进队列,先进先出,后进后出

lrange

根据起止下标查询列表元素

LRANGE key start stop

start: 从指定下标开始检索
stop: 检索几个元素 -1 表示全部元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
lrange key 0 -1 #表示查看全部元素
lrange key -1 -1 #表示查看最右边的元素

lrange mylist2 0 -1

1) "-1"
2) "0"
3) "0"
4) "test"
5) "test2"
6) "test3"
7) "test4"
8) "test5"
9) "test6"

lrange mylist2 -1 -1

1) "test6"

lpushx

1
lpushx key element [element ...]

与string类型中的nx类似,只有当list存在时才会从左边依次追加元素。

rpushx

1
rpushx key element [element ...]

与string类型中的nx类似,只有当list存在时才会从右边依次追加元素。

linsert

从list中指定的元素的前/后 插入一个新元素:

linsert key BEFORE|AFTER pivot element

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
lrange mylist3 0 -1 查看列表
1) "-1"
2) "0"
3) "1"

linsert mylist3 before -1 -2-1的前面插入-2
lrange mylist3 0 -1
1) "-2"
2) "-1"
3) "0"
4) "1"

linsert mylist3 after 1 21的后面插入2
lrange mylist3 0 -1
1) "-2"
2) "-1"
3) "0"
4) "1"
5) "2"

lrem

lrem key count element

从指定列表左侧开始,删除count个指定元素element

1
2
3
4
5
6
7
8
9
10
11
12
13
lrem mylist3 1 2 从左侧开始删除12
lrange mylist3 0 -1

1) "-2"
2) "-1"
3) "0"
4) "1"
lrem mylist3 1 -2 从左侧开始删除1-2
lrange mylist3 0 -1

1) "-1"
2) "0"
3) "1"

lset

lset key index element

根据下标修改元素内容,下标从左边算起,以0开始:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
lrange mylist 0 -1
1) "-1"
2) "test4"
3) "test3"
4) "test2"
5) "test"

lset mylist 1 test 设置第一个元素为test
lrange mylist 0 -1
1) "-1"
2) "test"
3) "test3"
4) "test2"
5) "test"

ltrim

ltrim key start stop

将原列表截取为从下标start到下标stop闭区间的列表

1
2
3
4
5
6
7
8
9
10
11
lrange mylist 0 -1
1) "-1"
2) "test"
3) "test3"
4) "test2"
5) "test"
ltrim mylist 0 2 ## 截取从0-2的元素为一个新的List
lrange mylist 0 -1
1) "-1"
2) "test"
3) "test3"

llen

llen key

查看指定List中元素的个数

1
llen mylist

lindex

llindex key index
根据指定数组index检索元素

1
2
3
4
5
6
lrange mylist 0 -1
1) "-1"
2) "test"
3) "test3"
lindex mylist 0 ##查找第0个元素
"-1"

lpop

lpop key

左侧消费数据,消费完删除, 这里可以把List当成一个消息队列去看。

rpop

rpop key

从右侧消费数据,消费完删除