栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用python获取Redis数据库中的所有键

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用python获取Redis数据库中的所有键

采用

scan_iter()

scan_iter()
优于
keys()
大量密钥,因为它为您提供了可以使用的迭代器,而不是尝试将所有密钥加载到内存中。

我的redis中有一个1B记录,而且我永远都无法获得足够的内存来一次返回所有密钥。

一对一扫描键

这是一个python代码段,

scan_iter()
用于从商店中获取与某个模式匹配的所有键,并一一删除它们:

import redisr = redis.StrictRedis(host='localhost', port=6379, db=0)for key in r.scan_iter("user:*"):    # delete the key    r.delete(key)

批量扫描

如果要扫描的密钥列表非常大(例如,大于100k的密钥),则分批扫描它们将更加高效,如下所示:

import redisfrom itertools import izip_longestr = redis.StrictRedis(host='localhost', port=6379, db=0)# iterate a list in batches of size ndef batcher(iterable, n):    args = [iter(iterable)] * n    return izip_longest(*args)# in batches of 500 delete keys matching user:*for keybatch in batcher(r.scan_iter('user:*'),500):    r.delete(*keybatch)

我对该脚本进行了基准测试,发现使用500个批处理的规模比一对一扫描密钥快5倍。我测试了不同的批次大小(3,50,500,1000,5000),发现500的批次大小似乎是最佳的。

请注意,无论您使用

scan_iter()
or
keys()
方法,该操作都不是原子操作,并且可能会部分失败。

绝对避免在命令行上使用XARGS

我不建议在其他地方重复此示例。对于unipre键,它将失败,并且即使中等数量的键,其速度也非常慢:

redis-cli --raw keys "user:*"| xargs redis-cli del

在此示例中,xargs为每个密钥创建一个新的redis-cli进程!那很糟。

我将这种方法的基准测试结果比第一个python示例慢了4倍,在第一个python示例中,它删除了每个键一次,比批量删除500个要慢20倍。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/403597.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号