fix_redis_keys.py 2.39 KB
#!/usr/bin/env python3
"""
修复Redis中的key格式问题
将错误的 i2i:* 格式迁移到正确的 item:similar:* 格式
"""
import redis
import sys

def fix_redis_keys():
    """修复Redis key格式"""
    
    # 连接Redis
    redis_client = redis.Redis(
        host='localhost',
        port=6379,
        db=0,
        decode_responses=True
    )
    
    try:
        redis_client.ping()
        print("✓ Redis连接成功")
    except Exception as e:
        print(f"✗ Redis连接失败: {e}")
        return 1
    
    # 统计信息
    print("\n" + "="*80)
    print("当前Redis数据统计:")
    print("="*80)
    
    total_keys = redis_client.dbsize()
    print(f"总Key数量: {total_keys}")
    
    # 统计各类型key
    i2i_keys = redis_client.keys('i2i:*')
    item_similar_keys = redis_client.keys('item:similar:*')
    interest_keys = redis_client.keys('interest:*')
    
    print(f"错误格式 i2i:* 数量: {len(i2i_keys)}")
    print(f"正确格式 item:similar:* 数量: {len(item_similar_keys)}")
    print(f"interest:* 数量: {len(interest_keys)}")
    
    # 询问是否删除错误的key
    print("\n" + "="*80)
    print("⚠️  警告:即将删除所有 i2i:* 格式的key(错误格式)")
    print("="*80)
    
    if i2i_keys:
        print(f"\n将删除 {len(i2i_keys)} 个错误格式的key")
        print("示例:")
        for key in i2i_keys[:5]:
            print(f"  - {key}")
        
        response = input("\n确认删除?(yes/no): ")
        if response.lower() == 'yes':
            # 使用pipeline批量删除
            pipe = redis_client.pipeline()
            for key in i2i_keys:
                pipe.delete(key)
            pipe.execute()
            print(f"✓ 已删除 {len(i2i_keys)} 个错误格式的key")
        else:
            print("取消删除操作")
    else:
        print("✓ 没有需要删除的错误格式key")
    
    # 最终统计
    print("\n" + "="*80)
    print("清理后统计:")
    print("="*80)
    total_keys_after = redis_client.dbsize()
    print(f"总Key数量: {total_keys_after}")
    print(f"item:similar:* 数量: {len(redis_client.keys('item:similar:*'))}")
    print(f"interest:* 数量: {len(redis_client.keys('interest:*'))}")
    
    print("\n✓ 修复完成!现在可以使用修复后的加载脚本重新加载数据。")
    
    return 0


if __name__ == '__main__':
    sys.exit(fix_redis_keys())