redis学习计划(四)redis常用数据类型 List
redis学习计划(四)redis常用数据类型 List
import redis pool=redis.ConnectionPool(host='127.0.0.1', port=6379, db=0, max_connections=4) rs=redis.Redis(connection_pool=pool)
1.List简介
redis中的List就是一个有序的链表。与普通链表并无太大的差异,可以通过命令在左右进行插入取出操作。
2.List相关命令
简单归纳:
List的主要操作基本与链表类似,归纳记忆为:
1. lpush rpush lpop rpop:从头部尾部批量插入数据,返回链表中元素的总数量;弹出头部或尾部元素。
2. lpushx rpushx 插入数据的时候判断key是否存在,如果不存在就不进行任何操作。
3. blpop brpop 阻塞的进行弹出操作。
4. rpoplpush brpoplpush a.从某list弹出数据并且push到另外的list。b..只是阻塞式的操作。原子性操作。
5. lrange 获取数据
6. llen 判断数据量
7. lset lindex linsert ltrim lrm 对于链表的简单操作,设置啊,插入啊,索引啊,删除啊等操作。
既然是链表式的存储操作,就一定会具有链表的特性,插入删除较快,索引较慢,所以此数据结构一般用于有序的数据存储,以及可以用于消息队列。
(1)
命令:LPUSH key value [value ...] :在头部批量插入元素,如k不存在则新建
时间复杂度:O(1)
命令描述:在指定Key所关联的List Value的头部插入参数中给出的所有Values。如果该Key不存在,该命令将在插入之前创建一个与该Key关联的空链表,之后再将数据从链表的头部插入。如果该键的Value不是链表类型,该命令将返回相关的错误信息。
返回值:插入后链表中元素的数量。
命令:RPUSH key value [value ...] :在尾部批量插入元素,如k不存在则新建
时间复杂度:O(1)
命令描述:在指定Key所关联的List Value的尾部插入参数中给出的所有Values。如果该Key不存在,该命令将在插入之前创建一个与该Key关联的空链表,之后再将数据从链表的尾部插入。如果该键的Value不是链表类型,该命令将返回相关的错误信息。
返回值:插入后链表中元素的数量。
# lpush,左边(头部)插入 rs.lpush('lk1', 1, 2, 3) #返回插入链表后,链表中所有元素的数量;如k不存在,则新建 # 3 rs.lpush('lk1', 4, 5 ,6 ) # 6 rs.lpush('lk1', 4, 5 ,6 ) # 9 # rpush,右边(尾部)插入 rs.rpush('lk1', 'a', 'b', 'c')
命令:LPOP key :弹出头部元素,如k不存在则返回None
时间复杂度:O(1)
命令描述:返回并弹出指定Key关联的链表中的第一个元素,即头部元素,。如果该Key不存,返回nil。
返回值:链表头部的元素。
命令:RPOP key :弹出尾部元素,如k不存在则返回None
时间复杂度:O(1)
命令描述:返回并弹出指定Key关联的链表中的最后一个元素,即尾部元素,。如果该Key不存,返回nil。
返回值:链表尾部的元素。
rs.lpop('lk1') # 弹出头部的元素 # '6' rs.rpop('lk1') # 弹出尾部的素 # 'c'
rs.rpop('lllllllll')
# None
(2)
命令:LPUSHX key value :插入单个头部元素(返回链表中元素的总数量),如k不存在则不操作(返回0)
时间复杂度:O(1)
命令描述:仅有当参数中指定的Key存在时,该命令才会在其所关联的List Value的头部插入参数中给出的Value,否则将不会有任何操作发生。
返回值:插入后链表中元素的数量。
命令:RPUSHX key value
时间复杂度:O(1)
命令描述:仅有当参数中指定的Key存在时,该命令才会在其所关联的List Value的尾部插入参数中给出的Value,否则将不会有任何操作发生。
返回值:插入后链表中元素的数量。
rs.lpushx('lk2', 1) # k不存在,不操作,返回0 rs.lpushx('lk1', 1) # k存在,在头部插入一个元素,返回链表中的元素总量 #11 rs.rpushx('lk1', 'd') #尾部插入单个元素,k必须存在;k不存在,则不操作,返回0 # 12
(3)
命令:BRPOP source destination timeout:阻塞版的rpop
时间复杂度:O(1)
命令描述:此命令是RPOPLPUSH命令的阻塞版。当列表 source 为空时, BRPOPLPUSH 命令将阻塞连接,直到等待超时,或有另一个客户端对 source 执行 LPUSH 或 RPUSH 命令为止。
返回值:返回弹出和插入的元素。
命令:BLPOP key [key ...] timeout
时间复杂度:O(1)
命令描述:BLPOP是LPOP的阻塞版。当给定列表内没有任何元素可供弹出的时候,连接将被 BLPOP 命令阻塞,直到等待超时或发现可弹出元素为止。当给定多个 key 参数时,按参数 key 的先后顺序依次检查各个列表,弹出第一个非空列表的头元素。不同的客户端被放进一个队列中,按『先阻塞先服务』(first-BLPOP,first-served)的顺序为 key 执行 BLPOP 命令。
rs.blpop('lk2', 30) # 阻塞式地,从部头弹出元素;当k不存在时,将一直阻塞 rs.blpop('lk1', 30) # 当k存在,链表中有元素,从头部弹出元素,一次弹出一个元素 # (b'lk1', b'5') rs.brpop('lk1', 30) # 当k存在,链表中有元素,从尾部弹出元素,一次弹出一个元素 # (b'lk1', b'a') # 当k存在,链表中没有元素时,将阻塞;直到链表中有新元素或者超时;超时,返回None # None
(4)
命令:RPOPLPUSH source destination:弹出第一个列表中的尾部元素,插入第二个列表的头部
时间复杂度:O(1)
命令描述:原子性的从与source键关联的链表尾部弹出一个元素,同时再将弹出的元素插入到与destination键关联的链表的头部。如果source键不存在,该命令将返回nil,同时不再做任何其它的操作了。如果source和destination是同一个键,则相当于原子性的将其关联链表中的尾部元素移到该链表的头部。
返回值:返回弹出和插入的元素。
命令:BRPOP key [key ...] timeout
时间复杂度:O(1)
命令描述:BRPOP是RPOP的阻塞版。详情与BLPOP除了弹出位置不同以外,其他基本相同。
rs.rpoplpush('lk1', 'lk2') # '1' rs.brpoplpush('lk1', 'lk2') # 阻塞版的rpoplpush # 2
(5)
命令:LRANGE key start stop
时间复杂度:O(S+N)
命令描述:该命令的参数start和end都是0-based。即0表示链表头部(leftmost)的第一个元素。其中start的值也可以为负值,-1将表示链表中的最后一个元素,即尾部元素,-2表示倒数第二个并以此类推。该命令在获取元素时,start和end位置上的元素也会被取出。如果start的值大于链表中元素的数量,空链表将会被返回。如果end的值大于元素的数量,该命令则获取从start(包括start)开始,链表中剩余的所有元素。
返回值:返回指定范围内元素的列表。
rs.lrange('lk1', 0, 2) # start, end都必须存在;可以超过索引,可以用负数索引 # [b'5', b'4', b'3']
(6)
命令:LLEN key
时间复杂度:O(1)
命令描述:返回指定Key关联的链表中元素的数量,如果该Key不存在,则返回0。如果与该Key关联的Value的类型不是链表,则返回相关的错误信息。
返回值:链表中元素的数量。
rs.llen('lk111') # 当k不存在时,返回0 rs.llen('lk1') #k存在时, 返回链表的长度 # 3 rs.llen('sk1') # 操作其它类型的value时,将抛出异常;同其它方法一样,只能操作相应类型的value
(7)
命令:LSET key index value :在指定位置,插入元素
时间复杂度:O(N)
命令描述:设定链表中指定位置的值为新值,其中0表示第一个元素,即头部元素,-1表示尾部元素。如果索引值Index超出了链表中元素的数量范围,该命令将返回相关的错误信息。
rs.lset('lk1', 2, 2222) # 返回True或Flase
命令:LINDEX key index:查找指定位置的元素
时间复杂度:O(N)
命令描述:该命令将返回链表中指定位置(index)的元素,index是0-based,表示头部元素,如果index为-1,表示尾部元素。如果与该Key关联的不是链表,该命令将返回相关的错误信息。
返回值:返回请求的元素,如果index超出范围,则返回nil。
rs.lindex('lk1', 2) # 2222
命令:LINSERT key BEFORE|AFTER pivot value :在批定元素前或后,插入元素
时间复杂度:O(N)
命令描述:该命令的功能是在pivot元素的前面或后面插入参数中的元素value。如果Key不存在,该命令将不执行任何操作。如果与Key关联的Value类型不是链表,相关的错误信息将被返回。
返回值:成功插入后链表中元素的数量,如果没有找到pivot,返回-1,如果key不存在,返回0。
rs.linsert('lk1', 'before', 2222, 100) # 在2222元素前,插入元素100,返回链表中元素的总数量 # 5 rs.linsert('lk1', 'after', 22222222, 100) # 如果指定的元素不存在,则不操作,返回-1 # -1 rs.linsert('lklllllllllll', 'after', 222, 20) # 如果k不存在,不操作,返回0 #0
命令:LTRIM key start stop :保留指定范围内的元素
时间复杂度:O(N)
命令描述:N表示被删除的元素数量。该命令将仅保留指定范围内的元素,从而保证链接中的元素数量相对恒定。start和stop参数都是0-based,0表示头部元素。和其他命令一样,start和stop也可以为负值,-1表示尾部元素。如果start大于链表的尾部,或start大于stop,该命令不错报错,而是返回一个空的链表,与此同时该Key也将被删除。如果stop大于元素的数量,则保留从start开始剩余的所有元素。
rs.ltrim('lk1', 0,2) # 保留指定范围内的元素,成功返回True;失败返回False # True
命令:LREM key count value :删除指定数量,值为此value的元素
时间复杂度:O(N)
命令描述:在指定Key关联的链表中,删除前count个值等于value的元素。如果count大于0,从头向尾遍历并删除,如果count小于0,则从尾向头遍历并删除。如果count等于0,则删除链表中所有等于value的元素。如果指定的Key不存在,则直接返回0。
返回值:返回被删除的元素数量。
rs.lrem('lk1', 2, 1)
posted on 2018-09-06 09:30 myworldworld 阅读(166) 评论(0) 收藏 举报
浙公网安备 33010602011771号