Redis--数据结构--List
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的元素数量。
2.2 尾部增加
命令:RPUSH key value [value …]
命令说明:指定key的list的尾部插入values.如果key不存在,那么会创建映射关系,然后在插入。如果key对应的value不是list,那么执行失败。
返回值:插入后,list的元素数量。
2.3 头部存在增加
命令:LPUSHX key value
命令说明:当指定key存在时,会尝试在key对应的list的头部增加value,否则什么也不做。
返回值:插入后,listy的元素的数量。
2.4 尾部存在增加
命令:RPUSHX key value
命令说明:当指定key存在时,会尝试在key对应的list的尾部增加value,否则什么也不做。
返回值:插入后,list的元素的数量。
2.5 头部获取
命令:LPOP key
命令说明:获取指定key对应的list的头部元素,并将该元素从list中取出。如果key不存在,返回Nil,如果key对应的value不是list则执行异常。
返回值:key对应的list的头部元素。
2.6 尾部获取
命令:RPOP key
命令说明:获取指定key对应的list的尾部元素,并将该元素从list中取出。如果key不存在,返回Nil,如果key对应的value不是list则执行异常。
返回值:key对应的list的尾部元素。
2.7 统计元素个数
命令:LLEN key
命令说明:统计指定key对应的list的数量。如果key不存在,那么返回0。如果key对应的value不是list,那么执行异常。
返回值:key对应的list的元素个数。
2.8 获取指定范围的元素
命令:LRANGE key start end
命令说明:获取指定key对应的list的指定范围的元素。start为0表示list的头部,-1表示尾部,-2表示倒数第二个元素。end和start相同。如果start大于list的length,那么返回空列表;如果end大于listt的length,那么返回剩余列表。list元素不会移除
返回值:符合要求的元素组成的list.
2.9 移除指定值
命令:LREM key count value
命令说明:首先获取指定key的list,然后遍历list,如果list的元素值等于value,那么就移除,如果移除的元素个数等于count,那么就停止。count大于0,从头开始遍历,从前往后移除;如果count等于0,那么删除list内元素等于value的所有元素,移除所有;如果count小于0,那么从尾部开始遍历,从后往前移除。
返回值:返回移除的元素的数量。如果key不存在,返回0.
2.10 设置指定索引的值
命令:LSET key index value
命令说明:设置指定key的list的index位置的元素为value.==index大于0表示从头开始,index小于0表示从尾开始,index等于0表示头。==如果index溢出,执行异常。
返回值:OK
2.11 获取指定索引的值
命令:LINDEX key index
命令说明:获取指定key的list的指定index的元素。==index等于0表示头,index大于0表示从头开始,index小于0表示从尾开始。==如果key对应的value不是list,那么执行异常。
返回值:指定key的list的指定的元素,或者Nil(key不存在)
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
2.13 插入
命令:LINSERT key BEFORE|AFTER pivot value
命令说明:向指定key的list的指定元素pivot的前面或者后面插入value.如果key不存在,不做任何操作。如果key的value不是list,执行异常。
返回值:成功:插入后key对应的list的元素数量;没找到pivot:返回-1;key不存在:返回0.
2.14 元素转移
命令:RPOPLPUSH source dest
命令说明:从source 的尾部取出一个元素,然后放到dest的头部。如果source不存在,则不做任何操作。如果source等于dest,则表示将元素从尾放到头。==先执行RPOP,在执行LPUSH,保证原子性。==如果source活着dest中存在不是list的映射,执行异常。
返回值:操作的元素。
3. 示例
3.1 消息队列
创建list,生产者从头部增加,消费者从尾部取出。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5aN5ZInh-1594817230989)(C:\Users\star10008377001\AppData\Roaming\Typora\typora-user-images\image-20200715203700765.png)]
3.2 消息队列–确认模式
创建list,生产者从头部增加,消费者从尾部取出并放到临时队列中,消费者完全消费后,在将消息从临时队列中取出。(使用移除指定值,移除1次,从头开始)
3.3 消息队列–最大长度
创建list,使用保留指定范围的元素,可以保证list的长度恒定。