iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Redis如何删除1.2亿指定前缀的key
  • 578
分享到

Redis如何删除1.2亿指定前缀的key

2024-04-02 19:04:59 578人浏览 独家记忆
摘要

这篇文章主要为大家展示了“Redis如何删除1.2亿指定前缀的key”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Redis如何删除1.2亿指定前缀的key”这

这篇文章主要为大家展示了“Redis如何删除1.2亿指定前缀的key”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Redis如何删除1.2亿指定前缀的key”这篇文章吧。

背景

因为更换IDC的原因,我们需要迁移缓存到新的机房,开发同学提出老的缓存有1.2亿无效(未设置过期时间)的key和正常在用的业务key,在迁移之前可以先指定前缀将key删除。那么问题来了,如何快速删除1.2亿的key呢?

如何获取指定的 key

大家都知道由于Redis的单线程服务模式,命令 keys * 会阻塞正常的业务请求,所以肯定不行。

在这里我们利用Redis 提供的 SCAN 功能。SCAN 命令是一个基于游标的迭代器(cursor based iterator): SCAN 命令每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数, 以此来延续之前的迭代过程。

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

SCAN cursor [MATCH pattern] [COUNT count]

其中 cousor 是游标,MATCH 则支持正则匹配,我们正好可以利用此功能,比如匹配 前缀为"dba_"的key, COUNT 是每次获取多少个key。

redis 127.0.0.1:6379> scan 0
1) "17"
2)  1) "key:12"
    2) "key:8"
    3) "key:4"
    4) "key:14"
    5) "key:16"
    6) "key:17"
    7) "key:15"
    8) "key:10"
    9) "key:3"
    10) "key:7"
    11) "key:1"
redis 127.0.0.1:6379> scan 17
1) "0"
2) 1) "key:5"
   2) "key:18"
   3) "key:0"
   4) "key:2"
   5) "key:19"
   6) "key:13"
   7) "key:6"
   8) "key:9"
   9) "key:11"

在上面这个例子中, 第一次迭代使用 0 作为游标, 表示开始一次新的迭代。第二次迭代使用的是第一次迭代时返回的游标, 也即是命令回复第一个元素的值 —— 17 。 在第二次调用 SCAN 命令时, 命令返回了游标 0 , 这表示迭代已经结束, 整个数据集(collection)已经被完整遍历过了。

从上面的示例可以看到, SCAN 命令的回复是一个包含两个元素的数组, 第一个数组元素是用于进行下一次迭代的新游标, 而第二个数组元素则是一个数组, 这个数组中包含了所有被迭代的元素。

注意:以 0 作为游标开始一次新的迭代, 一直调用 SCAN 命令, 直到命令返回游标 0 , 我们称这个过程为一次完整遍历(full iteration)。 我们会在后面的代码实现中利用此特点。

python的redis 模块提供 scan_iter 迭代器来遍历key,其返回的结果迭代器对象。

In [53]: ret=r.scan_iter('dba_*',20)
In [54]: print ret

至此,我们解决了如何获取数据的问题,下面思考第二个问题。

如何执行删除

这个相对比较简单,Redis 提供DEL 命令

127.0.0.1:6379[2]> get "dba_7"
"r06cVX9"
127.0.0.1:6379[2]> get "dba_1"
"ETX57PA"
127.0.0.1:6379[2]> del "dba_7" "dba_1"
(integer) 2
127.0.0.1:6379[2]>

在redis-py 中,提供了delete(key),delete(*key)的函数, 其中参数 *key 是多个值的列表。 到这里,我们大致可以想到获取key,然后批量删除

(mytest)?  test git:(master) ? Python delete_key.py
initial keys successfully,use time: 90.2497739792
nORMal ways end at: 68.685477972
normal ways delete numbers: 1000000

常规方式的删除10W个key耗时68.7秒,如果是1.2亿个key 要多少时间呢?68*1000/3600=18.8小时。能不能更快呢? 

如何提高执行速度

