Redis学习数据类型(三)之列表

Redis的列表(List)数据类型可以被看作简单的字符串列表。列表按照插入顺序排序。在操作Redis的列表时,可以将一个元素插入这个列表的头部和尾部。一个列表大约可以存2^32-1个元素。

1向列表中插入值

1.LPUSH命令:将多个值插入列表头部

命令格式:

LPUSH key value [value...]

LPUSH 命令用于将一个或多个value 值插人列表key 的头部。如果同时插入多个 value值,那么各个value 值将会按照从左到石的顺序依次插人表头。例如,对于空列表 list,执行命令 LPUSH list a b c,列表key 的值将是c b a。可以把列表想象成一只箱子,往里面装书(顺序是a b c ),拿书时从上往下拿,顾序就是c、b、a。学过数据结构的读者应该很清楚,这个列表就相当于一个栈。

当列表key不存在时,将会创建一个空列表,然后执行LPUSH命令。

如果key存在,但它不是列表类型,则执行LPUSH命令将会报错。

返回值:执行LPUSH命令后,返回列表长度。

2.RPUSH命令:将多个值插入列表尾部

命令格式:

RPUSH key value [value...]

RPUSH命令用于将一个或多个value值插入列表key的表尾。如果同时插入多个value值,那么各个value值将会按照从左到右的顺序依次插入表尾。比如,对于空列表list,执行RPUSH list a b c命令之后,列表key的值将是a b c。

返回值:执行RPUSH命令后,返回列表的长度。

3.LINSERT命令:插入一个值到列表中

命令格式:

LINSERT key BEFORE | AFTER pivot value

LINSERT命令用于向列表中插入一个值,也就是将值value插入列表key当中,这个值的位置在值pivot之前或之后。在列表key中,当pivot这个值不存在时,执行该命令无效。当列表key不存在时,key将被看为一个空列表,执行该命令无效。而当key不是列表类型时,将返回一个错误。

返回值:执行该命令,如果成功,则返回插入操作完成之后的列表长度。如果只有pivot不存在,则返回-1.而如果key不存在,或者是空列表,则返回0。

4.LPUSHX命令:将值插入到列表头部

命令格式:

LPUSHX key value

LPUSHX命令用于将value值插入列表key的头部,此时key必须存在,并且是列表类型的。LPUSHX命令与LPUSH命令相反,当key不存在时,

LPUSHX命令不会创建一个新的空列表,它什么也不做。

返回值:LPUSHX命令执行成功之后,返回列表key的长度。

5.RPUSHX命令:将值插入列表尾部

RPUSHX key value

RPUSHX命令用于当且仅当key存在并且是列表类型时,将value值插入列表key的表尾。RPUSHX命令与RPUSH命令恰好相反,当key不存在时,它什么也不做,也不会创建空列表。

返回值:执行RPUSHX命令后,返回列表key的长度。

6.LSET命令:修改列表元素值

命令格式:

LSET key index value

LSET 命令用于设置下标为index的列表key的值为value。当下标index参数超出范围时,将会返回错误;当列表key为空时,也会返回错误。

返回值:如果LSET操作成功,则返回OK;否则返回错误;

2 获取列表元素

1.LLEN命令:统计列表的长度

命令格式:

LLEN key

LLEN命令用于统计列表key的长度。当key不存在时,key将被视为空列表,返回0。当key不是列表类型时,返回一个错误。

返回值:执行该命令后,将会返回列表key的长度。

2.LINDEX命令:获取列表元素的值

命令格式:

LINDEX key index

LINDEX 命令用于获取列表key中下标为index的元素;0为第一个,-1为最后一个,-2为倒数第二个,以此类推。

返回值:当列表存在时,执行该命令后,返回列表中下标为index的元素。当index参数不在列表的范围之内(大于或小于列表范围)时,执行该命令后,将会返回nil;

3.LRANGE命令:获取列表指定区间内的元素

命令格式:

LRANGE key start end

LRANGE命令用于获取列表key指定区间内的元素,区间从start开始,到end结束。0是第一个元素,1是第二个元素,-1是最后一个,-2是倒数第二个。

返回值:返回一个包含指定区间内的元素的列表。

3删除列表元素

1.LPOP命令:返回并删除列表的头元素

命令格式:

LPOP key

LPOP命令用于返回列表key的头元素,同时把这个头元素删除。

返回值:执行该命令后,将会返回列表的头元素。如果key不存在,则将会返回nil。

2.RPOP命令:返回并删除列表的尾元素

命令格式:

RPOP key

RPOP命令用于返回列表key的尾元素,并把这个尾元素删除。

返回值:当列表key存在时,执行RPOP命令将会返回表尾的元素。当列表key不存在时,将会返回nil。

3.BLPOP命令:在指定时间内删除列表的头元素

命令格式:

BLPOP key [key...] timeout

BLPOP命令是列表的阻塞式弹出原语,它是命令LPOP的阻塞版本。当列表中没有任何元素key被弹出时,连接将被命令BLPOP阻塞,直到等待超时或有可弹出元素为止。当设定多个参数key时,将会按照参数key出现的先后顺序来一次检查各个列表,弹出第一个非空列表的头元素。

返回值:如果给定的列表为空,则返回nil。如果给定的列表不为空,则将会返回一个包含两个元素的列表,列表中的第一个元素是要被弹出元素所对应的key,第二个元素是被弹出元素的值。

BLPOP命令存在两种行为:阻塞行为和非阻塞行为。

