redis 系列11 列表对象

栏目: 数据库 · 发布时间: 6年前

内容简介:在第9篇中讲到了列表对象的编码可以是ziplist或者linkedlist。ziplist编码的列表对象使用压缩列表作为底层实现,每个压缩列表节点(entry)保存了一个列表元素。例如使用rpush命令将创建一个列表对象作为numbers键的值。通过上面查看底层数据结构并不是ziplist,而是quicklist结构。 该结构是在redis 3.2版本中新加的数据结构,用在列表的底层实现,由ziplist组成的双向链表。链表中的每一个节点都以压缩列表ziplist的结构保存着数据,而ziplist有多个e

一. 列表对象概述

在第9篇中讲到了列表对象的编码可以是ziplist或者linkedlist。ziplist编码的列表对象使用压缩列表作为底层实现,每个压缩列表节点(entry)保存了一个列表元素。例如使用rpush命令将创建一个列表对象作为numbers键的值。

    127.0.0.1:6379> rpush numbers 1 "three" 5
    (integer) 3
    127.0.0.1:6379> object encoding  numbers
    "quicklist"

通过上面查看底层数据结构并不是ziplist,而是quicklist结构。 该结构是在 redis 3.2版本中新加的数据结构,用在列表的底层实现,由ziplist组成的双向链表。链表中的每一个节点都以压缩列表ziplist的结构保存着数据,而ziplist有多个entry节点,保存着数据。相当与一个quicklist节点保存的是一片数据,而不再是一个数据。

例如:一个quicklist结构有4个quicklistNode节点,每个节点都保存着1个ziplist结构,每个ziplist的大小不超过8kb,ziplist的entry节点中的value成员保存着数据。以后在深入了解quicklist数据结构。

