Fork me on GitHub

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 0lindex 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 2ltrim 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:弹出尾部元素插入到另一个列表的头部

posted @ 2022-10-01 17:53  三脚半猫  阅读(2739)  评论(0编辑  收藏  举报