Redis 笔记(五)-List 列表类型详解

  • list 列表:相当于 javalist 集合,特点:元素有序,且可以重复
  • 内存存储模型:(可以成为 队列阻塞队列
  • 常用操作指令:所有的 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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容