链表List的操作
redis中的List在内存中按照一个name对应一个List来存储。
链表基本操作
#1 lpush(name, *values)
在name对应的链表中添加元素,每个新的元素都添加到链表的最左边
如:
r.lpush('l1', 1,2,3,4,5) # l1 = [b'5', b'4', b'3', b'2', b'1']
#2 rpush(name, *values) 表示每个新元素插在列表的最右边
如
r.rpush('l1', 6) # [b'5', b'4', b'3', b'2', b'1', b'6']
#3 lpushx(name, value)
在name对应的list中添加元素,只有name已经存在时将元素插在最左边;不存在不做任何操作
#4 rpushx(name, value) name存在时,将元素插在最右边
#5 llen(name)
name对应的list元素的个数
#6 linsert(name, where, refvalue, value))
在name对应的列表的某一个值前或后插入一个新值
参数:
name,redis的name
where,BEFORE或AFTER, 不区分大小写
refvalue,标杆值,即:在它前后插入数据
value,要插入的数据
如
r.linsert('l1', 'after', 3, 12) # [b'5', b'4', b'3', b'12', b'2', b'1', b'6']
#7 r.lset(name, index, value)
对name对应的list中的某一个索引位置重新赋值
参数:
name,redis的name
index,list的索引位置
value,要设置的值
如:
r.lset('l1', 2, '99') # [b'5', b'4', b'99', b'12', b'12', b'2', b'1', b'6']
#8 r.lrem(name, count, value)
在name对应的list中删除指定的值
参数:
name,redis的name
value,要删除的值
count,
count=0,删除列表中所有的指定的value;
count=2, 从前到后,删除前2个value;
count=-2, 从后向前,删除后2个value
#9 lpop(name)
删除name对应的列表中出现的第一个元素并返回
更多:
# rpop(name) 表示弹出从右向左出现的第一个元素
#10 lindex(name, index)
在name对应的列表中根据索引获取列表元素
#11 lrange(name, start, end)
在name对应的列表分片获取数据
参数:
name,redis的name
start,索引的起始位置
end,索引结束位置
如
r.lrange('l1', 0, -1) # 获取链表l1的所有元素
#12 ltrim(name, start, end)
在name对应的列表中移除start-end之外的元素,双闭区间
参数:
name,redis的name
start,索引的起始位置
end,索引结束位置
如
print(r.lrange('l1', 0, -1)) # [b'4', b'99', b'12', b'12', b'2', b'1', b'6']
r.ltrim('l1', 1, 4) # 保留1-4之间的元素
print(r.lrange('l1', 0, -1)) # [b'99', b'12', b'12', b'2']
# 13 blpop(name, timeout=0)
弹出name对应列表中的左边第一个元素,如果不存在则阻塞,等待列表中出现元素。
timeout为等待时间,表示阻塞时等待的时间,如果timeout=0则表示无期限的原地阻塞
blpop('lx_list1') # 弹出lx_list1中第一个元素,如果不存在则原地阻塞
自定制分批获取链表的数据
# 每次从redis中取2个元素, 通过生成器返回出去
# 然后再次while循环,直到满足取值个数要求,
def scan_list(name, count=2):
index=0
while True:
# 闭区间:[0, count-1]
data_list = conn.lrange(name, index, count+index-1)
if not data_list:
return # 循环完毕,结束
index += count # 更新取值区间的起点
for item in data_list:
yield item # 每次切片的列表通过生成器依次返回
# 使用
for item in scan_list('lx_list1', 5):
print(item)