二. 列表对象命令

     -- rpush 命令可向list的右边(尾部)添加一个新元素,读出来就是(A,B,first)。
    127.0.0.1:6379> rpush mylist A
    (integer) 1
    127.0.0.1:6379> rpush mylist B
    (integer) 2
    127.0.0.1:6379> rpush mylist first
    (integer) 3
    
     -- lrange 命令获取列表指定范围内的元素,带有两个索引,一定范围的第一个和最后一个元素。-1表示最后一个元素,-2表示list中的倒数第二个元素,以此类推。下面是读出列表mylist。
    127.0.0.1:6379> lrange mylist 0 -1
    1) "A"
    2) "B"
    3) "first"

     -- lpush命令可向list的左边(头部)添加一个新元素,读出来就是(first,B,A)。
    127.0.0.1:6379> lpush mylist A
    (integer) 1
    127.0.0.1:6379> lpush mylist B
    (integer) 2
    127.0.0.1:6379> lpush mylist first
    (integer) 3
    127.0.0.1:6379> lrange mylist 0 -1
    1) "first"
    2) "B"
    3) "A"

     -- Blpop 命令移出第一个元素并返回列表的第一个元素. 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。下面是移除了每一个first元素。
    127.0.0.1:6379> blpop mylist 5
    1) "mylist"
    2) "first"
    127.0.0.1:6379> lrange mylist 0 -1
    1) "B"
    2) "A"

    --  Brpop 命令移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。下面二个元素,移除了最后一个。
    127.0.0.1:6379> lrange mylist 0 -1
    1) "B"
    2) "A"
    127.0.0.1:6379> brpop mylist 5
    1) "mylist"
    2) "A"
    127.0.0.1:6379> lrange mylist 0 -1
    1) "B"

    -- Brpoplpush 命令从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
    --  下面mylist2列表获取了mylist列表的一个元素
    127.0.0.1:6379> brpoplpush mylist mylist2 5000
    "B"  --弹出一个值, 移到了mylist2中,设置超时时间
    127.0.0.1:6379> lrange mylist 0 -1
    (empty list or set)  -- 空列表
    127.0.0.1:6379> lrange mylist2 0 -1
    1) "B" 
    2) "C"

    -- Lindex 命令用于通过索引获取列表中的元素。你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。下面获取mylist2的第一个元素。
    127.0.0.1:6379> lrange mylist2 0 -1
    1) "B"
    2) "C"
    127.0.0.1:6379> lindex mylist2 0
    "B"

    -- Linsert 命令用于在列表的元素前或者后插入元素。格式: LINSERT key BEFORE|AFTER pivot value, 下面将A插入到已有C元素的前面。
     127.0.0.1:6379> linsert mylist2 before "C" "A" 
    (integer) 3
    127.0.0.1:6379> lrange mylist2 0 -1
    1) "B"
    2) "A"
    3) "C"
    --Llen 命令用于返回列表的长度。
    127.0.0.1:6379> llen mylist2
    (integer) 3
    --Lpop 命令用于移除并返回列表的第一个元素
    127.0.0.1:6379> lpop mylist2
    "B"
    127.0.0.1:6379> lrange mylist2 0 -1
    1) "A"
    2) "C"

   --Lpush 命令将一个或多个值插入到列表头部, 上面有单个元素添加,还可以是多个元素添加,这里不在演示。
  --Lpushx 将一个或多个值插入到已存在的列表头部。key的列表中必须要元素。
    127.0.0.1:6379> lpushx mylist "A"
    (integer) 0  --添加失败,因为mylist是空列表
    127.0.0.1:6379> lrange mylist 0 -1
    (empty list or set)
    127.0.0.1:6379> lpush mylist A B
    (integer) 2
    127.0.0.1:6379> lpushx mylist C
    (integer) 3 -- 添加成功。
    127.0.0.1:6379> lrange mylist 0 -1
    1) "C"
    2) "B"
    3) "A"

    --  Lrem 根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素。 意思是列表中元素与value相等的,移除count个。
    127.0.0.1:6379> lpush my "one" "two" "three" "one"
    (integer) 4
    127.0.0.1:6379> lrange my 0 -1
    1) "one"
    2) "three"
    3) "two"
    4) "one"
    127.0.0.1:6379> lrem my 1 "one"  --移除1个one元素
    (integer) 1
    127.0.0.1:6379> lrange my 0 -1
    1) "three"
    2) "two"
    3) "one"

    -- Lset 通过索引来设置元素的值。
    127.0.0.1:6379> lrange my 0 -1
    1) "three"
    2) "two"
    3) "one"
    127.0.0.1:6379> lset my 2 "four" 
    OK  -- 第三个元素的值从onw 改为了four
    127.0.0.1:6379> lrange my 0 -1
    1) "three"
    2) "two"
    3) "four"

    --Ltrim 对一个列表只保留指定区间内的元素。不在指定区间之内的元素都将被删除。下标 0 表示列表的第一个元素,以 1 表示列表的第二个元素。 格式 LTRIM KEY_NAME START STOP
    127.0.0.1:6379> lrange my 0 -1
    1) "three"
    2) "two"
    3) "four"
    127.0.0.1:6379> ltrim my 1 -1
    OK  -- 第一个元素将被删除
    127.0.0.1:6379> lrange my 0 -1
    1) "two"
    2) "four"

    -- Rpop 命令用于移除最后一个元素,并返回该元素.
    127.0.0.1:6379> lrange my 0 -1
    1) "two"
    2) "four"
    127.0.0.1:6379> rpop my
    "four" -- 移除最后一个元素
    127.0.0.1:6379> lrange my 0 -1
    1) "two"
    
其它:    
--Rpoplpush 命令用于移除列表的最后一个元素,并将该元素添加到另一个列表并返回。
--Rpush 命令用于将一个或多个值插入到列表的尾部(最右边)。上面有单个元素添加,还可以是多个元素添加,这里不在演示。
--Rpushx 命令用于将一个或多个值插入到已存在的列表尾部(最右边)


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

图解设计模式

图解设计模式

结城浩 / 杨文轩 / 人民邮电出版社 / 2017-1-1 / CNY 79.00

原版连续畅销12年、重印25次! 194张图表 + Java示例代码 = 轻松理解GoF的23种设计模式 《程序员的数学》《数学女孩》作者结城浩又一力作 ◆图文并茂 194张图表(包括57张UML类图)穿插文中,帮助理解各设计模式 ◆通俗易懂 用浅显的语言逐一讲解23种设计模式,读完此书会发现GoF书不再晦涩难懂 ◆专业实用 编写了Java程序代码来......一起来看看 《图解设计模式》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

html转js在线工具
html转js在线工具

html转js在线工具