阻塞行为:当所有给定的key都不存在或包含空列表时,该命令将会阻塞连接,值到等待超时,或者在另一个客户端中对给定的key执行RPUSH或LPUSH命令为止。其中timeout是一个以秒为单位的超时时间值,当timeout取值为0时,这个阻塞时间可以无线延长。

4.BRPOP命令:在指定时间内删除列表的尾元素

命令格式:

BRPOP key [key...] timeout

BRPOP命令是列表key的阻塞式命令。当给定列表内没有任何元素可以返回时,连接将被BRPOP命令阻塞,直到等待超时或被发现可返回的元素为止。BRPOP命令是RPOP命令阻塞版本。当同时给定多个参数key时,将会按照参数key的先后顺序检查各个列表,返回第一个非空列表的尾元素。

timeout参数用于设定时长。

返回值:如果在指定的timeout时间内没有返回任何元素,则将会返回nil和等待时长。而如果在timeout时间内返回一个列表,那么这个列表中的第一个元素表示被返回元素所属的key,第二个元素表示被返回元素的值。

5.LREM命令:删除指定格数的元素

命令格式:

LREM key count value

LREM命令用于根据参数count的值,删除列表key中与指定参数value相等的元素。

返回值:当列表key存在时,执行该命令后,返回被删除的元素数量。当列表key不存在时,就是一个空列表,命令始终返回0。

6.LTRLM命令:在指定区间内修剪列表

LTRIM key start stop

LTRIM命令用于对一个列表进行修建(trim),比如去除不必要的空格,让列表key只保留指定区间内的元素,不在这个区间内的元素将会被删除。

比如,执行命令LTRIM list 0 5,表示只保留列表list中的前六个元素,其余元素将会被删除。

参数start和stop的默认值都是0,用0表示列表中的第一个元素,用1表示列表中的第二个元素,以此类推。参数start和stop也可以是负数,用-1表示列表的最后一个元素,用-2表示列表中的倒数第二个元素,以此类推。

如果key不是列表类型的,则将会返回一个错误。

当参数start和stop的值超出列表的下标值时,不会引起错误。

如果参数start的值比列表下标的最大值还要大,或者start大于stop,那么执行LTRIM命令将会清空这个列表,返回一个空列表。

如果参数stop的值比列表下标的最大值还要大,则Redis将会stop的值作为这个列表下标的最大值。

返回值:返回OK表示LTRIM命令执行成功。

4移动列表

1.RPOPLPUSH命令:将列表元素移动到另一列表中

命令格式:

RPOPLPUSH source destination

RPOPLPUSH命令在一个原子时间内,将列表source中的最后一个元素弹出,并返回给客户端。这个被返回的元素将会插入列表destination中,作为该列表的头元素。当列表source不存在时,将会返回一个nil值元素,同时后面的操作将不会执行。如果列表source与destination相同,那么列表的尾元素将被移动到表头,并返回该元素。这种情况就是列表的旋转操作。

返回值:执行该命令后,返回被弹出的元素。

2.BRPOPLPUSH命令:在指定时间内移动列表元素到另一列表中

命令格式:

BRPOPLPUSH source destination timeout

BRPOPLPUSH命令是RPOPLPUSH命令的阻塞版本。当列表source不存在(为空)时,BRPOPLPUSH命令将阻塞连接,直到等待超时,或者另一个客户端对列表source执行RPUSH或LPUSH命令为止。当列表source不为空时,BRPOPLPUSH命令执行的效果和BRPOPLPUSH命令执行的效果一样。

参数timeout表示超时时间,单位为秒。当timeout值为0时,表示阻塞时间可以无限期延长。

返回值:如果在指定时间内,没有任何元素被弹出,则将会返回nil和等待时长。如果返回一个列表,那么列表中的第一个元素是被弹出元素的值,第二个元素是等待时长。

5列表模式

1.安全队列 Redis 的列表经常被看作一个队列,用于在不同程序之间有序交换消息。一个客户端通过LPUSHT 命令将一条消息放入这个队列中,然后开启另一一个客户瑞通过RPOP 或BRPOP 命令取由这个队列中等待时间最长的消息。但是,这个队列是不安全的,当一个客户端在取出一系消息之后遇到错误或其他原因导致客户端崩溃时,还没有处理完的消息就会丢失。 为了保证未处理完的消息不再丟失,可以使用命令RPOPLPUSH 水解决。RPOPLPUSR命令在返回一条消息的同时会将这系消息保存到分一个列表中,这样就保证了 没有处理完的消息不会丟失。在处理完这条消息之后,可以使用命令 LREM 从这个备份列表中将其删除。我们可以添加一个客户端来监视这个备份列表,这个容户端会自动将超过一定处理时间的消息备份到这个列表中,以此来保证消息不会丢失。

2.循环列表 使用 RPOPLPUSH 命会可以实现循环列表。使用相同的 key 作为 RPOPLPUSH 命令的两个参数,客户端采用逐个获取列表元素的方式,取出列表中的所有元素。这样就避免了像使用LRANGE 命令那样同时取出列表中的所有元素。当有多个客户端同时对同一个列表进行旋转操作来获取不同元素,直到所有元素被读取完,之后又开始循环时,这个循环列表可以正常工作。当有客户端向列表尾部添加新元素时,这个循环列表也能正常工作。基于以上两种情况,我们可以借助 Redis 实现服务器监控系统,实现在短时间内连续不断地处理一些消息。循环列表模式是安全的,它易于扩展,当遇到处理消息的客户端突然崩溃的情况时,消息也不会因此而丢失,等下一次循环时,其他客户端也能处理这些消息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qingqingyyds

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值