之前整理的关于 Redis 的文章:
Redis | Redis 的安装
Redis | Redis 的帮助命令
Redis | Redis 命令分类
Redis | Redis 通用命令
Redis | Redis 字符串相关命令
Redis | Redis 列表相关命令
Redis | Redis 集合相关命令
Redis | Redis 有序集合相关命令
Redis | Redis 哈希相关命令
Redis | 源码阅读 —— 字符串
Redis | 源码阅读 —— 链表
Redis | Redis Pub/Sub相关命令
Redis | 管道 —— PipeLine
Redis | SpringBoot整合Redis
Redis | Redis 的事务一
Redis | Redis 的事务二
Redis | 基础数据类型应用场景
Redis | 事务源码阅读
Redis | 事物源码阅读 —— watch
Redis | 慢查询
Redis | 给接口添加缓存
Redis | Redis 也会算距离
目录
常用 List 相关命令
1、lpush 命令
2、rpush 命令
3、llen 命令
4、lrange 命令
5、ltrim 命令
6、lset 命令
7、lrem 命令
8、lpop 命令
9、rpop 命令
10、blpop 命令
11、brpop 命令
12、brpoplpush 命令
13、lindex 命令
14、linsert 命令
15、lpushx 命令
16、rpoplpush 命令
17、rpushx 命令
总结
Redis 支持多种数据结构,比如 字符串、列表、集合、有序集合 和 哈希 等数据结构。本次我整理了关于 列表 相关的命令,也就是关于 List 相关的命令,如下图。
上图中用红色圈中的部分,就是关于 列表 相关的命令。如果想要在 Redis 中查看相关的命令也可以使用 help 命令来进行查看,命令如下。
127.0.0.1:6379> help @list
在按下回车后,可以看到相应分类命令的说明,如下图。
图中就是部分关于 List 相关的部分命令。
List 数据类型是 Key 对应的 Value 的类型,在 Redis 中所有的 Key 都是字符串,所谓的数据类型表示的是 Value 的类型。在 List 中的 Value 是一个列表,列表的顺序是数据存入时的顺序,且列表中的元素可以是重复的。
为了大家能够直接复制命令进行测试,下面我就不截图了。
在 列表 的左侧添加元素,成功返回当前列表的长度。
127.0.0.1:6379> lpush key java
(integer) 1
lpush 一次可以给 key 添加多个 value
127.0.0.1:6379> lpush key python php c
(integer) 4
观察它的返回值是 4 ,表示列表的当前长度为 4。
127.0.0.1:6379> lpush key c++
(integer) 5
再添加一个 value 进行观察,当前列表的长度为 5。
在 列表 的右侧添加元素,用法和 lpush 相同。
127.0.0.1:6379> rpush key rust
(integer) 6
127.0.0.1:6379> rpush key asm scala
(integer) 8
返回列表的当前长度
127.0.0.1:6379> llen key
(integer) 8
查看列表指定范围的值
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 的值位置,那么就无法进行查看了。
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 个元素,另外两个元素已经从列表中被移除了。
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。
删除列表中的元素,命令的格式为:
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 的元素,因此只删除掉一个。如果有多个的话,那么会删除多个。
从列表的左侧弹出一个值
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++ 已经从列表中出来了
从列表的右侧弹出一个值
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 已经从列表中。
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。
brpop 命令与 blpop 命令类似,这里就不再赘述了。
删除一个列表的最右侧的元素,并加入到另一个列表的最左侧。同样它也会进行阻塞。
该命令的格式如下:
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 中。
返回列表指定索引位置的值:
127.0.0.1:6379> lindex key 1
"python"
key 列表 索引 位置为 1 的值是 python
在列表指定值的前面或后面插入一个新的值,该命令的格式如下:
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。
当列表存在时,在列表的左侧加入一个值,如果列表不存在则不加入。
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"
该命令类似 brpoplpush ,只是该命令不进入阻塞,当 key1 为空时直接返回。
与 lpushx 命令相同,该命令只是从右侧加入新的值。
Redis 的列表类型不但可以当作列表来用,还可以当作 队列、栈 等数据结构来使用。这也是单纯的只支持存储 String 类型的缓存中间件使用越来越少的原因吧,因为这种中间件已经不能满足各种业务场景的需要。
Redis 常用的几种基本数据类型总结完成后,我会再逐步的梳理 Redis 的各种应用场景,希望大家可以喜欢。