redis--list

1. 介绍

在Redis中,List类型是==按照插入顺序排序的字符串链表==。和数据结构中的普通链表一样,我们可以在其==头部(left)和尾部(right)==添加新的元素。在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。List中可以包含的最大元素数量是==4294967295==。

从元素插入和删除的效率视角来看,如果我们是在链表的两头插入或删除元素,这将会是非常高效的操作,即使链表中已经存储了百万条记录,该操作也可以在常量时间内完成。然而需要说明的是,如果元素插入或删除操作是作用于链表中间,那将会是非常低效的。

2. 命令

2.1 头部增加

命令:==LPUSH key value [value1 ....]==

命令说明:指定Key的list的==头部==插入values.如果key不存在,那么会创建映射关系,然后在插入。如果key对应的value不是list,那么执行失败。

返回值:插入后,list的元素数量。

image-20200715185948780

2.2 尾部增加

命令:==RPUSH key value [value ...]==

命令说明:指定key的list的尾部插入values.如果key不存在,那么会创建映射关系,然后在插入。如果key对应的value不是list,那么执行失败。

返回值:插入后,list的元素数量。

image-20200715190436688

2.3 头部存在增加

命令:==LPUSHX key value==

命令说明:当指定key存在时,会尝试在key对应的list的头部增加value,否则什么也不做。

返回值:插入后,listy的元素的数量。

image-20200715190848652

2.4 尾部存在增加

命令:==RPUSHX key value==

命令说明:当指定key存在时,会尝试在key对应的list的尾部增加value,否则什么也不做。

返回值:插入后,list的元素的数量。

image-20200715191119763

2.5 头部获取

命令:==LPOP key==

命令说明:获取指定key对应的list的头部元素,并将该元素从list中取出。如果key不存在,返回Nil,如果key对应的value不是list则执行异常。

返回值:key对应的list的头部元素。

image-20200715192721698

2.6 尾部获取

命令:==RPOP key==

命令说明:获取指定key对应的list的尾部元素,并将该元素从list中取出。如果key不存在,返回Nil,如果key对应的value不是list则执行异常。

返回值:key对应的list的尾部元素。

image-20200715192743699

2.7 统计元素个数

命令:==LLEN key==

命令说明:统计指定key对应的list的数量。如果key不存在,那么返回0。如果key对应的value不是list,那么执行异常。

返回值:key对应的list的元素个数。

image-20200715193628321

2.8 获取指定范围的元素

命令:==LRANGE key start end==

命令说明:获取指定key对应的list的指定范围的元素。start为0表示list的头部,-1表示尾部,-2表示倒数第二个元素。end和start相同。如果start大于list的length,那么返回空列表;如果end大于listt的length,那么返回剩余列表。==list元素不会移除==

返回值:符合要求的元素组成的list.

image-20200715194335132

2.9 移除指定值

命令:==LREM key count value==

命令说明:首先获取指定key的list,然后遍历list,如果list的元素值等于value,那么就移除,如果移除的元素个数等于count,那么就停止。==count大于0,从头开始遍历,从前往后移除;如果count等于0,那么删除list内元素等于value的所有元素,移除所有;如果count小于0,那么从尾部开始遍历,从后往前移除。==

返回值:返回移除的元素的数量。如果key不存在,返回0.

image-20200715195106901

2.10 设置指定索引的值

命令:==LSET key index value==

命令说明:设置指定key的list的index位置的元素为value.==index大于0表示从头开始,index小于0表示从尾开始,index等于0表示头。==如果index溢出,执行异常。

返回值:OK

image-20200715195613850
image-20200715195723722
image-20200715195839494

2.11 获取指定索引的值

命令:==LINDEX key index==

命令说明:获取指定key的list的指定index的元素。==index等于0表示头,index大于0表示从头开始,index小于0表示从尾开始。==如果key对应的value不是list,那么执行异常。

返回值:指定key的list的指定的元素,或者Nil(key不存在)

image-20200715202038961

2.12 保留指定范围的元素

命令:==LTRIM key start end==

命令说明:移除指定key的list的start和end之外的元素。只保留指定范围的元素。==start和end都是数值,0表示头,大于0表示从头开始,小于0表示从尾开始。==如果start大于end,移除key的list的全部元素,返回空列表;如果start大于list的length,那么移除全部元素。如果end大于listt的length,那么表示移除start前面的元素。

返回值:OK

image-20200715200743345
image-20200715200839556
image-20200715200951901

2.13 插入

命令:==LINSERT key BEFORE|AFTER pivot value==

命令说明:向指定key的list的指定元素pivot的前面或者后面插入value.如果key不存在,不做任何操作。如果key的value不是list,执行异常。

返回值:成功:插入后key对应的list的元素数量;没找到pivot:返回-1;key不存在:返回0.

image-20200715202702709

2.14 元素转移

命令:==RPOPLPUSH source dest==

命令说明:从source 的尾部取出一个元素,然后放到dest的头部。如果source不存在,则不做任何操作。如果source等于dest,则表示将元素从尾放到头。==先执行RPOP,在执行LPUSH,保证原子性。==如果source活着dest中存在不是list的映射,执行异常。

返回值:操作的元素。

image-20200715203406466

3. 示例

3.1 消息队列

创建list,生产者从头部增加,消费者从尾部取出。

image

3.2 消息队列--确认模式

创建list,生产者从头部增加,消费者从尾部取出并放到临时队列中,消费者完全消费后,在将消息从临时队列中取出。(使用移除指定值,移除1次,从头开始)

image-20200715204242446

3.3 消息队列--最大长度

创建list,使用保留指定范围的元素,可以保证list的长度恒定。

image-20200715204632146

你可能感兴趣的:(redis--list)