有更好的方案也可以交流一下:
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))
集群版本:
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,测试一下脚本
注意:使用脚本注意语法,复制粘贴可能需要重制空格!!
文章如存在问题,希望各位大佬批评指正。小子一定修改;
或者有更好的方案可以交流讨论