Redis的value数据类型-List
k当中有两个东西在k身上,一个是head,一个是tail,有两个指针,head头指针,tail尾指针。那么在k当中有这两个头尾指针属性有什么好处?
head的话可以指到你value的链表的第一个元素,tail的话可以指到他最后一个元素,那
么这样一个好处就是,你访问一个key,然后它的类型是list的时候,你可以通过它的两个
属性快速的访问 value链表当中的第一个元素和最后一个元素
List常用命令
help @list
BLPOP key [key ...] timeout
summary: Remove and get the first element in a list, or block until one is available
since: 2.0.0
BRPOP key [key ...] timeout
summary: Remove and get the last element in a list, or block until one is available
since: 2.0.0
BRPOPLPUSH source destination timeout
summary: Pop a value from a list, push it to another list and return it; or block until one is available
since: 2.2.0
LINDEX key index
summary: Get an element from a list by its index
since: 1.0.0
LINSERT key BEFORE|AFTER pivot value
summary: Insert an element before or after another element in a list
since: 2.2.0
LLEN key
summary: Get the length of a list
since: 1.0.0
LPOP key
summary: Remove and get the first element in a list
since: 1.0.0
LPUSH key value [value ...]
summary: Prepend one or multiple values to a list
since: 1.0.0
LPUSHX key value
summary: Prepend a value to a list, only if the list exists
since: 2.2.0
LRANGE key start stop
summary: Get a range of elements from a list
since: 1.0.0
LREM key count value
summary: Remove elements from a list
since: 1.0.0
LSET key index value
summary: Set the value of an element in a list by its index
since: 1.0.0
LTRIM key start stop
summary: Trim a list to the specified range
since: 1.0.0
RPOP key
summary: Remove and get the last element in a list
since: 1.0.0
RPOPLPUSH source destination
summary: Remove the last element in a list, prepend it to another list and return it
since: 1.2.0
RPUSH key value [value ...]
summary: Append one or multiple values to a list
since: 1.0.0
RPUSHX key value
summary: Append a value to a list, only if the list exists
since: 2.2.0
127.0.0.1:6379>
从左边操作List:
从左边插入 顺序是 fedcba
127.0.0.1:6379> LPUSH k1 a b c d e f
(integer) 6
127.0.0.1:6379> RPOP k1 从右边取出来 先进先出 像队列
"a"
127.0.0.1:6379> RPOP k1
"b"
127.0.0.1:6379> RPOP k1
"c"
127.0.0.1:6379> RPOP k1
"d"
127.0.0.1:6379> RPOP k1
"e"
127.0.0.1:6379> RPOP k1
"f"
127.0.0.1:6379> RPOP k1
(nil)
127.0.0.1:6379> LPUSH k1 a b c d e f
(integer) 6
127.0.0.1:6379> LPOP k1 从左边取出来 先进后出 像栈
"f"
127.0.0.1:6379> LPOP k1
"e"
127.0.0.1:6379> LPOP k1
"d"
127.0.0.1:6379> LPOP k1
"c"
127.0.0.1:6379> LPOP k1
"b"
127.0.0.1:6379> LPOP k1
"a"
127.0.0.1:6379> LPOP k1
(nil)
127.0.0.1:6379>
127.0.0.1:6379> LPUSH k1 a b c d e f
(integer) 6
127.0.0.1:6379> LRANGE k1 0 -1 从0到-1 左边插入 左是0右边-1 反向索引
1) "f"
2) "e"
3) "d"
4) "c"
5) "b"
6) "a"
-6 -5 -4 -3 -2 -1
f e d c b a
0 1 2 3 4 5
从右边操作List
127.0.0.1:6379> RPUSH k1 a b c d e f 右边开始插入
(integer) 6
127.0.0.1:6379> LPOP k1 从左边取出来 先进先出 像队列
"a"
127.0.0.1:6379> LPOP k1
"b"
127.0.0.1:6379> LPOP k1
"c"
127.0.0.1:6379> LPOP k1
"d"
127.0.0.1:6379> LPOP k1
"e"
127.0.0.1:6379> LPOP k1
"f"
127.0.0.1:6379> LPOP k1
(nil)
127.0.0.1:6379> RPUSH k1 a b c d e f
(integer) 6
127.0.0.1:6379> RPOP k1 从右边取出来 先进后出 像栈
"f"
127.0.0.1:6379> RPOP k1
"e"
127.0.0.1:6379> RPOP k1
"d"
127.0.0.1:6379> RPOP k1
"c"
127.0.0.1:6379> RPOP k1
"b"
127.0.0.1:6379> RPOP k1
"a"
127.0.0.1:6379> RPOP k1
(nil)
127.0.0.1:6379> RPUSH k1 a b c d e f
(integer) 6
127.0.0.1:6379> LRANGE k1 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
127.0.0.1:6379>
-6 -5 -4 -3 -2 -1
a b c d e f
0 1 2 3 4 5
127.0.0.1:6379> RPUSH K1 A B C D E F
(integer) 6
127.0.0.1:6379> LINDEX K1 0 根据下标查询
"A"
127.0.0.1:6379> LINDEX K1 -1
"F"
127.0.0.1:6379> LSET K1 -1 9 根据下标赋值
OK
127.0.0.1:6379> LINDEX K1 -1
"9"
127.0.0.1:6379>
127.0.0.1:6379> RPUSH k1 a a a c c
(integer) 5
127.0.0.1:6379> LRANGE k1 0 -1
1) "a"
2) "a"
3) "a"
4) "c"
5) "c"
List不会去重
下标操作像数组
127.0.0.1:6379> lpush k1 1 a 2 b 3 a 4 c 5 a 6 d
(integer) 12
127.0.0.1:6379> LREM k1 2 a
(integer) 2
127.0.0.1:6379> LINDEX k1 2
"5"
127.0.0.1:6379> LINDEX k1 6
"b"
127.0.0.1:6379> LRANGE k1 0 -1
1) "d"
2) "6"
3) "5"
4) "c"
5) "4"
6) "3"
7) "b"
8) "2"
9) "a"
10) "1"
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> lpush k1 1 a 2 b 3 a 4 c 5 a 6 d
(integer) 12
127.0.0.1:6379> LREM k1 -2 a
(integer) 2
127.0.0.1:6379> LRANGE k1 0 -1
1) "d"
2) "6"
3) "a"
4) "5"
5) "c"
6) "4"
7) "3"
8) "b"
9) "2"
10) "1"
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> lpush k1 1 a 2 b 3 a 4 c 5 a 6 d
(integer) 12
127.0.0.1:6379> LREM k1 0 a
(integer) 3
127.0.0.1:6379> LRANGE k1 0 -1
1) "d"
2) "6"
3) "5"
4) "c"
5) "4"
6) "3"
7) "b"
8) "2"
9) "1"
127.0.0.1:6379> help LREM
LREM key count value
summary: Remove elements from a list
since: 1.0.0
group: list
127.0.0.1:6379>
LREM key count value count大于0从左向右删除 小于0 从右向左 等于0 删除全部value
127.0.0.1:6379> lpush k1 1 a 2 b 3 a 4 c 5 a 6 d
(integer) 12
127.0.0.1:6379> RPUSHX k1 o 追加list
(integer) 13
127.0.0.1:6379> LRANGE k1 0 -1
1) "d"
2) "6"
3) "a"
4) "5"
5) "c"
6) "4"
7) "a"
8) "3"
9) "b"
10) "2"
11) "a"
12) "1"
13) "o"
1
127.0.0.1:6379> BLPOP k1 0
1) "k1"
2) "a"
(130.26s)
127.0.0.1:6379> brpop k1 0
1) "k1"
2) "a"
(24.42s)
127.0.0.1:6379> brpop k1 0
1) "k1"
2) "3"
(20.43s)
127.0.0.1:6379>
2
127.0.0.1:6379> BLPOP k1 0
1) "k1"
2) "aaaa"
(130.00s)
127.0.0.1:6379> brpop k1 0
1) "k1"
2) "a1"
(36.56s)
127.0.0.1:6379> brpop k1 0
1) "k1"
2) "3"
(59.34s)
127.0.0.1:6379>
3
127.0.0.1:6379> RPUSH k1 a
(integer) 1
127.0.0.1:6379> RPUSH k1 aaaa
(integer) 1
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> LPUSH k1 a
(integer) 1
127.0.0.1:6379> LPUSH k1 a1
(integer) 1
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> rpush k1 3
(integer) 1
127.0.0.1:6379> rpush k1 3
(integer) 1
127.0.0.1:6379>
blpop、brpop 阻塞获取 当阻塞时间为0 会一直阻塞直到获取到
什么叫阻塞的单播队列,因为如果消息订阅的话,有可能我1个人的消息可以被10个人
订阅,100人订阅,我发的这10个人同时都拿到,但是刚才你会发现,我发1个hello到这个
list里边,谁第一个阻塞的,他拿走了,第二个根本不知道有这个东西出现,但这个人还在
这等着。而且这边得出一个结论,他是变first in first out先进先出对不对?我阻塞了,有了,
我拿到了,我走,这是一个简单的,为什么先埋它一笔,因为后边redis有一个特征,他是
支持消息订阅的。
127.0.0.1:6379> rpush k1 a b c d e f g h a b c d
(integer) 12
127.0.0.1:6379> LLEN k1 统计长度
(integer) 12
127.0.0.1:6379> LTRIM k1 0 -1 删除两端元素 如果下标是最两端则没有数据可删除
OK
127.0.0.1:6379> LLEN k1
(integer) 12
127.0.0.1:6379> LTRIM k1 0 -2
OK
127.0.0.1:6379> LLEN k1
(integer) 11
127.0.0.1:6379> LTRIM k1 1 -2
OK
127.0.0.1:6379> LLEN k1
(integer) 9
127.0.0.1:6379>