Redis

Redis第6️⃣课 list

2019-04-28  本文已影响0人  小超_8b2f

一、特点

  1. 有序
  2. 可以重复
  3. 左右两边插入弹出

API

命令 解释 时间复杂度
rpush key val1 [val2] 从列表右端插入值(1-N个) o(1~n)
lpush key val1 [val2] 从列表左端插入值(1-N个) o(1~n)
rpushx key value 为已存在的列表添加值 o(1)
rpushx key value 将一个值插入到已存在的列表头部 o(1)
linsert key before | after val newVal 从列表右端插入值(1-N个) o(n)
lpop key 从列表左侧弹出一个item o(1)
rpop key 从列表右侧弹出一个item o(1)
lrem key n val (1) n > 0 从左往右删,最多删n个val
(2) n < 0 从右到左删,最多删n个val
(3) n = 0 删除所有值为val的项
o(n)
ltrim key start end
[start, end]
按照索引范围修剪列表 o(n)
lrange key start end
(闭区间包含end)
获取列表指定索引范围的所有item
(1) 正向索引: 0 到 n-1
(2) 负向索引:-1 到 -n
o(n)
lindex key index 获取列表指定索引的item o(n)
llen key 获取列表长度 o(1)
lset key index newVal 设置列表指定索引值为newVal o(n)
blpop key timeout lpop的阻塞版本,生产者-消费者
timeout阻塞时间,=0时不阻塞
o(1)
brpop key timeout 移出并获取列表的最后一个元素,
如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
o(1)
rpoplpush from to 移除列表的最后一个元素,并将该元素添加到另一个列表并返回


Tips

  1. lpush + lpop = Stack
  2. lpush + rpop = Queue
  3. lpush + ltrim = Capped Collection
  4. lpush + brpop = Message Queue


遍历集合

可以用lrange 做分页

127.0.0.1:6379> lpush list1 7 6 5 4 3 2 1
(integer) 7
127.0.0.1:6379> lrange list1 0 10 # 遍历所有:将end设个很大的数
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
127.0.0.1:6379> lrange list1 0 2  # 取某范围
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> lrange list1 1 -1  #start从左侧下标1取,一直到右侧数第1个
1) "2"
2) "3"
3) "4"
4) "5"
5) "6"
6) "7"
127.0.0.1:6379> lrange list1 0 -1 #获取所有元素:start从左侧下标0取,一直到右侧数第1个
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
127.0.0.1:6379> lrange list1 5 -5 #获取从左数下标是5的元素一直到从右数第5个元素(无交集)
(empty list or set)
127.0.0.1:6379> lrange list1 -5 5 #获取从右侧数第5个元素,一直到从左数下标是5的元素
1) "3"
2) "4"
3) "5"
4) "6"
linsert 针对的是集合中首次出现的元素的前后进行插入
127.0.0.1:6379> rpush list2 a b c d #初始化list为a b c d
(integer) 4
127.0.0.1:6379> lrange list2 0 -1  #查看list
1) "a"
2) "b"
3) "c"
4) "d"
127.0.0.1:6379> linsert list2 before c c #在第一个c元素的前面插入c
(integer) 5
127.0.0.1:6379> lrange list2 0 -1  #查看list
1) "a"
2) "b"
3) "c"
4) "c"
5) "d"
127.0.0.1:6379> linsert list2 before c java #在第一个c元素的前面插入java
(integer) 6
127.0.0.1:6379> lrange list2 0 -1  #查看list
1) "a"
2) "b"
3) "java"
4) "c"
5) "c"
6) "d"
127.0.0.1:6379> linsert list2 after c php #在第一个c元素的后面插入php
(integer) 7
127.0.0.1:6379> lrange list2 0 -1
1) "a"
2) "b"
3) "java"
4) "c"
5) "php"
6) "c"
7) "d"

删除:lrem

127.0.0.1:6379> rpush list1 1 2 3 4 5 6 7
(integer) 7
127.0.0.1:6379> lrange list1 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
127.0.0.1:6379> lrem list1 3 5
(integer) 1
127.0.0.1:6379> lrange list1 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "6"
6) "7"
127.0.0.1:6379> rpush list2 a b c d b c a c b
(integer) 9
127.0.0.1:6379> lrem list2 2 b
(integer) 2
127.0.0.1:6379> lrange list2 0 -1
1) "a"
2) "c"
3) "d"
4) "c"
5) "a"
6) "c"
7) "b"
127.0.0.1:6379> lrem list2 -2 c
(integer) 2
127.0.0.1:6379> lrange list2 0 -1
1) "a"
2) "c"
3) "d"
4) "a"
5) "b"
127.0.0.1:6379> lrem list 0 a
(integer) 0
127.0.0.1:6379> lrem list2 0 a
(integer) 2
127.0.0.1:6379> lrange list2 0 -1
1) "c"
2) "d"
3) "b"

ltrim :变成子集

127.0.0.1:6379> lrange list1 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "6"
6) "7"
127.0.0.1:6379> ltrim list1 1 -2
OK
127.0.0.1:6379> lrange list1 0 -1
1) "2"
2) "3"
3) "4"
4) "6"
127.0.0.1:6379> ltrim list1 1 3
OK
127.0.0.1:6379> lrange list1 0 -1
1) "3"
2) "4"
3) "6"

lindex list n :获取操作 list.get(n)
127.0.0.1:6379> lrange list1 0 -1
1) "3"
2) "4"
3) "6"
127.0.0.1:6379> lindex list1 1
"4"
127.0.0.1:6379> lindex list1 2
"6"
127.0.0.1:6379>

lset:更新操作

127.0.0.1:6379> lrange list1 0 -1
1) "3"
2) "4"
3) "6"
127.0.0.1:6379> lset list1 0 java
OK
127.0.0.1:6379> lrange list1 0 -1
1) "java"
2) "4"
3) "6"
127.0.0.1:6379> lset list1 5 java
(error) ERR index out of range
127.0.0.1:6379> lset list1 3 php
(error) ERR index out of range
127.0.0.1:6379> rpop list1
"6"
127.0.0.1:6379> lrange list1 0 -1
1) "java"
2) "4"
127.0.0.1:6379> lpop list1
"java"
127.0.0.1:6379> lrange list1 0 -1
1) "4"

list存在才添加元素

127.0.0.1:6379> lrange list1 0 -1
1) "4"
127.0.0.1:6379> lpushx list1 hello
(integer) 2
127.0.0.1:6379> lrange list1 0 -1
1) "hello"
2) "4"
127.0.0.1:6379> rpush list1 world
(integer) 3
127.0.0.1:6379> lrange list1 0 -1
1) "hello"
2) "4"
3) "world"
127.0.0.1:6379> rpush list3 hello world
(integer) 2
127.0.0.1:6379> rpushx list4 hello world
(integer) 0
上一篇 下一篇

猜你喜欢

热点阅读