• 删除线上无用redis数据的方案(telnet+scan+python脚本)


    有更好的方案也可以交流一下:
    0、新建存储无用key的文档
    1、收集线上所有的redis的key(从存在的项目中收集)
    2、通过telnet ip 端口 连接redis客户端 例如:telnet 172.11.11.11 6379
    3、进入如果有password,则需要输入: auth xxx(你的password)
    4、测试读取一个存在的key,确认连接
    5、通过 scan 0 match xx:* count 数量的形式,例如:scan 0 match xx:* count 10000
    (具体参照scan用法,注意在scan遍历的时候不能删除或者添加),注意xx:*尽量只匹配一种key ,而count的数量可以根据自己redis的key的总数来定,匹配出来结果,观察该前缀的key的数量 记录到文档,get某一个来记录到文档;
    6、对存有几乎所有redis 的key的信息的文档,进行组内评审,决定哪些需要删除,进行标记
    7、使用python进行删除 python环境,pip/pip3环境
    8、确认python环境,pip环境,
    并安装reids客户端的api:pip install redis(单机)/pip install redis-py-cluster(集群)
    9、写python脚本来对我们的无用的key进行删除,具体就是scan+del (需要注意scan过程中进行删除会存在问题,所以需要收集起来再删除),当然删除还有异步形式unlink但是我没用;

    单机脚本:

    (需要注意,复制粘贴可能会存在语法解析问题,需要把存在空格的地方,删除空格使用space空格补齐,缩进保持一致即可因为python语法跟缩进有关)

    import redis
    
    redis_conn = redis.Redis(
        host='ip',
        port=6379,
        password='密码',
        db=0,
        decode_responses=True)
    
    # 验证连接是否成功  
    if redis_conn.ping():  
        print('Connection to Redis is successful.')  
    else:  
        print('Connection to Redis failed.')
    
    match_keys=[]#收集需要进行删除的字符匹配串
    #添加你需要删除的reids的匹配前缀
    match_keys.append('road:road:lane:*')
    
    del_keys=[]#收集所有需要进行删除的key
    
    #遍历所有匹配的key,放到列表
    cursor = 0# 记录游标
    for match_key in match_keys:
       print('=================')
       print('match_key:',match_key)
       while True:
           cursor, keys= redis_conn.scan(cursor, match=match_key, count=10000)
           if keys:
             print('key len:',len(keys))
             for key in keys:
                del_keys.append(key)
           if cursor == 0:break
    #删除需要删除的列表中的key
    for del_key in del_keys:
        print('del:',del_key)
        print('flag:',redis_conn.delete(del_key))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    集群版本:

    import redis
    from rediscluster import RedisCluster
    
    
    port = 6379
    # redis连接信息
    # 应该是为了保证主从一致才需要连接所有的redis机器,然后在一个上修改,多个节点同步
    redis_basis_conn = [
        {'host': 'ip1', 'port': port},
        {'host': 'ip2', 'port': port},
        {'host': 'ip3', 'port': port},
    ]
    
    
    
    redis_conn= RedisCluster(startup_nodes=redis_basis_conn, password="你的密码")
    
    
    # 验证连接是否成功  
    if redis_conn.ping():  
        print('Connection to Redis is successful.')  
    else:  
        print('Connection to Redis failed.')  
    
    
    match_keys=[]
    match_keys.append('road:road:lane:*')
    
    del_keys=[]
    
    
    cursor = 0
    for match_key in match_keys:
       print('=================')
       print('match_key:',match_key)
       while True:
          temp= redis_conn.scan(cursor, match=match_key, count=10000)
          print(temp)#返回一个字典
          cursor,keys=temp['ip:端口']#在某一个机器上修改
          print(cursor)
          print(keys)
          if keys:
          	print('key len:',len(keys))
          	for key in keys:
                del_keys.append(key)
          if cursor == 0:break
    for del_key in del_keys:
    	print('del:',del_key)
    	print('flag:',redis_conn.delete(del_key))
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    通过python 文件.py 就可以匹配+删除了,可以先自己设置几个key,测试一下脚本
    注意:使用脚本注意语法,复制粘贴可能需要重制空格!!
    文章如存在问题,希望各位大佬批评指正。小子一定修改;
    或者有更好的方案可以交流讨论

  • 相关阅读:
    电脑一直蓝屏怎么办?重装系统方法
    【Linux Clock Framework】
    udev 挂载SD卡 USB设备
    Solidty智能合约开发-简易入门
    java EE初阶 — 线程的状态
    2067: [蓝桥杯2023初赛] 幸运数
    sqlserver 常用日期操作
    怎么在爬虫中使用ip代理服务器,爬虫代理IP的好处有哪些?
    C/C++通过位操作实现2个uint32_t合并为uint64_t
    cookie session 和 token还有单点登录
  • 原文地址:https://blog.csdn.net/an_gentle_killer/article/details/133811935