上篇文章:
Redis数据类型之hashhttps://blog.csdn.net/sniper_fandc/article/details/149139615?fromshare=blogdetail&sharetype=blogdetail&sharerId=149139615&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link
目录
1 lpush、lpushx和lrange
2 rpush和rpushx
3 lpop和rpop
4 lindex、linsert和llen
5 lrem
6 ltrim和lset
7 blpop和brpop
8 list的使用场景
list是列表,实际上更接近双端队列,支持头插、尾差、头删和尾删等基本操作,可以用来充当栈或队列的使用。
1 lpush、lpushx和lrange
命令:lpush key value1 value2 ...
头插插入list多个元素。时间复杂度O(N),N表示插入元素的个数。返回值是list的长度。如果key不存在就创建;如果key存在就头插。因为是头插,所以最后插入的元素会在list的第一个位置。
命令:lrange key start end
查询list下标范围[start,end]的元素。时间复杂度O(N),N表示查询元素的个数。返回值按下标顺序的各元素。同样,下标也支持负数下标(表示倒数第几个)。如果下标超出范围,redis就会尽可能纠正下标到正确范围
命令:lpushx key value1 value2 ...
如果key存在,头插插入list多个元素;否则不插入。时间复杂度O(N),N表示插入元素的个数。返回值是list的长度。
2 rpush和rpushx
命令:rpush key value1 value2 ...
尾插插入list多个元素。时间复杂度O(N),N表示插入元素的个数。返回值是list的长度。如果key不存在就创建;如果key存在就尾插。因为是尾插,所以最先插入的元素会在list的第一个位置。
命令:rpushx key value1 value2 ...
如果key存在,尾插插入list多个元素;否则不插入。时间复杂度O(N),N表示插入元素的个数。返回值是list的长度。
3 lpop和rpop
命令:lpop key
头删key的list的元素。时间复杂度O(1)。返回值是被删除的元素或nil。
命令:rpop key
尾删key的list的元素。时间复杂度O(1)。返回值是被删除的元素或nil。
可以搭配lpush和rpush实现队列或栈。(lpush和lpop)或(rpush和rpop)是栈,(lpush和rpop)或(rpush和lpop)是队列。
注意:在redis 6.2版本后引入count参数可以一次删除多个元素。比如lpop key count,连续头删key对应list的count个元素。
4 lindex、linsert和llen
命令:lindex key index
获取list中下标index的元素。时间复杂度O(N),N是list的长度,这里因为list的底层实现可能是链表,链表查询是O(N)的复杂度。返回值是查询的元素或nil。
命令:linsert key before | after element value
在element元素前(before)或后(after)插入value。时间复杂度O(N),N是list的长度。返回值是list的长度。
如果list中有重复的元素,就会从list头开始从左向右遍历找到第一个重复的元素进行插入:
命令:llen key
返回list的长度。时间复杂度O(1)。
5 lrem
命令:lrem key count element
删除list中count个元素element。时间复杂度O(N+M),N是list长度,M是删除的个数。如果count>0,从左往右删:
如果count<0,从右往左删:
如果count==0,删除全部满足value==element的元素:
6 ltrim和lset
命令:ltrim key start end
保留[start,end]的元素,其余的全部删除。时间复杂度O(N),N是list长度。
命令:lset key index element
把下标index的元素修改为element。时间复杂度O(N),N是list长度。如果下标越界则报错。
7 blpop和brpop
blpop和brpop是lpop和rpop的阻塞版本,即当list为空时,执行blpop和brpop会阻塞(在此期间redis服务器可以执行其他命令),直到超出设置的阻塞时间或list不空;如果list不空,执行效果就如同lpop和rpop。
blpop和brpop命令可以同时指定多个key,从左向右遍历key,只要有一个key的list弹出元素,就视为执行成功,命令立即返回。
如果多个客户端并发对一个key执行blpop或brpop,在list为空时,如果阻塞时间内list有新元素,则会优先给最先执行的命令返回元素。
命令:blpop key1 key2 ... timeout
返回值是二元组,包括哪个key和对应弹出的元素。
当list6和list7都没有元素了,此时再执行命令就会阻塞,直到其他客户端使用相关命令向list6或list7插入元素。
31.63s表示阻塞的时间。brpop命令类似,不再演示。
注意:timeout在redis 5设置时必须是整数的秒,但是redis 6以后就引入了小数的秒。
8 list的使用场景
list最常用于多个同属于一个元素的值的存储(一对多场景),比如一个班级有多个学生。还有个作用是作为消息队列使用:消息队列需要使用阻塞队列作为数据结构,而list的实现类似双端队列,提供两端的存和取。利用lpush和brpop(需要用到阻塞),可以实现生产者往阻塞队列放元素,消费者取元素,如果没有元素可取就阻塞等待。
在分布式系统中,往往需要解耦。对消息的传递也可以解耦,即利用多个频道,每个频道传递不同的消息,生产者负责往不同频道写消息,消费者负责从多个不同频道读消息,这里的多个频道就是多个list。
下篇文章:
Redis数据类型之sethttps://blog.csdn.net/sniper_fandc/article/details/149139848?fromshare=blogdetail&sharetype=blogdetail&sharerId=149139848&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link