Redis 笔记(五)-List 列表类型详解
2021-08-08 本文已影响0人
yjtuuige
-
list
列表:相当于java
中list
集合,特点:元素有序,且可以重复 - 内存存储模型:(可以成为 栈、队列、阻塞队列)
- 常用操作指令:所有的
List
命令一般是以L
开头,redis
命令不区分大小写
命令 | 说明 |
---|---|
lpush | 将某个值加入到一个key列表头部 |
lpushx | 同lpush,但是必须要保证这个key存在 |
rpush | 将某个值加入到一个key列表末尾 |
rpushx | 同rpush,但是必须要保证这个key存在 |
lpop | 返回和移除列表左边的第一个元素 |
rpop | 返回和移除列表右边的第一个元素 |
lrange | 获取某一个下标区间内的元素 |
llen | 获取列表元素个数 |
lset | 设置某一个指定索引的值(索引必须存在) |
lindex | 获取某一个指定索引位置的元素 |
lrem | 删除重复元素 |
ltrim | 保留列表中特定区间内的元素 |
linsert | 在某一个元素之前,之后插入新元素 |
- 插入命令:
lpush
左插入,rpush
右插入,lrange
获取值
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 # 获取list中值
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> lrange list 0 1 # 通过区间获取具体的值,最左边为 0
1) "three"
2) "two"
127.0.0.1:6379> rpush list right # 将一个值或者多个值,插入到列表尾部 (右)
(integer) 4
127.0.0.1:6379> lrange list 0 -1 # 获取 list 中值,rpush 插入的值在列表尾部
1) "three"
2) "two"
3) "one"
4) "right"
127.0.0.1:6379>
- 移除命令:
lpop
移除list
的第一个元素(左:头部) ,rpop
,移除list
的最后一个元素(右:尾部)
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "right"
127.0.0.1:6379> lpop list # 移除 list 的第一个元素
"three"
127.0.0.1:6379> rpop list # 移除 list 的最后一个元素
"right"
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
- 获取指定位置元素值:
lindex
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> lindex list 0 # 通过下标获得 list 中的某一个值
"two"
127.0.0.1:6379> lindex list 1
"one"
- 返回列表的长度:
llen
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> llen list # 返回列表的长度
(integer) 3
- 移除指定的值:
lrem
(如:取消关注uid
)
127.0.0.1:6379> lpush list three # 在列表中添加一个重复的值
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "three"
3) "two"
4) "one"
127.0.0.1:6379> lrem list 1 one # 移除 list 集合中指定个数的 value,精确匹配
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "three"
3) "two"
127.0.0.1:6379> lrem list 1 three
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> lrem list 2 three # 移除列表中的 2 个 值
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "two"
- 修剪、截断:
ltrim
127.0.0.1:6379> rpush list v1
(integer) 1
127.0.0.1:6379> rpush list v2
(integer) 2
127.0.0.1:6379> rpush list v3
(integer) 3
127.0.0.1:6379> rpush list v4
(integer) 4
127.0.0.1:6379> ltrim list 1 2 # 通过下标截取指定的长度,这个list 已经被改变了,截断了只剩下截取的元素
OK
127.0.0.1:6379> lrange list 0 -1
1) "v2"
2) "v3"
- 移除列表的最后一个元素,到新的列表中:
rpoplpush
127.0.0.1:6379> lpush list a1
(integer) 1
127.0.0.1:6379> lpush list a2
(integer) 2
127.0.0.1:6379> lpush list a3
(integer) 3
127.0.0.1:6379> lpush list a4
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "a4"
2) "a3"
3) "a2"
4) "a1"
127.0.0.1:6379> rpoplpush list newlist # 移除列表的最后一个元素,到新的列表中
"a1"
127.0.0.1:6379> lrange list 0 -1 # 查看原来的列表
1) "a4"
2) "a3"
3) "a2"
127.0.0.1:6379> lrange newlist 0 -1 # 查看目标列表中,存在移动的值
1) "a1"
- 更新指定索引的值(索引必须存在):
lset
127.0.0.1:6379> exists list # 判断 list 是否存在
(integer) 0
127.0.0.1:6379> lset list 0 item # 如果不存在,去更新列表就会报错
(error) ERR no such key
127.0.0.1:6379> lpush list v1
(integer) 1
127.0.0.1:6379> lrange list 0 0
1) "v1"
127.0.0.1:6379> lset list 0 item # 如果存在,更新当前下标的值
OK
127.0.0.1:6379> lrange list 0 -1
1) "item"
127.0.0.1:6379> lset list 1 v2 # 如果不存在,则会报错
(error) ERR index out of range
- 插入元素(在某一个元素之前,或之后):
linsert
127.0.0.1:6379> lpush list v1
(integer) 1
127.0.0.1:6379> lpush list v2
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "v2"
2) "v1"
127.0.0.1:6379> linsert list before v1 ins # 在 v1 元素前,插入 ins
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "v2"
2) "ins"
3) "v1"
127.0.0.1:6379> linsert list after v1 new # 在 v1 元素后,插入 new
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "v2"
2) "ins"
3) "v1"
4) "new"
小结:
1、list
实际上是一个链表,before Node after
, left
, right
都可以插入值
2、如果 key
不存在,则创建新的链表
3、如果 key
存在,新增内容
4、如果移除了所有值(空链表),也代表不存在
5、在两边插入或者改动值,效率最高!修改中间元素,效率相对较低
消息队列:左入右出(lpush rpop
)、栈:左入左出(lpush lpop
)