Redis 列表操作
from redis import Redis
conn = Redis()
lpush(name,values)
conn.lpush('girl_friend','刘亦菲','迪丽热巴')
'''
LPUSH key value value1 value2...
左边插入,将一个或多个值value插入列表key的头部,
如果key不存在,一个空列表则会被创建,当key存在但不是列表类型时,返回一个错误。
'''
redis:
LPUSH hello 1 2 3 4 5
结果:(integer) 5
lpushx(name,value)
只有name已经存在时,值添加到列表的最左边
conn.lpushx('girl_friend','杨颖')
'''
LPUSHX key value value1 value2...
当列表key存在时,才将value插入到列表key的表头,否则什么也不做。
当key存在但不是列表类型时,返回一个错误。
'''
redis:
lpushx hello 999
结果:(integer) 6
rpushx(name, value)
conn.rpush('girl_friend','彭于晏')
'''
RPUSHX key value value1 value2...
当列表key存在时,才将value插入到列表key的尾部,否则什么也不做。
当key存在但不是列表类型时,返回一个错误。
'''
llen(name)
print(conn.llen('girl_friend'))
'''
返回列表key的长度,
如果key不存在,则key被解释为一个空列表返回0,当key存在但不是列表类型,返回错误。
'''
redis:
llen hello
结果:(integer) 5
linsert(name, where, refvalue, value))
# name: redis的key值, where: before或者after refvalue: 列表中的元素(刘亦菲), value :要插入的值
# conn.linsert('girl_friend',where='after',refvalue='刘亦菲',value='春游去动物园')
# conn.linsert('girl_friend',where='before',refvalue='刘亦菲',value='春游去动物园')
# conn.linsert('girl_friend',where='before',refvalue='迪丽热巴',value='春游去动物园')
'''
在name对应的列表的某一个值前或后插入一个新值
# 参数:
# name,redis的name
# where,BEFORE或AFTER(小写也可以)
# refvalue,标杆值,即:在它前后插入数据(如果存在多个标杆值,以找到的第一个为准)
# value,要插入的数据
'''
lset(name, index, value) 从零开始
conn.lset('girl_friend',0,'凤姐')
lrem(name, value, num) # 正数是从左侧,负数是从右侧,0表示删所有
# conn.lrem('girl_friend',1,'春游去动物园') # 从左侧删1个
# conn.lrem('girl_friend',-1,'春游去动物园') # 从右侧删1个
# conn.lrem('girl_friend',0,'春游去动物园') # 从右侧删1个
'''
# 在name对应的list中删除指定的值
# 参数:
# name,redis的name
# num, num=0,删除列表中所有的指定值;
# num=2,从前到后,删除2个;
# num=-2,从后向前,删除2个
# value,要删除的值
'''
lpop(name) 从左侧弹出
# res=conn.lpop('girl_friend')
# res = conn.rpop('girl_friend')
# print(str(res, encoding='utf-8')
'''
LPOP key
删除列表key的头部元素并返回该元素,当key不存在时,返回nil
'''
redis:
lpop hello
结果:"999"
lindex(name, index) 根据索引位置取值,索引从0开始
# res=conn.lindex('girl_friend',2)
# print(str(res,encoding='utf-8'))
'''
在name对应的列表中根据索引获取列表元素
'''
lrange(name, start, end)
res=conn.lrange('girl_friend',0,2) # 前闭后闭区间
'''
# 在name对应的列表分片获取数据
# 参数:
# name,redis的name
# start,索引的起始位置
# end,索引结束位置 print(re.lrange('aa',0,re.llen('aa')))
'''
# ****列表操作,没有getall全部取值,可以通过切片来获取全部的值
# 切片,取到了全部的值
# print(conn.lrange('l1',0,conn.llen('l1')))
# 前闭后闭区间,取2个值
print(conn.lrange('l1',0,1))
ltrim(name, start, end) 修剪
conn.ltrim('girl_friend',1,3)
'''
在name对应的list中删除指定区间的值
'''
rpoplpush(src, dst)
conn.lpush('wife1','ee')
conn.rpoplpush('girl_friend','wife1')
'''
# 从一个列表取出最右边的元素,同时将其添加至另一个列表的最左边
# 参数:
# src,要取数据的列表的name
# dst,要添加数据的列表的name
'''
blpop(keys, timeout)
print(conn.blpop('春游去动物园'))
'''
# 阻塞式 弹出,如果列表中有值,就弹出,如果没有值就阻塞,直到有值再弹出
# 将多个列表排列,按照从左到右去pop对应列表的元素
# 参数:
# keys,redis的name的集合
# timeout,超时时间,当元素所有列表的元素获取完之后,阻塞等待列表内有数据的时间(秒), 0 表示永远阻塞
'''
# 重点:blpop 如果列表中没有值,会一直hang住停在那里,可以实现简单的分布式爬虫
# 使用场景:爬虫可以把要爬的链接放在redis列表里面,再用一个程序从redis列表里面取,取连接去爬,存到数据库
# 就是一个程序redis放着许多的连接,另一个程序从redis里面取链接爬
print(conn.blpop('l1',timeout=3))
自定义增量迭代
'''
# 由于redis类库中没有提供对列表元素的增量迭代,如果想要循环name对应的列表的所有元素,那么就需要:
# 1、获取name对应的所有列表
# 2、循环列表
# 但是,如果列表非常大,那么就有可能在第一步时就将程序的内容撑爆,所有有必要自定义一个增量迭代的功能:
'''
# 由于redis类库中没有提供对列表元素的增量迭代,如果想要循环name对应的列表的所有元素,那么就需要:
# 1、获取name对应的所有列表
# 2、循环列表
# 但是,如果列表非常大,那么就有可能在第一步时就将程序的内容撑爆,所有有必要自定义一个增量迭代的功能:
import redis
conn=redis.Redis(host='127.0.0.1',port=6379)
# conn.lpush('test',*[1,2,3,4,45,5,6,7,7,8,43,5,6,768,89,9,65,4,23,54,6757,8,68])
# conn.flushall()
def scan_list(name,count=2):
index=0
while True:
data_list=conn.lrange(name,index,count+index-1)
if not data_list:
return
index+=count
for item in data_list:
yield item
print(conn.lrange('test',0,100))
for item in scan_list('test',5):
print('---')
print(item)