174 lines
6.3 KiB
Python
174 lines
6.3 KiB
Python
"""Redis监控和管理工具"""
|
||
from typing import Optional, Dict
|
||
import sys
|
||
from rich.console import Console
|
||
from rich.table import Table
|
||
from rich.prompt import Prompt, Confirm
|
||
|
||
from redis_client import RedisClient
|
||
from config import REDIS_CONFIG
|
||
|
||
console = Console()
|
||
|
||
class RedisMonitor:
|
||
"""Redis监控和管理界面"""
|
||
|
||
def __init__(self):
|
||
"""初始化监控器"""
|
||
self.redis = RedisClient()
|
||
|
||
def _show_db_info(self, db_index: int) -> None:
|
||
"""
|
||
显示数据库详细信息
|
||
|
||
参数:
|
||
db_index: 数据库编号
|
||
"""
|
||
try:
|
||
self.redis.select_db(db_index)
|
||
|
||
table = Table(title=f"数据库 db{db_index} 信息")
|
||
table.add_column("项目", style="cyan")
|
||
table.add_column("值", style="green")
|
||
|
||
# Cookie状态
|
||
cookie = self.redis.get_cookie()
|
||
table.add_row(
|
||
"Cookie状态",
|
||
cookie[:30] + "..." if cookie else "未设置"
|
||
)
|
||
|
||
# 作品统计
|
||
work_count, work_ids = self.redis.get_db_stats()
|
||
table.add_row("已下载作品数", str(work_count))
|
||
|
||
console.print(table)
|
||
|
||
except Exception as e:
|
||
console.print(f"[red]获取数据库信息时出错:{str(e)}[/red]")
|
||
|
||
def show_status(self) -> None:
|
||
"""显示Redis状态和数据库信息"""
|
||
try:
|
||
# 获取活跃数据库
|
||
active_dbs = []
|
||
min_db, max_db = REDIS_CONFIG.db_range
|
||
for db in range(min_db, max_db + 1):
|
||
if self.redis.select_db(db):
|
||
work_count, _ = self.redis.get_db_stats()
|
||
if work_count > 0:
|
||
active_dbs.append(db)
|
||
|
||
if not active_dbs:
|
||
console.print("\n[yellow]当前没有活跃的数据库[/yellow]")
|
||
return
|
||
|
||
# 显示数据库列表
|
||
db_list = ", ".join(f"db{db}" for db in active_dbs)
|
||
console.print(f"\n[cyan]活跃的数据库: {db_list}[/cyan]")
|
||
|
||
# 显示详细信息
|
||
if len(active_dbs) == 1:
|
||
self._show_db_info(active_dbs[0])
|
||
else:
|
||
while True:
|
||
db = Prompt.ask(
|
||
"请选择要查看的数据库编号",
|
||
choices=[str(db) for db in active_dbs]
|
||
)
|
||
self._show_db_info(int(db))
|
||
break
|
||
|
||
except Exception as e:
|
||
console.print(f"[red]获取Redis状态时出错:{str(e)}[/red]")
|
||
|
||
def clear_database(self) -> None:
|
||
"""清空Redis数据库"""
|
||
try:
|
||
# 获取活跃数据库
|
||
active_dbs = []
|
||
min_db, max_db = REDIS_CONFIG.db_range
|
||
for db in range(min_db, max_db + 1):
|
||
if self.redis.select_db(db):
|
||
work_count, _ = self.redis.get_db_stats()
|
||
if work_count > 0:
|
||
active_dbs.append(db)
|
||
|
||
if not active_dbs:
|
||
console.print("\n[yellow]当前没有活跃的数据库[/yellow]")
|
||
return
|
||
|
||
# 显示数据库列表
|
||
db_list = ", ".join(f"db{db}" for db in active_dbs)
|
||
console.print(f"\n[cyan]活跃的数据库: {db_list}[/cyan]")
|
||
|
||
# 显示选项
|
||
console.print("\n清空选项:")
|
||
console.print("1. 清空指定数据库")
|
||
console.print("2. 清空所有数据库")
|
||
console.print("3. 取消操作")
|
||
|
||
choice = Prompt.ask("请选择操作", choices=["1", "2", "3"])
|
||
|
||
if choice == "1":
|
||
if len(active_dbs) == 1:
|
||
db = active_dbs[0]
|
||
if Confirm.ask(f"确定要清空数据库 db{db} 吗?"):
|
||
self.redis.select_db(db)
|
||
self.redis.clear_db()
|
||
console.print(f"[green]数据库 db{db} 已清空[/green]")
|
||
else:
|
||
db = int(Prompt.ask(
|
||
"请选择要清空的数据库编号",
|
||
choices=[str(db) for db in active_dbs]
|
||
))
|
||
if Confirm.ask(f"确定要清空数据库 db{db} 吗?"):
|
||
self.redis.select_db(db)
|
||
self.redis.clear_db()
|
||
console.print(f"[green]数据库 db{db} 已清空[/green]")
|
||
|
||
elif choice == "2":
|
||
if Confirm.ask("确定要清空所有数据库吗?"):
|
||
for db in range(min_db, max_db + 1):
|
||
self.redis.select_db(db)
|
||
self.redis.clear_db()
|
||
console.print("[green]所有数据库已清空[/green]")
|
||
|
||
except Exception as e:
|
||
console.print(f"[red]清空数据库时出错:{str(e)}[/red]")
|
||
|
||
def run(self) -> None:
|
||
"""运行监控界面"""
|
||
while True:
|
||
console.print("\n=== Redis管理工具 ===")
|
||
console.print("1. 显示状态")
|
||
console.print("2. 清空数据库")
|
||
console.print("3. 退出")
|
||
|
||
try:
|
||
choice = Prompt.ask("请选择操作", choices=["1", "2", "3"])
|
||
|
||
if choice == "1":
|
||
self.show_status()
|
||
elif choice == "2":
|
||
self.clear_database()
|
||
else:
|
||
break
|
||
|
||
except KeyboardInterrupt:
|
||
console.print("\n[yellow]用户中断操作[/yellow]")
|
||
break
|
||
except Exception as e:
|
||
console.print(f"[red]发生错误:{str(e)}[/red]")
|
||
|
||
def show_menu() -> None:
|
||
"""Redis监控入口"""
|
||
try:
|
||
monitor = RedisMonitor()
|
||
monitor.run()
|
||
except Exception as e:
|
||
console.print(f"[red]启动Redis管理工具时出错:{str(e)}[/red]")
|
||
|
||
if __name__ == '__main__':
|
||
show_menu()
|