redis快速遍历超级列表

redis快速遍历大列表而不撑爆内存

有时候我们需要遍历redis中的list,但是这个list超级大(比如千万以上),服务器一下子读到内存中操作有点吃不消。这时候就需要循环遍历了,当然不是一个个循环,不然循环到老了。这时候就用到了scan, python中就是hscan,可以设置每次读取的数量(这个根据本机器的配置测试),可以快速循环又不至于撑爆机器。注意,下面的cursor=0一定要在循环之外,放在循环中就成了死循环了。我在笔记本遍历远程服务器上的一个900多万的列表,花了800多秒,每次读取10000.

import redis
import time
r = redis.Redis(host=redis_host, port=7379, db=0, password=redis_pwd, encoding='utf-8', decode_responses=True)
# url_ = str(random.choice(client.hvals('adsl')))
# print('str_key1值字节长度:{}'.format(r.llen('lagouspd:start_urls')))
# # 获取元素:切片方式
# print(r.lrange('lagoutest:start_urls',0, 1), r.lrange('lagouspd:start_urls',1,2))
# list_redis = r.lrange('lagoutest:start_urls',0, -1)

# set_redis = {""}
# set_redis.update(list_redis)
# r.lpush('lagouspd:start_urls', 'https://www.lagou.com/wuhan/')
t1 = time.time()
cursor=0
while True:
    cursor, data = r.hscan('existing_skus', cursor, match=None, count=10000)
    print(f'cursor: {cursor}')
    list_redis = list(data.keys())
    set_redis = {""}
    set_redis.update(list_redis)
    r.lpush('jd_comment:skus', *set_redis)
    if cursor==0:
        break
t2 = time.time() 
print('time elapsed:', t2-t1)
# while cursor != 0:
#     cursor, keys = r.scan(cursor=cursor, count=1000000)
#     values = client.mget(*keys)
#     values = [value for value in values if not value == None]
#     data.update(dict(zip(keys, values)))

# for item in r.hscan_iter('xdaili'):
#     print(item)
# print(r.hscan_iter("xdaili"))    # 生成器内存地址

发表评论

邮箱地址不会被公开。 必填项已用*标注