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

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

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

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

相关推荐
Filotimo_7 分钟前
在java后端开发中,redis的用处
java·开发语言·redis
用户6960950921888 分钟前
Redis序列化与二次Json化
redis
superman超哥23 分钟前
仓颉Option类型的空安全处理深度解析
c语言·开发语言·c++·python·仓颉
2401_8414956424 分钟前
【LeetCode刷题】跳跃游戏Ⅱ
数据结构·python·算法·leetcode·数组·贪心策略·跳跃游戏
Data_agent36 分钟前
OOPBUY模式淘宝1688代购系统搭建指南
开发语言·爬虫·python
星辰_mya39 分钟前
Redis持久化
数据库·redis·缓存
张哈大40 分钟前
AI Ping 上新限免:GLM-4.7 与 MiniMax-M2.1 实测对比
人工智能·python
乘凉~41 分钟前
【Linux作业】Limux下的python多线程爬虫程序设计
linux·爬虫·python
橘子真甜~42 分钟前
Reids命令原理与应用1 - Redis命令与原理
数据库·c++·redis·缓存
xwill*1 小时前
pytorch中项目配置文件的管理与导入方式
人工智能·python