redis的list类型基本操作
1、首先连上你的redis
以下一些命令很简单,或者执行命令后效果也无法体现的就没有进行截图展示
2、list相关操作
说明:redis的列表是简单的字符串列表,按照插入顺序排序。它的底层实际是个双向链表,对两端的操作性能很高。通过索引下标操作中间的元素性能较差。
-------------------左操作开始-------------------
将一个或多个值插入列表头部:lpush listkey v1 v2 v3
获取列表指定范围内的数据:lrange listkey 0 -1
说明:lrange listkey 0 -1
命令的含义是,取得listkey的所有元素。
提示:lrange语法为:lrange key start stop。当stop大于key所存储的值的长度时,此命令会返回所有元素。不会返回多余的空数据。
start可以用负数。-1表示列表中的最后一个元素,-2表示倒数第二个元素,于是lrange listkey 0 2
=lrange listkey -3 -1
将一个值或多个值插入到已存在的列表头部:lpushx listkey v4 v5
提示:此命令执行,如果key不存在,将不会插入成功
移出并获取列表的第一个元素: lpop keyone
提示:如果lpop的操作key不存在时,将返回nil
6.2.0版本开始支持count参数,支持返回多个元素
当设置的count大于key中所剩值个数时,返回的就是key中剩余的值。通俗来讲就是:返回列表中所能提供的所有元素
移除列表元素:lrem keyone 1 v1
LREM的语法为LREM key count VALUE
count:要移除的key中value等于参数VALUE的个数。
count值的定义:
count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 。
count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。
count = 0 : 移除表中所有与 VALUE 相等的值。
VALUE:被比较的作为等于的值
LREM的返回值:返回的是等于VALUE值被删除的个数,【返回值 <= count】
提示:如果我的命令中count值=2,但是key中只有一个值等于VALUE,于是只被删除了一个元素,所以返回值为1
如果未找到与VALUE相等的值,将返回-1
获取列表长度:llen keyone
通过索引获取列表中的元素:lindex keytwo 0
提示:当keytwo中元素为3个时,
lindex keytwo 0
与lindex keytwo -3
是一样的效果
在列表的元素的前或后插入元素:linsert keytwo before t2 t1.5
以上命令的含义:在值t2的前面插入值t1.5
LINSERT的语法结构为:linsert key BEFORE|AFTER pivot element
pivot的含义:支点,基准的意思,linsert插入值时以pivot作为基准值进行判断插入位置
LINSERT的返回值:如果命令执行成功,返回插入操作完成之后,列表的长度。 如果没有找到指定元素 ,返回 -1 。 如果 key 不存在或为空列表,返回 0 。
通过索引设置列表元素的值:lset keytwo 0 t3seted
命令的含义:设置keytwo索引为0的元素为t3seted
LSET的语法为:lset key index element
让列表只保留指定区间内的元素:ltrim keytwo 0 2
LTRIM的语法为:ltrim key start stop
提示:
ltrim keytwo 0 2
与ltrim keytwo -4 -2
是等效的,-1代表最后一个元素,依次类推就行
-------------------左操作结束-------------------
-------------------右操作开始-------------------
从尾部放入元素:rpush keytwo t0
将一个或多个值插入到已经存在的列表尾部:rpushx keytwo t00 t000
类比lpushx命令
移出并获取列表最后一个元素:rpop keytwo
提示:6.2.0版本开始支持count参数,支持返回多个元素
移出列表的最后一个元素,并将该元素添加到另一个列表并返回:rpoplpush keytwo keytwo
命令含义:将keytwo的最后一个元素取出,头插入到keytwo中
RPOPLPUSH的语法为:rpoplpush source destination
source:原列表
destination:目的列表
-------------------右操作结束-------------------
-------------------阻塞原语开始-------------------
移出并获取列表的第一个元素,如果key不存在或为空列表,则阻塞,直到超时:blpop keyone keytwo 100
上述命令的含义:移出列表keyone中的第一个元素,如果keyone不存在或空列表,则执行keytwo列表,如果两个列表都为空,则等待超时
BLPOP的返回值:如果列表为空(超时后),返回一个 nil 。否则,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key ,第二个元素是被弹出元素的值。
BLPOP的语法:blpop key [key ...] timeout
timeout超时时间:以秒为单位,如果设置为0,则表示无限期等待
移出并获取列表的最后一个元素,如果key不存在或为空列表,则阻塞,直到超时:brpop keyone keytwo 100
弹出列表的最后一个元素,将弹出的元素左插入到另一个列表中并返回它:brpoplpush keyone keyone 100
BRPOPLPUSH的语法为:brpoplpush source destination timeout
提示:与rpoplpush命令的区别在于,此命令可以阻塞。阻塞的含义就是,当阻塞期间你的客户端不能执行命令,只能等待超时。
-------------------阻塞原语结束-------------------
3.总结
1、列表的一些命令应该怎么记呢?本人的一些概括如下:
作为一个数据结构,而且是双向链表,它应该有的一些函数为:
- 返回列表中的长度:
对应LLEN命令
- 从链表头部插入元素:
对应LPUSH命令
- 弹出链表的头部元素:
对应LPOP命令
- 从链表尾部插入元素:
对应RPUSH命令
- 弹出链表尾部元素:
对应RPOP命令
- 插入元素:
对应LINSERT命令
- 替换某个元素(或下标)的值:
对应LSET命令
- 删除某个元素(或下标)的值:
对应LREM命令
- 获取某个元素(或下标)的值:
对应LINDEX命令
首先我们记住这些基础命令,然后我们再结合应用场景会用到一些高级命令,比如:
LRANGE:返回列表中某块区域的子列表
LTRIM:让列表只留下指定区间内到元素
RPOPLPUSH:弹出尾部元素插入到另一个列表的头部