List(列表)

AnJiaYu / 2023-08-27 / 原文

List(列表)

基本的数据类型,列表

在redis中可以使用list实现栈、队列、阻塞队列

所有的list命令都是用l开头的

127.0.0.1:6379> LPUSH list one 
(integer) 1
127.0.0.1:6379> LPUSH list two
(integer) 2
127.0.0.1:6379> LPUSH list three
(integer) 3


127.0.0.1:6379> LRANGE list
(error) ERR wrong number of arguments for 'lrange' command
127.0.0.1:6379> LRANGE list 0 *
(error) ERR value is not an integer or out of range
127.0.0.1:6379>

如果想要获取list中所有的值 可以设置取值范围是0 -1 也可以使用0 到 大于等于这个集合中元素个数的值

127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "two"
3) "one"

127.0.0.1:6379> LRANGE list 0 3
1) "three"
2) "two"
3) "one"

127.0.0.1:6379> LRANGE list 0 4
1) "three"
2) "two"
3) "one"

可以发现 这里我们插入的是 one two three 当我们读取出来的时候却是反过来的 原因就在我们插入的方法 是采用的lplush 这个方法

 

对于lpush的方法 官网给出的解释 大致翻译下就是 在一个列表的头部插入一个元素 如果这个列表不存在 就创建一个列表

这个是在列表的左侧进行插入值也就是我们常说的头插法,当然我们也可以使用尾插法,就是在列表的右边插入值 ,也就是RPush

127.0.0.1:6379> RPUSH list zero
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "two"
3) "one"
4) "zero"
127.0.0.1:6379>

有插入数据 就会有移除数据 插入数据我们采用的是push 那么 移除数据 对应的就是 pop 并且插入数据分左右插入 那么移除数据也是分左右操作的

lpop
从列表的头弹出一个元素
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "two"
3) "one"
4) "zero"
127.0.0.1:6379> LPOP list
"three"
127.0.0.1:6379> LRANGE list 0 -1
1) "two"
2) "one"
3) "zero"
127.0.0.1:6379>
########################################
rpop
从列表的尾部弹出一个元素
127.0.0.1:6379> RPOP list
"zero"
127.0.0.1:6379> LRANGE list 0 -1
1) "two"
2) "one"
127.0.0.1:6379>

现在我们可以插入值 也可以删除值 还缺一个访问固定下标的值

在Java中我们使用index 来访问下标 在这里我们使用Lindex来访问下标 ,需要注意的是我们访问所有的值的编号是从1开始的

而采用index 需要输入的下标是从0开始的

127.0.0.1:6379> LRANGE list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> LINDEX list 2
(nil)
127.0.0.1:6379> LINDEX list 1
"one"
127.0.0.1:6379>

还有查询list的长度 llen

127.0.0.1:6379> LLEN list
(integer) 2
127.0.0.1:6379>

移除指定的值 lrem

 

 

这个用法是删除其中的某个值 如果这个值有重复 可以进行指定的删除数量

127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> LREM list 2 one
(integer) 1
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "two"
127.0.0.1:6379> LRANGE list 0 -1
1) "0ne"
2) "0ne"
3) "0ne"
4) "0ne"
5) "three"
6) "two"
127.0.0.1:6379>

我们插入了4个one 现在我们要删除这里面三个

127.0.0.1:6379> LRANGE list 0 -1
1) "0ne"
2) "0ne"
3) "0ne"
4) "0ne"
5) "three"
6) "two"
127.0.0.1:6379> LREM list 3 0ne
(integer) 3
127.0.0.1:6379> LRANGE list 0 -1
1) "0ne"
2) "three"
3) "two"
127.0.0.1:6379>

如果计数器的数量超出集合中的数量 那么有几个删除几个

127.0.0.1:6379> LREM list 3 0ne
(integer) 1
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "two"
127.0.0.1:6379>

如果说我们这个集合里面数据很多 ,我们只想要其中的一部分值 ,这里我们就可以使用ltrim方法,这个方法会破环掉原本的集合还有不破坏集合的方法

127.0.0.1:6379> FLUSHDB 
OK
127.0.0.1:6379> RPUSH list hello
(integer) 1
127.0.0.1:6379> RPUSH list hello1
(integer) 2
127.0.0.1:6379> RPUSH list hello2
(integer) 3
127.0.0.1:6379> RPUSH list hello3
(integer) 4
127.0.0.1:6379> RPUSH list hello4
(integer) 5
127.0.0.1:6379> LTRIM list 1 2
OK
127.0.0.1:6379> LRANGE list 0 -1
1) "hello1"
2) "hello2"
127.0.0.1:6379>

这个命令比较复杂 是两个命令的组合 rpoplpush这个可以拆成两个命令来进行理解 rpop 和lpush

就是从一个集合的最后一位移除一个元素,来放入到另一个集合的头

127.0.0.1:6379> LRANGE list 0 -1
1) "hello"
2) "hello1"
3) "hello2"
4) "hello3"
5) "hello4"
127.0.0.1:6379> RPOPLPUSH list list1
"hello4"
127.0.0.1:6379> keys *
1) "list1"
2) "list"

127.0.0.1:6379> LRANGE list1 0 -1
1) "hello4"
127.0.0.1:6379>

lset命令 在列表当中替换某一个下标的值 需要指定这个值的下标 如果需要放入的集合不存在,那么就会报错

如果替换的下标没有值,也会报错

还可以在一个值的前面或者后面插入一个值

linsert


127.0.0.1:6379> LRANGE list 0 -1
1) "hello"
2) "world"
127.0.0.1:6379> LINSERT list before world other
(integer) 3
127.0.0.1:6379> LRANGE list 0 -1
1) "hello"
2) "other"
3) "world"
127.0.0.1:6379>

小结

list其实就是一个链表 他的功能很强大 可以通过不同的规则来实现不同的数据结构 如 栈(lpush lpop) 队列(lpush rpop)