Redis数据类型—List类型

142 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第8天,点击查看活动详情

Redis List是一个字符串列表,它按照元素的插入顺序排序。我们在使用List时可以在它的头部或者尾部插入数据和取出数据;

下面我们开始介绍一下List的常用命令:

LPUSH命令

lpush key value1 value2 ......

示例:

redis> lpush programming_language java go rust
3
redis> lrange programming_language 0 3
0 rust
1 go
2 java

lpush表示从左边依次插入元素;上述示例就是从列表的左边先插入java,再插入go,最后插入rust;所以最后通过lrange命令查询出来的结果是rustgojava,此时rust是在列表的最左边的;

RPUSH命令

rpush key value1 value2 ......

示例:

redis> rpush programming_language lua kotlin javascript
6
redis> lrange programming_language 0 6
0 rust
1 go
2 java
3 lua
4 kotlin
5 javascript

lpush类似,rpush表示从右边依次插入元素,在上一个示例的基础上,我们从右边依次插入了luakotlinjavascript,最后确实如我们预期的一样,它们都在列表的最右边;

LPOP命令

lpop key

示例:

redis> lpop programming_language
rust
redis> lrange programming_language 0 6
0 go
1 java
2 lua
3 kotlin
4 javascript

我们发现使用lpop命令后,返回了rust,并且列表中已经没有了rust;说明lpop命令把rust元素从列表左边弹出来了;

lpop命令表示从左边移除并返回列表的第一个元素;

RPOP命令

rpop key

示例:

redis> rpop programming_language
javascript
redis> lrange programming_language 0 6
0 go
1 java
2 lua
3 kotlin

rpop命令和lpop命令类似,它表示从右边移除并返回列表的第一个元素,所以结果弹出了javascript

BLPOP命令

blpop key timeout[单位:秒]

示例:

redis> blpop programming_language 2
0 programming_language
1 go

blpop表示带阻塞地从列表左边移除并返回第一个元素;如果列表中没有元素,那么就会阻塞2秒钟,要么2秒内有元素push进来然后被pop返回,要么2秒后返回null

BRPOP命令

brpop key timeout[单位:秒]

示例:

redis> brpop programming_language 2
0 programming_language
1 kotlin

blpop类似,只不过brpop是从右边移除并返回元素;

LLEN命令

llen key

示例:

redis> llen programming_language
2
redis> lrange programming_language 0 6
0 java
1 lua

llen命令是用来获取列表长度的;

LRANGE命令

lrange key start end

示例:

redis> lrange programming_language 0 6
0 java
1 lua

lrange命令用来获取列表指定范围内的元素;

LINDEX命令

lindex key index

示例:

redis> lrange programming_language 0 6
0 java
1 lua
redis> lindex programming_language 0
java

lindex命令和数组根据索引值获取元素一样,lindex programming_language 0表示返回索引0位置的元素;

LREM命令

lrem key count value

示例:

redis> lpush my_list hello hello hello
3
redis> lrem my_list 2 hello
2
redis> lrange my_list 0 10
0 hello

lrem中的count参数需要特别注意:

  • count>0表示从左边开始搜索,并删除与value相同的count个元素;
  • count<0表示从右边开始搜索,并删除与value相同元素,数量为count的绝对值;
  • count=0表示删除所有与value相同的元素;

LSET命令

lset key index value

示例:

redis> lrange my_list 0 10
0 hello
1 hello
2 hello
redis> lset my_list 1 world
OK
redis> lrange my_list 0 10
0 hello
1 world
2 hello

lset命令表示通过索引设置列表元素的值;

LTRIM命令

ltrim key start stop

示例:

redis> lrange my_list 0 10
0 hello
1 world
2 hello
redis> ltrim my_list 1 1
OK
redis> lrange my_list 0 10
0 world

ltrim表示对列表指定区域进行修剪,其余元素全部删除;相当于java中的subtring的效果;

LPUSHX命令

lpushx key value

示例:

redis> lpush tmp_list foo
1
redis> lpushx tmp_list hello
2
redis> lpushx second_list world
0
redis> lrange tmp_list 0 -1
0 hello
1 foo

lpushx在列表存在的情况下,会向列表左边插入数据;如果列表不存在,那么不会有效果;

RPUSHX命令

rpushx key value

示例:

redis> lpush tmp_list foo
1
redis> rpushx tmp_list hello
2
redis> lrange tmp_list 0 -1
0 foo
1 hello

rpushxlpushx类型,需要在列表存在的情况下才会生效,rpushx则是向右边插入元素;

LINSERT命令

linsert key [before|after] pivot value

示例:

redis> lpush mylist hello
1
redis> lpush mylist world
2
redis> linsert mylist before "world" "redis" 
3
redis> lrange mylist 0 -1
0 redis
1 world
2 hello

linsert命令表示将 value值插入 pivot值前面或者后面;

BRPOPLPUSH命令

brpoplpush source destination timeout

示例:

redis> lrange mylist 0 -1
0 redis
1 world
2 hello
redis> brpoplpush mylist target_list 2
hello
redis> lrange target_list 0 -1
0 hello
redis> lrange mylist 0 -1
0 redis
1 world

brpoplpush命令是在操作两个列表,从第一个列表的右边移除元素,并插入第二个列表的左边,并设置超时时间;

RPOPLPUSH命令

rpoplpush source destination

这个命令就是上一个命令的非阻塞命令,它不需要设置超时时间;