redis_list
list
- 特点:
- 1:列表中的元素是有序的,可以通过下标获取某个元素值[下标从0开始
- 2:列表中的元素是可以重复的
- 列表的五种操作类型
-
1:添加操作
-
从右边插入元素 rpush key value [value ...]
127.0.0.1:6379> rpush listkey c b a (integer) 3 127.0.0.1:6379> lrange listkey 0 -1 #从左到右获取列表的所有元素 1) "c" 2) "b" 3) "a" #O(k),k是元素的个数
-
从左边插入元素 lpush key value [value ...] #O(k),k是元素的个数
-
向某个元素前或者后 --插入元素 linsert key before|after pivot value
-
linsert命令会从列表中找到等于pivot的元素,在其前|后插入元素 --返回当前列表的长度
127.0.0.1:6379> linsert listkey before b java #在listkey列表中的元素b前面插入java元素 (integer) 4 127.0.0.1:6379> lrange listkey 0 -1 1) "c" 2) "java" 3) "b" 4) "a" # O(n),n是元素prvot距离列表头或尾部的距离
-
-
2:删除
-
从列表左侧弹出元素 lpop key
127.0.0.1:6379> lrange listkey 0 -1 1) "c" 2) "java" 3) "b" 4) "a" 127.0.0.1:6379> lpop listkey "c"
-
从列表右侧弹出元素 rpop key
-
删除指定元素 lrem key count value
- count>0:从左到右,删除最多count个元素
- count<0:从右到左,删除最多count 绝对值个元素
- count=0:删除所有
127.0.0.1:6379> lrange listkey 0 -1 1) "a" 2) "a" 3) "a" 4) "a" 5) "a" 6) "java" 7) "b" 8) "a" 127.0.0.1:6379> lrem listkey 4 a #从左边开始删除4个为a的元素 (integer) 4 127.0.0.1:6379> lrange listkey 0 -1 1) "a" 2) "java" 3) "b" 4) "a" # O(n),n是列表长度
-
按照索引范围保存[修剪]元素 ltrim key start end
127.0.0.1:6379> lrange listkey 0 -1 1) "a" 2) "java" 3) "b" 4) "a" 127.0.0.1:6379> ltrim listkey 1 3 OK 127.0.0.1:6379> lrange listkey 0 -1 1) "java" 2) "b" 3) "a" #O(n),n是要裁剪的元素总数
-
-
3:修改
-
修改指定索引下标的元素 lset key index newvalue
127.0.0.1:6379> lrange listkey 0 -1 1) "java" 2) "b" 3) "a" 127.0.0.1:6379> lset listkey 2 python OK 127.0.0.1:6379> lrange listkey 0 -1 1) "java" 2) "b" 3) "python" #O(n)是索引的偏移量
-
-
4:查找
-
获取列表指定索引范围所有的元素 lrange key start end
- 下标从左到右 0到N-1 ,从右到左是 -1 到 -N
- start和end都包括,双闭区间-----和大多数编程语言不一样
127.0.0.1:6379> lrange listkey 0 -1 1) "java" 2) "b" 3) "a" #O(s+n):s是start的偏移量,n是start到end的范围
-
获取列表指定索引下标的元素 lindex key index
127.0.0.1:6379> lindex listkey -1 "python"
-
获取列表的长度 llen
127.0.0.1:6379> llen listkey (integer) 3
-
-
5 阻塞操作
-
blpop key [key....] timeout秒
-
brpop key [key ...] timeout
-
1:列表为空 127.0.0.1:6379> rpush list:test a b c d #添加 (integer) 4 127.0.0.1:6379> lpop list:test "a" 127.0.0.1:6379> lpop list:test "b" 127.0.0.1:6379> lpop list:test "c" 127.0.0.1:6379> lpop list:test "d" 127.0.0.1:6379> lpop list:test #依次弹出,直到为空 (nil) 127.0.0.1:6379> blpop list:test 3 #timeout=3.3秒后返回 (nil) (3.09s) 127.0.0.1:6379> blpop list:test 0 #timeout =0,一直阻塞等待下去
-
2:列表不为空 127.0.0.1:6379> lrange list:test 0 -1 1) "b" 2) "a" 127.0.0.1:6379> blpop list:test 3 #列表不为空,则立即返回 1) "list:test" 2) "b"
-
-
应用口诀:
-
lpush + lpop = Stack[栈]
-
lpush +rpop = Queue[队列]
-
lpush + ltrim = Capped Collection(有限集合)
-
lpush +brpop ==Message Queue(消息队列)