删除线上无用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语法跟缩进有关)

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))

集群版本:

python 复制代码
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))

通过python 文件.py 就可以匹配+删除了,可以先自己设置几个key,测试一下脚本

注意:使用脚本注意语法,复制粘贴可能需要重制空格!!

文章如存在问题,希望各位大佬批评指正。小子一定修改;

或者有更好的方案可以交流讨论

相关推荐
X56615 分钟前
CSS如何处理SSR中CSS引入_在服务端渲染时提取关键CSS
jvm·数据库·python
duke86926721439 分钟前
PostgreSQL 中高效插入多对多关联数据的三种方案对比与最佳实践
jvm·数据库·python
狮子座明仔1 小时前
AgentSPEX:当 Agent 框架开始把“控制流“从 Python 里抠出来
开发语言·python
m0_463672201 小时前
mysql数据库如何进行逻辑备份与物理备份对比_优缺点分析
jvm·数据库·python
2401_867623981 小时前
SQL如何进行分组后字符串拼接_使用GROUP_CONCAT或STRING_AGG
jvm·数据库·python
kexnjdcncnxjs1 小时前
MySQL触发器无法触发的原因分析_MySQL触发器排查指南
jvm·数据库·python
Java后端的Ai之路1 小时前
CodeBuddy-Rules配置
人工智能·python·ai编程
拾-光1 小时前
【Git】命令大全:从入门到高手,100 个最常用命令速查(2026 版)
java·大数据·人工智能·git·python·elasticsearch·设计模式
AI玫瑰助手2 小时前
Python流程控制:break与continue语句的区别与应用
开发语言·python·信息可视化
棉猴2 小时前
python海龟绘图之画布与窗口
javascript·python·html·setup·turtle·海龟绘图·screensize