在redis中,我们可以把List看成是栈、队列、阻塞队列!
1、lpush 和rpush 的命令
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 0 -1 # 获取全部的值
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> lrange list 0 1 # 获取从头部开始,索引为0和1的值
1) "three"
2) "two"
127.0.0.1:6379> rpush list right # 将一个值或者多个值插入到列表右边(尾部)
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "right"
2、lpop 和 rpop 的命令
127.0.0.1:6379> lpop list # 从列表的左侧移除值
"three"
127.0.0.1:6379> rpop list # 从列表的右侧移除值
"right"
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
3、Lindex 和 Llen 的命令
127.0.0.1:6379> lindex list 1
"one"
127.0.0.1:6379> lindex list 0
"two"
127.0.0.1:6379> llen list
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
4、lrem 命令
127.0.0.1:6379> lpush list one
(integer) 1
127.0.0.1:6379> lpush list one
(integer) 2
127.0.0.1:6379> lpush list one
(integer) 3
127.0.0.1:6379> lpush list two
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
3) "one"
4) "one"
127.0.0.1:6379> lrem list 1 one # 移除指定个数的值
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
3) "one"
127.0.0.1:6379> lrem list 2 one
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "two"
5、ltrim 命令
127.0.0.1:6379> rpush list h1
(integer) 1
127.0.0.1:6379> rpush list h2
(integer) 2
127.0.0.1:6379> rpush list h3
(integer) 3
127.0.0.1:6379> rpush list h4
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "h1"
2) "h2"
3) "h3"
4) "h4"
127.0.0.1:6379> ltrim list 1 2 # 截取掉索引为1到2之间的元素
OK
127.0.0.1:6379> lrange list 0 -1
1) "h2"
2) "h3"
6、rpoplpush 命令
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> lrange list 0 -1
1) "hello"
2) "hello1"
3) "hello2"
127.0.0.1:6379> rpoplpush list mylist # 弹出一个值,然后放到另一个列表中去
"hello2"
127.0.0.1:6379> lrange list 0 -1
1) "hello"
2) "hello1"
127.0.0.1:6379> lrange mylist 0 -1
1) "hello2"
7、lset 命令
127.0.0.1:6379> exists list
(integer) 0
127.0.0.1:6379> lset list 0 value # 不存在则会报错
(error) ERR no such key
127.0.0.1:6379> lpush list value
(integer) 1
127.0.0.1:6379> lrange list 0 0
1) "value"
127.0.0.1:6379> lset list 0 item # 如果存在,替换原有的值
OK
127.0.0.1:6379> lrange list 0 0
1) "item"
7、Linsert 命令
127.0.0.1:6379> lpush list hello
(integer) 1
127.0.0.1:6379> lpush list world
(integer) 2
127.0.0.1:6379> linsert list before world , # 在world之前插入逗号,用after就是之后插入
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) ","
2) "world"
3) "hello"
总结
- List实际上是一个链表,在before、after、left、right都可以插入值
- 如果List中key不存在,则创建新的链表
- 如果key存在,会新增内容
- 如果移除了所有值,也就是空链表,也就代表List列表不存在!
- 如果在List两端进行插入或者修改值,则效率最高!在列表操作中间元素,相对来说效率会低一点
- List可以看作是消息排队!消息队列 (Lpush Rpop), 栈( Lpush Lpop)!