Redis 由浅入深 (6) - Redis批量删除key

news/2024/7/23 21:21:14 标签: redis, bootstrap, 数据库

redis__0">redis 删除缓存

日常工作当中经常会遇到删除Redis key的问题,如果是删除某个key,使用 DEL keyname 或者 EXPIRE keyname ttl 都可以实现。但如果想要一次性删除多个key应该怎么处理呢?Redis本身并不支持批量删除key的操作,下面我们就来看看如何巧妙地处理这类问题。

场景一:删除所有的key

如果需要执行初始化的操作,清理掉数据库所有的键,可以使用 FLUSHDB 或者 FLUSHALL 命令操作。
FLUSHDB 清空当前数据库中的所有key
FLUSHALL 清空整个 Redis 服务器的数据(删除所有数据库的所有key)

场景二:删除所有满足匹配条件的key(key数量较少或者测试环境)

可以在命令行环境下使用 redis-cli 命令在外部执行 KEYS “pattern” 命令,拿到结果以后通过 xargs 命令传递给 DEL 作为输入参数,进而删除匹配的key。具体命令如下:

redis-cli -h hostname -p port -a password -n database --raw keys "pattern" | xargs -I -r -n1 {
   } redis-cli -h hostname -p port -a password -n database DEL "{}"

说明:

  1. redis-cli 是访问 Redis 的客户端命令,用法是:redis-cli [OPTIONS] [cmd [arg [arg …]]]
  2. hostname:服务器主机,port:服务器端口,a:密码(无密码可缺省),n:数据库
  3. 低版本的 Redis 会在返回结果中加上数字编号,使用 --raw 参数可以去掉结果编号
  4. xargs -I {} 参数可以避免 key 中存在空格导致的参数拆分异常问题
    但是这种操作是有限制的,主要受限于KEYS命令。因为 Redis 6 版本以下都是采用单线程处理请求,如果在 key 数量较大的情况下使用 KEYS 命令,会阻塞线程,导致其他客户端无法正常访问,这在生产环境是不可接受的(基于此原因,很多公司生产环境 KEYS 都是禁用的)。这就是接下来要说的第三种场景。
  5. args命令后需加上参数-r,不然当keys的数量为0时,就会报错 (error) ERR wrong number of arguments for ‘del’ command
  6. xargs命令后需加上参数-n1,不然当集群情况keys的数量大于1时,可能会报错 (error) CROSSSLOT Keys in request don’t hash to the same slot
  7. 不加-t也可以,加上-t会输出每次删除的内容,不加则不输出删除的内容,但还是会输出每次删除的key的数量

但是这种操作是有限制的,主要受限于KEYS命令。因为 Redis 6 版本以下都是采用单线程处理请求,如果在 key 数量较大的情况下使用 KEYS 命令,会阻塞线程,导致其他客户端无法正常访问,这在生产环境是不可接受的(基于此原因,很多公司生产环境 KEYS 都是禁用的)。这就是接下来要说的第三种场景。

场景三:删除所有满足匹配条件的key(key数量较多或者生产环境)

为了解决场景二中的 KEYS 命令造成的线程阻塞问题,我们可以使用 SCAN 命令来解决。
让我们先来了解一下 SCAN 命令的使用。
SCAN 用于迭代当前数据库中的数据库键。用法:SCAN cursor [MATCH pattern] [COUNT count]
简单概括一下: SCAN 命令就是通过游标的方式分步从数据库获取数据,每次以游标方式进行遍历(游标从上一次遍历结果中返回,初始游标为0),结果会返回一个新游标和匹配的键集合(键的数量不不确定,与 COUNT 正相关),如果返回游标为0则视为遍历结束(不以遍历结果为空作为结束标识)。可以使用 MATCH 匹配模式,COUNT 限制返回的键的个数。
与 KEYS 命令相比,SCAN 命令虽然复杂度也是 O(n),但是它是通过游标分步进行的,不会阻塞线程。同时


http://www.niftyadmin.cn/n/5397926.html

相关文章

【架构之路】糟糕程序员的20个坏习惯,切记要改掉

文章目录 强烈推荐前言:坏习惯:总结:强烈推荐专栏集锦写在最后 强烈推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站:人工智能 前言: 优秀的程序员…

React 中,children 属性

在 React 中,children 属性是一个特殊的属性,它允许你将组件作为其他组件的子元素传递。这意味着你可以在组件内部嵌套任何类型的子组件或元素,并且在父组件中通过 props.children 访问它们。这为组件的复用和组合提供了极大的灵活性。 以下…

Tomcat架构分析

Tomcat的核心组件 Tomcat将请求器和处理器分离,使用多种请求器支持不同的网络协议,而处理器只有一个。从而网络协议和容器解耦。 Tomcat的容器 Host:Tomcat提供多个域名的服务,其将每个域名都视为一个虚拟的主机,在…

从0到1实现五子棋游戏!!

Hello,好久不见宝子们,今天来给大家更一个五子棋的程序~ 我们今天要讲的内容如下: 文章目录 1.五子棋游戏介绍1.1 游戏玩法介绍: 2.准备工作2.1 具体操作流程 3.游戏程序主函数4.初始化棋盘4.1.定义宏变量4.2 初始化棋盘 5.打印…

Matlab进阶绘图第41期—双三角网格曲面图

在《Matlab论文插图绘制模板第67期—三角网格图(Trimesh)》中,我分享过三角网格曲面图的绘制模板。 然而,有的时候,需要在一张图上绘制两个及以上的三角网格曲面图,且每个三角网格曲面图使用不同的配色方案。 在Matlab中&#x…

LeetCode 2673.使二叉树所有路径值相等的最小代价:自顶向下的DFS 或 自底向上的递推

【LetMeFly】2673.使二叉树所有路径值相等的最小代价:自顶向下的DFS 或 自底向上的递推 力扣题目链接:https://leetcode.cn/problems/make-costs-of-paths-equal-in-a-binary-tree/ 给你一个整数 n 表示一棵 满二叉树 里面节点的数目,节点编…

Unity UI适配规则和对热门游戏适配策略的拆解

前言 本文会介绍一些关于UI适配的基础概念,并且统计了市面上常见的设备的分辨率的情况。同时通过拆解目前市面上较为成功的两款休闲游戏Royal Match和Monopoly GO(两款均为近期游戏付费榜前几的游戏),大致推断出他们的适配策略,以供学习和参…

Redis的发布订阅机制及其使用场景

Redis的发布订阅(Pub/Sub)机制是一种消息通信模式,其中发送者(发布者)将消息发送到特定的频道,而订阅者则订阅其中一个或多个频道,以接收感兴趣的消息。这种模式可以用于构建实时通信系统、消息…