206 lines
12 KiB
Plaintext
206 lines
12 KiB
Plaintext
╔══════════════════════════════════════════════════════════════════════════╗
|
||
║ 自动翻页与缓存系统工作流程图 ║
|
||
╚══════════════════════════════════════════════════════════════════════════╝
|
||
|
||
场景1: 首次搜索(缓存未命中)
|
||
═══════════════════════════════════════════════════════════════════
|
||
|
||
┌─────────────┐
|
||
│ 用户发送命令 │ /text 德州扑克
|
||
└──────┬──────┘
|
||
│
|
||
↓
|
||
┌──────────────────┐
|
||
│ Bot检查数据库缓存 │
|
||
└──────┬───────────┘
|
||
│
|
||
↓
|
||
┌─────────┐
|
||
│ 未命中? │
|
||
└────┬────┘
|
||
│ Yes
|
||
↓
|
||
┌────────────────────────┐ ┌─────────────────────────┐
|
||
│ 转发到搜索Bot @openaiw │──────→│ 搜索Bot返回第1页结果 │
|
||
└────────────────────────┘ └───────────┬─────────────┘
|
||
│
|
||
↓
|
||
┌────────────────────────────────────┐
|
||
│ 【前台】立即显示给用户(秒开) │
|
||
│ - 显示第1页内容 │
|
||
│ - 显示翻页按钮 │
|
||
│ - 用户可以立即操作 │
|
||
└────────────────────────────────────┘
|
||
│
|
||
↓
|
||
┌────────────────────────────────────┐
|
||
│ 【后台】启动自动翻页任务(异步) │
|
||
│ asyncio.create_task() │
|
||
└───────────┬────────────────────────┘
|
||
│
|
||
↓
|
||
┌───────────────────────────────────────┐
|
||
│ 后台循环翻页(用户无感知) │
|
||
│ │
|
||
│ for page in range(2, 11): │
|
||
│ ├─ 等待2秒 │
|
||
│ ├─ 点击"下一页"按钮 │
|
||
│ ├─ 获取新页面内容 │
|
||
│ ├─ 保存到数据库 │
|
||
│ │ • 文本内容 │
|
||
│ │ • 按钮数据(JSON) │
|
||
│ │ • 创建时间 │
|
||
│ └─ 检查是否还有下一页 │
|
||
│ │
|
||
│ 【日志】第2页已保存 │
|
||
│ 【日志】第3页已保存 │
|
||
│ ... │
|
||
│ 【日志】完成,共10页 │
|
||
└───────────────────────────────────────┘
|
||
│
|
||
↓
|
||
┌─────────────────────────┐
|
||
│ 全部保存到SQLite数据库 │
|
||
│ /home/atai/bot_data/ │
|
||
│ cache.db │
|
||
└─────────────────────────┘
|
||
|
||
|
||
场景2: 重复搜索(缓存命中)
|
||
═══════════════════════════════════════════════════════════════════
|
||
|
||
┌─────────────┐
|
||
│ 用户发送命令 │ /text 德州扑克(再次搜索)
|
||
└──────┬──────┘
|
||
│
|
||
↓
|
||
┌──────────────────┐
|
||
│ Bot检查数据库缓存 │
|
||
└──────┬───────────┘
|
||
│
|
||
↓
|
||
┌─────────┐
|
||
│ 命中? │
|
||
└────┬────┘
|
||
│ Yes!
|
||
↓
|
||
┌────────────────────────────────────┐
|
||
│ 从数据库读取缓存数据(秒开!) │
|
||
│ • 读取文本内容 │
|
||
│ • 读取按钮JSON │
|
||
│ • 重建InlineKeyboardMarkup │
|
||
│ • 更新access_count +1 │
|
||
└────────┬───────────────────────────┘
|
||
│
|
||
↓
|
||
┌─────────────────────────┐
|
||
│ 立即显示给用户(秒开!) │
|
||
│ - 不需要请求搜索Bot │
|
||
│ - 不需要网络请求 │
|
||
│ - 按钮完整恢复 │
|
||
│ - 响应时间 < 100ms │
|
||
└─────────────────────────┘
|
||
|
||
|
||
场景3: 用户翻页(缓存命中)
|
||
═══════════════════════════════════════════════════════════════════
|
||
|
||
┌──────────────┐
|
||
│ 用户点击按钮 │ [下一页]
|
||
└──────┬───────┘
|
||
│
|
||
↓
|
||
┌───────────────────────┐
|
||
│ Bot解析callback_data │ 例如:page_5
|
||
└──────┬────────────────┘
|
||
│
|
||
↓
|
||
┌─────────────────────────────┐
|
||
│ 从session获取搜索上下文 │
|
||
│ • command: /text │
|
||
│ • keyword: 德州扑克 │
|
||
│ • page: 5 │
|
||
└──────┬──────────────────────┘
|
||
│
|
||
↓
|
||
┌──────────────────────┐
|
||
│ 检查数据库缓存 │ get_cache(/text, 德州扑克, 5)
|
||
└──────┬───────────────┘
|
||
│
|
||
↓
|
||
┌─────────┐
|
||
│ 命中? │
|
||
└────┬────┘
|
||
│ Yes!
|
||
↓
|
||
┌─────────────────────────────┐
|
||
│ 从缓存加载第5页(秒开!) │
|
||
│ - 完整内容 │
|
||
│ - 所有按钮 │
|
||
│ - edit_message直接替换 │
|
||
└─────────────────────────────┘
|
||
|
||
|
||
═══════════════════════════════════════════════════════════════════
|
||
关键性能指标
|
||
═══════════════════════════════════════════════════════════════════
|
||
|
||
首次搜索:
|
||
├─ 用户看到第1页:~1-2秒(取决于搜索Bot)
|
||
├─ 后台翻页启动:立即(异步)
|
||
└─ 完成10页缓存:~20秒(用户无感知)
|
||
|
||
重复搜索:
|
||
├─ 缓存命中:<100ms(秒开!)
|
||
├─ 按钮完整性:100%
|
||
└─ 无需网络请求
|
||
|
||
缓存翻页:
|
||
├─ 页面切换:<100ms(秒开!)
|
||
├─ 从缓存加载:是
|
||
└─ 请求搜索Bot:否
|
||
|
||
═══════════════════════════════════════════════════════════════════
|
||
数据库结构
|
||
═══════════════════════════════════════════════════════════════════
|
||
|
||
search_cache 表:
|
||
┌─────────────────┬──────────────────────────────────────┐
|
||
│ 字段 │ 说明 │
|
||
├─────────────────┼──────────────────────────────────────┤
|
||
│ id │ 主键,自增 │
|
||
│ command │ 命令(如 /text, /search) │
|
||
│ keyword │ 关键词 │
|
||
│ page │ 页码 │
|
||
│ result_text │ 结果文本 │
|
||
│ result_html │ HTML格式(备用) │
|
||
│ buttons_json │ 按钮数据(JSON格式) │
|
||
│ result_hash │ 内容哈希(用于去重) │
|
||
│ created_at │ 创建时间 │
|
||
│ expires_at │ 过期时间(30天) │
|
||
│ access_count │ 访问次数 │
|
||
│ last_accessed │ 最后访问时间 │
|
||
└─────────────────┴──────────────────────────────────────┘
|
||
|
||
索引:
|
||
• idx_unique_cache (command, keyword, page, result_hash) - 防重复
|
||
• idx_search (command, keyword, page) - 快速查询
|
||
• idx_expires (expires_at) - 过期清理
|
||
|
||
═══════════════════════════════════════════════════════════════════
|
||
当前数据统计
|
||
═══════════════════════════════════════════════════════════════════
|
||
|
||
总缓存记录:245条
|
||
按钮完整性:100% (245/245)
|
||
数据库大小:652KB
|
||
有效缓存:245条
|
||
过期缓存:0条
|
||
|
||
热门缓存:
|
||
1. /text "德州扑克" - 73页
|
||
2. /text "科技" - 52页
|
||
3. /text "德州" - 50页
|
||
|
||
═══════════════════════════════════════════════════════════════════
|