redis列表操作

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)
posted @ 2022-07-14 17:15  春游去动物园  阅读(93)  评论(0编辑  收藏  举报