#!/usr/bin/env node /** * Redis 键调试工具 * 用于查看 Redis 中存储的所有键和数据结构 */ const redis = require('../src/models/redis'); const logger = require('../src/utils/logger'); async function debugRedisKeys() { try { logger.info('🔄 Connecting to Redis...'); await redis.connect(); logger.success('✅ Connected to Redis'); // 获取所有键 const allKeys = await redis.client.keys('*'); logger.info(`\n📊 Total keys in Redis: ${allKeys.length}\n`); // 按类型分组 const keysByType = { apiKeys: [], claudeAccounts: [], geminiAccounts: [], admins: [], sessions: [], usage: [], other: [] }; // 分类键 for (const key of allKeys) { if (key.startsWith('apikey:')) { keysByType.apiKeys.push(key); } else if (key.startsWith('claude_account:')) { keysByType.claudeAccounts.push(key); } else if (key.startsWith('gemini_account:')) { keysByType.geminiAccounts.push(key); } else if (key.startsWith('admin:') || key.startsWith('admin_username:')) { keysByType.admins.push(key); } else if (key.startsWith('session:')) { keysByType.sessions.push(key); } else if (key.includes('usage') || key.includes('rate_limit') || key.includes('concurrency')) { keysByType.usage.push(key); } else { keysByType.other.push(key); } } // 显示分类结果 console.log('='.repeat(60)); console.log('📂 Keys by Category:'); console.log('='.repeat(60)); console.log(`API Keys: ${keysByType.apiKeys.length}`); console.log(`Claude Accounts: ${keysByType.claudeAccounts.length}`); console.log(`Gemini Accounts: ${keysByType.geminiAccounts.length}`); console.log(`Admins: ${keysByType.admins.length}`); console.log(`Sessions: ${keysByType.sessions.length}`); console.log(`Usage/Rate Limit: ${keysByType.usage.length}`); console.log(`Other: ${keysByType.other.length}`); console.log('='.repeat(60)); // 详细显示每个类别的键 if (keysByType.apiKeys.length > 0) { console.log('\n🔑 API Keys:'); for (const key of keysByType.apiKeys.slice(0, 5)) { console.log(` - ${key}`); } if (keysByType.apiKeys.length > 5) { console.log(` ... and ${keysByType.apiKeys.length - 5} more`); } } if (keysByType.claudeAccounts.length > 0) { console.log('\n🤖 Claude Accounts:'); for (const key of keysByType.claudeAccounts) { console.log(` - ${key}`); } } if (keysByType.geminiAccounts.length > 0) { console.log('\n💎 Gemini Accounts:'); for (const key of keysByType.geminiAccounts) { console.log(` - ${key}`); } } if (keysByType.other.length > 0) { console.log('\n❓ Other Keys:'); for (const key of keysByType.other.slice(0, 10)) { console.log(` - ${key}`); } if (keysByType.other.length > 10) { console.log(` ... and ${keysByType.other.length - 10} more`); } } // 检查数据类型 console.log('\n' + '='.repeat(60)); console.log('🔍 Checking Data Types:'); console.log('='.repeat(60)); // 随机检查几个键的类型 const sampleKeys = allKeys.slice(0, Math.min(10, allKeys.length)); for (const key of sampleKeys) { const type = await redis.client.type(key); console.log(`${key} => ${type}`); } } catch (error) { logger.error('💥 Debug failed:', error); } finally { await redis.disconnect(); logger.info('👋 Disconnected from Redis'); } } // 运行调试 debugRedisKeys().catch(error => { logger.error('💥 Unexpected error:', error); process.exit(1); });