删除线上无用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,测试一下脚本

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

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

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

相关推荐
mr_LuoWei20099 分钟前
python工具:python代码知识库笔记
数据库·python
weixin_395448919 分钟前
cursor日志
人工智能·python·机器学习
这周也會开心19 分钟前
Redis数据类型的底层实现和数据持久化
数据库·redis·缓存
天天爱吃肉821827 分钟前
【跨界封神|周杰伦×王传福(陶晶莹主持):音乐创作与新能源NVH测试,底层逻辑竟完全同源!(新人必看入行指南)】
python·嵌入式硬件·算法·汽车
岱宗夫up40 分钟前
Python 数据分析入门
开发语言·python·数据分析
码界筑梦坊42 分钟前
325-基于Python的校园卡消费行为数据可视化分析系统
开发语言·python·信息可视化·django·毕业设计
asheuojj44 分钟前
2026年GEO优化获客效果评估指南:如何精准衡量TOP5关
大数据·人工智能·python
多恩Stone1 小时前
【RoPE】Flux 中的 Image Tokenization
开发语言·人工智能·python
网安墨雨1 小时前
Python自动化一------pytes与allure结合生成测试报告
开发语言·自动化测试·软件测试·python·职场和发展·自动化
powerfulhell1 小时前
寒假python作业5
java·前端·python