首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何使用 Python从Redis 中删除 4000万 KEY

本文主要涉及 Redis 的以下两个操作和其 Python 实现,目录:

SCAN 命令

DEL 命令

使用 Python SCAN

使用 Python DEL

成果展示

SCAN 命令

SCAN命令及相关的SSCAN、HSCAN和ZSCAN命令都用于增量迭代(incrementally iterate)一个集合的元素(a collection of elements):

SCAN用于迭代当前数据库中的数据库键

SSCAN用于迭代集合键中的元素

HSCAN用于迭代哈希键中的键值对

ZSCAN用于迭代有序集合中的元素(包括元素分值和元素分值)

以上四列命令都支持增量迭代,每次执行都会返回少量元素,所以他们都可以用于生产环境,而不会出现像KEYS、SMEMBERS命令一样 -- 可能会阻塞服务器

不过,增量式迭代命令也不是没有缺点的:

举个例子,使用SMEMBERS命令可以返回集合键当前包含的所有元素,但是对于SCAN这类增量迭代命令来说,因为在堆键进行增量迭代的过程中,键可能会被改变,所以增量式迭代命令只能对被返回的元素提供有限的保证(offer limited guarantees about the returned elements)。

因为SCAN、SSCAN、HSCAN和ZSCAN命令的工作方式都非常相似,但是要记住:

SSCAN、HSCAN和ZSCAN命令的第一个参数总是一个数据库键;

SCAN命令则不需要在第一个参数提供任何数据库键 -- 因为它迭代的是当前数据库中的所有数据库键。

SCAN 命令的基本用法

SCAN命令是一个基于游标的迭代器(cursor based iterator):

SCAN命令每次被调用后,都会向用户返回一个新的游标,用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数,以此来延续之前的迭代过程。

当SCAN命令的游标参数被设置为 0 时,服务器开始一次新的迭代,而当服务器向用户返回值为 0 的游标时,表示迭代结束。

示例:

上面的例子中,第一次迭代用 0 作为游标,表示开始第一次迭代。

第二次迭代使用第一次迭代时返回的游标,即:17。

从示例可以看出,SCAN 命令的返回是一个两个元素的数组,第一个元素是新游标,第二个元素也是一个数组,包含有所被包含的元素。

第二次调用 SCAN 命令时,返回游标 0,这表示迭代已经结束了,整个数据集(collection)已经被完整遍历过一遍了。

这个过程被称为一次完整遍历(full iteration)。

精简一下内容,补充三点:

因为SCAN命令仅仅使用游标来记录迭代状态,所以在迭代过程中,如果这个数据集的元素有增减,如果是减,不保证元素不返回;如果是增,也不保证一定返回;而且在某种情况下同一个元素还可能被返回多次。所以对迭代返回的元素所执行的操作最好可以重复执行多次(类似幂等)。

增量迭代命令不保证每次迭代所返回的元素数量(没扫到嘛),但是我们可以使用COUNT选项对命令的行为进行一定程度的调整。COUNT参数的默认值为 10,在迭代一个足够大的、由哈希表实现的数据库、集合键、哈希键或者有序集合键时,如果用户没有使用MATCH选项,那么命令返回的数量通常和COUNT选项指定的一样,或者多一些(),在迭代编码为整数集合(intset:一个由整数值构成的小集合)或编码为压缩列表(ziplist:由不同值构成的一个小哈希或者一个小有序集合)时,会无视 COUNT 选项指定的值,在第一次迭代就将数据集的所有元素都返回给用户。

MATCH 选项,直接看示例吧,如下示例:

注意:对元素的模式匹配工作是在命令从数据集中取出元素之后,向客户端返回元素之前进行的,所以有可能返回空,示例:

注意:最后一次迭代,通过COUNT选项指定为 1000 强制命令为本次迭代扫描更多元素,从而使返回的元素也变多了。

DEL 命令

这个比较简单,删除给定的一个或者多个 key

使用 Python SCAN

安装 redis-py 包

完整代码示例:

我将需要删除的 key 存在一个文件里,有 2.2G,大概 4000W 个,下一步就是删除了

使用 Python DEL

因为文件很大,我们用到一个小技巧,分块读取

调用 delete 方法时,用到一个小技巧就是『*』星号

我们看一下定义就清楚了:

Delete Method

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180114G02NL700?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券