Redis本身是基于Request/Response协议的,客户端发送一个命令,等待Redis应答,Redis在接收到命令,处理后应答。其中发送命令加上返回结果的时间称为(Round Time Trip)RRT-往返时间。如果客户端发送大量的命令给Redis,那就是等待上一条命令应答后再执行再执行下一条命令,这中间不仅仅多了RTT,而且还频繁的调用系统IO,发送网络请求。

Redis如何删除1.2亿指定前缀的key

Pipeline(流水线)功能极大的改善了上面的缺点。Pipeline能将一组Redis命令进行组装,然后一次性传输给Redis,再将Redis执行这组命令的结果按照顺序返回给客户端。

Redis如何删除1.2亿指定前缀的key

需要注意的是Pipeline 虽然好用,但是Pipline组装的命令个数不能没有限制,否则一次组装数据量过大,一方面增加客户端的等待时间,另一方面会造成网络阻塞,需要批量组装。使用Pepline 和常规方式的性能对比如下:

Redis如何删除1.2亿指定前缀的key

代码

  1. # encoding: utf-8

  2. """

  3. author: yangyi@youzan.com

  4. time: 2018/3/9 下午8:35

  5. func:

  6. """

  7. import redis

  8. import random

  9. import string

  10. import time

  11. pool = redis.ConnectionPool(host='127.0.0.1', port=6379, db=2)

  12. r = redis.Redis(connection_pool=pool)



  13. def random_str():

  14.     return ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(7))



  15. def init_keys():

  16.     start_time = time.time()

  17.     for i in xrange(0, 20):

  18.         key_name = 'dba_'+str(i)

  19.         value_name = random_str()

  20.         r.set(key_name, value_name)

  21.     print 'initial keys successfully,use time:', time.time() - start_time



  22. def del_keys_without_pipe():

  23.     start_time = time.time()

  24.     result_length = 0

  25.     for key in r.scan_iter(match='dba_*', count=2000):

  26.         r.delete(key)

  27.         result_length += 1

  28.     print "normal ways end at:", time.time() - start_time

  29.     print "normal ways delete numbers:", result_length



  30. def del_keys_with_pipe():

  31.     start_time = time.time()

  32.     result_length = 0

  33.     pipe = r.pipeline()

  34.     for key in r.scan_iter(match='dba_*', count=5000):

  35.         pipe.delete(key)

  36.         result_length += 1

  37.         if result_length % 5000 == 0:

  38.             pipe.execute()

  39.     pip_time = time.time()

  40.     print "use pipeline scan time ", time.time() - start_time

  41.     pipe.execute()


  42.     print "use pipeline end at:", time.time() - pip_time

  43.     print "use pipeline ways delete numbers:", result_length



  44. def main():

  45.     init_keys()

  46.     del_keys_without_pipe()

  47.     init_keys()

  48.     del_keys_with_pipe()



  49. if __name__ == '__main__':

  50.     main()

以上是“Redis如何删除1.2亿指定前缀的key”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网数据库频道!

您可能感兴趣的文档:

--结束END--

本文标题: Redis如何删除1.2亿指定前缀的key

