Redis五大数据类型——List
基本的数据类型:列表
在redis里面,我们可以把list当作队列,或栈来使用。
在redis里,所有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 0 -1
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> RPUSH list four # 将一个值或多个值,插入到列表尾部(右,队列)
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1 # 获取列表中的所有值
1) "three"
2) "two"
3) "one"
4) "four"
127.0.0.1:6379> LPOP list # 移除最左边的元素(栈),有返回值,返回值是被移除的值
"three"
127.0.0.1:6379> RPOP list # 移除最右边的元素(队列),有返回值,返回值是被移除的值
"four"
127.0.0.1:6379> LRANGE list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> LINDEX list 1 # 通过下标获取list中索引的值
"one"
127.0.0.1:6379> LINDEX list 0
"two"
127.0.0.1:6379> LLEN list # 查看list长度
(integer) 2
# ==========
127.0.0.1:6379> keys *
1) "list"
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "four"
3) "three"
4) "two"
5) "one"
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "four"
3) "three"
4) "two"
127.0.0.1:6379> LREM list 1 three # LREM key count element,移除列表key中count数量的指定元素
(integer) 1
127.0.0.1:6379> LRANGE list 0 -1
1) "four"
2) "three"
3) "two"
127.0.0.1:6379> LPUSH list three
(integer) 4
127.0.0.1:6379> LREM list 2 three
(integer) 2
127.0.0.1:6379> LRANGE list 0 -1
1) "four"
2) "two"
# ==========
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> RPUSH list "v1" "v2" "v3" "v4"
(integer) 4
127.0.0.1:6379> LTRIM list 1 2 # 通过下标截取指定的长度
OK
127.0.0.1:6379> LRANGE list 0 -1 # 这个list已经被改变了,发现只剩下了截取的元素
1) "v2"
2) "v3"
# ==========
127.0.0.1:6379> RPUSH list "v1" "v2" "v3" "v4"
(integer) 4
127.0.0.1:6379> RPOPLPUSH list otherl # 移除列表中的最后一个元素,并把该元素添加到新的列表中
"v4"
127.0.0.1:6379> lrange list 0 -1
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> lrange otherl 0 -1
1) "v4"
# ==========
127.0.0.1:6379> LPUSH list v1
(integer) 1
127.0.0.1:6379> LSET list 0 v2 # 设置名为key的列表中,下标为index的值为element
OK
127.0.0.1:6379> LRANGE list 0 -1 # 发现相当于做了一个update的操作
1) "v2"
127.0.0.1:6379> LSET list 1 v3 # 下标为1的元素不存在,所以报错
(error) ERR index out of range
# ==========
# LINSERT key BEFORE|AFTER pivot element # 在名为key的列表中,在某个值的前面或后面插入一个值
127.0.0.1:6379> RPUSH list "v1" "v2"
(integer) 2
127.0.0.1:6379> LINSERT list before "v2" "v3"
(integer) 3
127.0.0.1:6379> LRANGE list 0 -1
1) "v1"
2) "v3"
3) "v2"
127.0.0.1:6379> LINSERT list after v3 v4
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1
1) "v1"
2) "v3"
3) "v4"
4) "v2"
小结
- 列表实际上是一个链表,before Node after,left,right都可以插入值
- 如果key不存在,创建新的链表
- 如果key存在,新增内容
- 如果移除了key,空链表,也代表不存在
- 在两边插入或改动值,效率最高。对于中间元素,相对来说效率会低一些
消息排队,消息队列(Lpush Rpop),栈(Lpush,Lpop)