美文网首页Redis
Redis 笔记(五)-List 列表类型详解

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

作者: yjtuuige | 来源:发表于2021-08-08 13:46 被阅读0次
    • 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

    相关文章

      网友评论

        本文标题:Redis 笔记(五)-List 列表类型详解

        本文链接:https://www.haomeiwen.com/subject/kftivltx.html