Redis 支持多种数据结构,比如 字符串、列表、集合、有序集合 和 哈希 等数据结构。本次我整理了关于 列表 相关的命令,也就是关于 List 相关的命令,如下图。
上图中用红色圈中的部分,就是关于 列表 相关的命令。如果想要在 Redis 中查看相关的命令也可以使用 help 命令来进行查看,命令如下。
127.0.0.1:6379> help @list
在按下回车后,可以看到相应分类命令的说明,如下图。
图中就是部分关于 List 相关的部分命令。
常用 List 相关命令
List 数据类型是 Key 对应的 Value 的类型,在 Redis 中所有的 Key 都是字符串,所谓的数据类型表示的是 Value 的类型。在 List 中的 Value 是一个列表,列表的顺序是数据存入时的顺序,且列表中的元素可以是重复的。
为了大家能够直接复制命令进行测试,下面我就不截图了。
1、lpush 命令
在 列表 的左侧添加元素,成功返回当前列表的长度。
1. 127.0.0.1:6379> lpush key java 2. (integer) 1
lpush 一次可以给 key 添加多个 value
1. 127.0.0.1:6379> lpush key python php c 2. (integer) 4
观察它的返回值是 4 ,表示列表的当前长度为 4。
1. 127.0.0.1:6379> lpush key c++ 2. (integer) 5
再添加一个 value 进行观察,当前列表的长度为 5。
2、rpush 命令
在 列表 的右侧添加元素,用法和 lpush 相同。
127.0.0.1:6379> rpush key rust (integer) 6 127.0.0.1:6379> rpush key asm scala (integer) 8
3、llen 命令
返回列表的当前长度
127.0.0.1:6379> llen key (integer) 8
4、lrange 命令
查看列表指定范围的值
127.0.0.1:6379> lrange key 0 3 1) "c++" 2) "c" 3) "php" 4) "python"
列表的索引从 0 开始,上面查看的是从 索引 0 到 索引 3 范围内的值。
如果想查看所有的值,可以通过正负索引来进行查看。
127.0.0.1:6379> lrange key 0 -1 1) "c++" 2) "c" 3) "php" 4) "python" 5) "java" 6) "rust" 7) "asm" 8) "scala"
列表最后一个元素的索引为 -1,上面就是从第一个元素到最后一个元素的值都进行了显示。
127.0.0.1:6379> lrange key -3 -1 1) "rust" 2) "asm" 3) "scala"
上面的也是可以。key 后面的参数分别是 start 和 end,因此 start 值的位置如果大于 end 的值位置,那么就无法进行查看了。
5、ltrim 命令
ltrim 是用于截取列表内元素的命令。
127.0.0.1:6379> ltrim key 0 5 OK 127.0.0.1:6379> lrange key 0 -1 1) "c++" 2) "c" 3) "php" 4) "python" 5) "java" 6) "rust"
上面使用 ltrim 命令对列表进行了截取,保留了索引从 0 到 5 位置的元素,因为用 lrange 进行查看时,只保留了 6 个元素,另外两个元素已经从列表中被移除了。
6、lset 命令
lset 命令用来修改指定索引位置元素的值。
127.0.0.1:6379> lset key 1 oc OK 127.0.0.1:6379> lrange key 0 -1 1) "c++" 2) "oc" 3) "php" 4) "python" 5) "java" 6) "rust"
可以看到 索引 为 1 的元素被修改为了 oc。
7、lrem 命令
删除列表中的元素,命令的格式为:
lrem key count value
我们再添加几个值为 php 的元素
127.0.0.1:6379> rpush key php vb php (integer) 9 127.0.0.1:6379> lrange key 0 -1 1) "c++" 2) "oc" 3) "php" 4) "python" 5) "java" 6) "rust" 7) "php" 8) "vb" 9) "php"
列表中可以保存重复的元素,这里使用 rpush 添加了两个 php 的元素,现在来删除最后的一个 php。
127.0.0.1:6379> lrem key -1 php (integer) 1 127.0.0.1:6379> lrange key 0 -1 1) "c++" 2) "oc" 3) "php" 4) "python" 5) "java" 6) "rust" 7) "php" 8) "vb"
可以看到,最后面的 php 元素已经被删除了
再来删除第一个 php
127.0.0.1:6379> lrem key 1 php (integer) 1 127.0.0.1:6379> lrange key 0 -1 1) "c++" 2) "oc" 3) "python" 4) "java" 5) "rust" 6) "php" 7) "vb"
可以看到,第一个 php 的元素被删除了
如果想要删除所有值为 php 的元素,那么就将 count 设置为 0 即可。
127.0.0.1:6379> lrem key 0 php (integer) 1
因为列表中只剩一个值为 php 的元素,因此只删除掉一个。如果有多个的话,那么会删除多个。
8、lpop 命令
从列表的左侧弹出一个值
127.0.0.1:6379> lpop key "c++" 127.0.0.1:6379> lrange key 0 -1 1) "oc" 2) "python" 3) "java" 4) "rust" 5) "vb"
可以看到列表中最开始的 c++ 已经从列表中出来了
9、rpop 命令
从列表的右侧弹出一个值
127.0.0.1:6379> rpop key "vb" 127.0.0.1:6379> lrange key 0 -1 1) "oc" 2) "python" 3) "java" 4) "rust"
可以看到列表中最后面的 vb 已经从列表中。
10、blpop 命令
blpop 命令的格式如下:
blpop key [key ...] timeout
该命令的作用是在 非空列表 的左侧弹出一个值,如果都为空列表,则阻塞 timeout 秒
我们同时开两个 Redis 的客户端,然后在客户端一输入如下命令:
127.0.0.1:6379> blpop key1 key2 5 (nil) (5.06s)
上面的命令是在 key1 和 key2 列表中弹出一个值,如果两个列表都为空则阻塞 5 秒,因为现在 key1 和 key2 都为空,因此 blpop 阻塞了 5 秒。
再次在客户端一输入如下命令:
127.0.0.1:6379> blpop key1 key2 20
由于 key1 和 key2 同样什么都没有,因此 blpop 命令进入 20 秒的阻塞状态,此时,我们在客户端二输入如下命令:
127.0.0.1:6379> lpush key1 java (integer) 1
也就是给 key1 一个值,然后观察客户端一,客户端一输出如下:
1) "key1" 2) "java" (9.51s)
也就是客户端一的 blpop 阻塞了 9.51 秒 以后 key1 列表弹出一个值 java。
11、brpop 命令
brpop 命令与 blpop 命令类似,这里就不再赘述了。
12、brpoplpush 命令
删除一个列表的最右侧的元素,并加入到另一个列表的最左侧。同样它也会进行阻塞。
该命令的格式如下:
brpoplpush key1 key2 timeout
在客户端一输入如下命令:
127.0.0.1:6379> brpoplpush key1 key2 20
由于 key1 是空,因此阻塞 20 秒。
在客户端二输入如下命令:
127.0.0.1:6379> lpush key1 java (integer) 1
观察看客户端一的输出,输出如下:
"java" (7.86s)
可以看到客户端一输出了 java,然后来看 key2 的内容,命令如下:
127.0.0.1:6379> lrange key2 0 -1 1) "java"
可以看到 key1 的元素进入了 key2 中。
13、lindex 命令
返回列表指定索引位置的值:
127.0.0.1:6379> lindex key 1 "python"
key 列表 索引 位置为 1 的值是 python
14、linsert 命令
在列表指定值的前面或后面插入一个新的值,该命令的格式如下:
linsert key BEFORE|AFTER pivot value
127.0.0.1:6379> linsert key before python c (integer) 5 127.0.0.1:6379> lrange key 0 -1 1) "oc" 2) "c" 3) "python" 4) "java" 5) "rust"
上面的命令,在 python 值的前面插入新的值 c。
15、lpushx 命令
当列表存在时,在列表的左侧加入一个值,如果列表不存在则不加入。
127.0.0.1:6379> lpushx key1 java (integer) 0 127.0.0.1:6379> lrange key1 0 -1 (empty list or set) 127.0.0.1:6379> lpushx key java (integer) 6 127.0.0.1:6379> lrange key 0 -1 1) "java" 2) "oc" 3) "c" 4) "python" 5) "java" 6) "rust"
16、rpoplpush 命令
该命令类似 brpoplpush ,只是该命令不进入阻塞,当 key1 为空时直接返回。
17、rpushx 命令
与 lpushx 命令相同,该命令只是从右侧加入新的值。
总结
Redis 的列表类型不但可以当作列表来用,还可以当作 队列、栈 等数据结构来使用。这也是单纯的只支持存储 String 类型的缓存中间件使用越来越少的原因吧,因为这种中间件已经不能满足各种业务场景的需要。
Redis 常用的几种基本数据类型总结完成后,我会再逐步的梳理 Redis 的各种应用场景,希望大家可以喜欢。