本文链接: https://www.lsjlt.com/news/69177.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Redis如何删除1.2亿指定前缀的key
    这篇文章主要为大家展示了“Redis如何删除1.2亿指定前缀的key”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Redis如何删除1.2亿指定前缀的key”这...
    99+
    2022-10-19
  • Redis如何优雅的删除特定前缀key
    前言 还在用keys命令模糊匹配删除数据吗?这就是一颗随时爆炸的炸弹! Redis中没有批量删除特定前缀key的指令,但我们往往需要根据前缀来删除,那么究竟该怎么做呢?可能你一通搜索后会得到下边的答案 ...
    99+
    2022-10-18
  • Redis中redis-cluster如何删除指定的key
    这篇文章主要为大家展示了“Redis中redis-cluster如何删除指定的key”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Redis中redis-clu...
    99+
    2022-10-18
  • redis删除指定key的实现步骤
    1.打开Redis目录并打开redis-cli.exe 如果直接输入get key会出现以下问题,表示需要认证,也就是需要登录用户 使用auth password登录即可 然后使用get key获取键的值 确认后...
    99+
    2022-08-17
    redis删除指定key redis删除key
  • redis集群批量删除指定的key
    1、说明redis集群上有时候会需要删除多个key,就必须需要登录到每个节点上,而且有可能这个key不在这个节点,这样删除起来就比较麻烦,下面提供一种便捷方式可以实现2、查看redis集群中的master节...
    99+
    2022-10-18
  • Redis如何获取某个前缀的key脚本
    这篇文章主要介绍了Redis如何获取某个前缀的key脚本,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.背景在平时的维护中,经常会遇到要统...
    99+
    2022-10-18
  • vue路径上如何设置指定的前缀
    目录vue路径上设置指定的前缀解决vue history模式、前缀路由history模式路由前缀vue路径上设置指定的前缀 有时在使用项目的时候,我们都需要指定一个前缀路径(就像to...
    99+
    2022-11-13
  • 在MySQL中,如何从整个列的值中删除特定前缀并更新它们?
    可以通过在列上应用 TRIM() 函数以及 MySQL UPDATE 语句来完成。下面的示例会更清楚地说明这一点。示例假设我们有一个表“Employee”,其前缀为“Dept.”,其中包含列“Department”的所有值如...
    99+
    2023-10-22
  • Angular项目路径如何添加指定的访问前缀
    这篇文章主要介绍了Angular项目路径如何添加指定的访问前缀的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Angular项目路径如何添加指定的访问前缀文章都会有所收获,下面我们一起来看看吧。开发多个项目的时候...
    99+
    2023-07-05
  • jquery如何删除指定id的一行
    使用jquery删除删除指定id行的方法:1.新建html项目,引入jquery;2.创建table表格;3.为表格行设置id属性;4.通过id属性获取行对象,使用remove()方法删除指定行;具体步骤如下:首先,新建一个html项目,并...
    99+
    2022-10-17
  • php如何删除数组指定的值
    本文小编为大家详细介绍“php如何删除数组指定的值”,内容详细,步骤清晰,细节处理妥当,希望这篇“php如何删除数组指定的值”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。首先,我们要明确一点,数组在 PHP 中可...
    99+
    2023-07-06
  • php如何删除数组的指定项
    本篇内容介绍了“php如何删除数组的指定项”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!PHP数组删除操作的基础知识在PHP中,我们可以使用...
    99+
    2023-07-05
  • PHP如何删除数组中的指定值
    本篇内容主要讲解“PHP如何删除数组中的指定值”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP如何删除数组中的指定值”吧!什么是PHP数组?在PHP中,数组是一种可以存储多个值的数据类型。数...
    99+
    2023-07-05
  • php如何删除数组中的指定的值
    今天小编给大家分享一下php如何删除数组中的指定的值的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。在PHP中,数组是一种重要...
    99+
    2023-07-05
  • 在 Python 中如何删除指定字符之前或之后的所有内容
    文章目录 删除字符后的所有内容,保留分隔符删除最后一次出现的字符后的所有内容删除最后一次出现后的所有内容,保留分隔符使用 str.partition() 删除字符后的所有内容在 Python ...
    99+
    2023-09-21
    python 开发语言
  • 如何使用bat自动删除指定文件夹下前几天的文件
    小编给大家分享一下如何使用bat自动删除指定文件夹下前几天的文件,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!代码如下:@echo off s...
    99+
    2023-06-08
  • python如何删除文件中的指定内容
    要删除文件中的指定内容,可以按以下步骤操作:1. 打开文件,读取内容并存储在变量中。2. 使用字符串的 `replace()` 方法...
    99+
    2023-10-07
    python
  • php如何删除指定k键的键值对
    今天小编给大家分享一下php如何删除指定k键的键值对的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。unset函数PHP中可以...
    99+
    2023-07-05
  • php数组如何删除指定值的元素
    这篇文章主要介绍“php数组如何删除指定值的元素”,在日常操作中,相信很多人在php数组如何删除指定值的元素问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php数组如何删除指定值的元素”的疑惑有所帮助!接下来...
    99+
    2023-07-05
  • php如何删除数组指定键的元素
    这篇文章主要介绍“php如何删除数组指定键的元素”,在日常操作中,相信很多人在php如何删除数组指定键的元素问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php如何删除数组指定键的元素”的疑惑有所帮助!接下来...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作