python批量删除redis key

生产环境中要禁止使用keys *查询key, 因为redis低版本是单线程,如果key非常多的话,直接使用keys *会导致阻塞,所以应当使用scan命令,scan命令介绍请参考其他文档。

python 复制代码
# -*- coding: utf-8 -*-
# @Time    : 2025/01/09
# @Author  : 养乐多
# @Mail    : oct_hao@163.com
# @File    : redis_del_keys.py
# @Use     : 利用scan命令批量删除redis key


import redis


class Redis:
    def __init__(self, host, port, db=0):
        '''
        初始化redis连接
        :param host: redis host
        :param port: redis port
        :param db: redis db
        '''
        self.redis_host = host
        self.redis_port = port
        self.redis_db = db
        try:
            # 连接redis
            self.redis_client = self._connect()
        except Exception as e:
            print('redis连接失败', e)

    def _connect(self):
        '''
        连接redis
        '''
        return redis.StrictRedis(host=self.redis_host, port=self.redis_port, db=self.redis_db)

    def _close(self):
        '''
        关闭redis连接
        '''
        self.redis_client.close()

    def batch_delete_keys(self, pattern, batch_size=1000):
        """
        使用 SCAN 命令批量删除匹配给定模式的 Redis 键
        :param pattern: 要删除的键的模式
        :param batch_size: 每次扫描时的键的批量大小
        """
        # 初始化游标
        cursor = 0 

        while True:
            # 使用 SCAN 命令遍历键
            cursor, keys = self.redis_client.scan(cursor=cursor, match=pattern, count=batch_size)
            # 删除匹配的键
            if keys:
                self.redis_client.delete(*keys)
                print('删除了%s个key' % len(keys))
            else:
                break

            if cursor == 0:
                break

        self._close()
    
    def get_all_key_count(self, pattern, batch_size=1000):
        '''
        使用 SCAN 命令批量删除匹配给定模式的 Redis 键
        :param pattern: 要删除的键的模式
        :param batch_size: 每次扫描时的键的批量大小
        '''
        # 初始化游标
        cursor = 0
        # 初始化计数器
        count = 0  

        while True:
            # 使用 SCAN 命令遍历键
            cursor, keys = self.redis_client.scan(cursor=cursor, match=pattern, count=batch_size)
            # 统计匹配的键的数量
            if keys:
                count += len(keys)
            else:
                break

            if cursor == 0:
                break

        self._close()
        return count

if __name__ == "__main__":
    redis_host = '172.30.11.132'
    redis_port = 6379
    redis_db = 0
    pattern = '*123'
    batch_size = 1000

    # 连接到 Redis
    r = Redis(redis_host, redis_port, redis_db)
    # 查询key总数
    print(r.get_all_key_count(pattern=pattern, batch_size=batch_size))
    # 删除key
    # r.batch_delete_keys(pattern=pattern, batch_size=batch_size)
相关推荐
一起逃去看海吧1 分钟前
Function Calling
python
孟陬2 分钟前
Node.js v26.0 新增超甜的语法糖 getOrInsert / getOrInsertComputed 介绍
python·node.js
xu_ws4 分钟前
redis的io多路复用和Java NIO的区别
java·redis·nio
wmm_会飞的@鱼4 分钟前
FlexSim-基于SLP方法的A汽车企业总装车间布局优化
前端·数据结构·数据库·python·数学建模·汽车
凯瑟琳.奥古斯特4 分钟前
深度学习入门:用PyTorch实现MNIST手写数字识别
pytorch·python·深度学习
源码之家6 分钟前
计算机毕业设计:Python智慧医疗问答系统 知识图谱 Flask框架 数据可视化 neo4j图数据库 大模型 agent(建议收藏)✅
大数据·python·数据挖掘·数据分析·flask·知识图谱·课程设计
Ulyanov9 分钟前
《从质点到位姿:基于Python与PyVista的导弹制导控制全栈仿真》: 同台竞技——3-DOF与6-DOF模型的终极对决与误差分析
开发语言·python·算法·系统仿真·雷达电子对抗仿真
CHANG_THE_WORLD10 分钟前
二次重命名对文件批量重命名
开发语言·python
加号310 分钟前
【C#】 通过 Python.NET 调用 Python pyd 扩展模块:多类交互与参数传递实践指南
python·c#·.net