📌 背景:一次"好心办坏事"的重构
最近博客程序进行了一次逻辑大改造,核心目标很明确:优化页面加载速度、降低服务器资源占用。
思路很简单——把之前直查数据库的形式改为将数据缓存到内存里(类似 Redis 的效果)。方案是优先查询缓存结果,出于对 FreeSql 的熟悉和习惯使然,我直接用了 WithMemory 这个方式来适配它的查询体系。
// 改造前的代码风格
var values = await _freeSql.Select<T>().ToListAsync();
// 改造后(自以为很优雅)
string key = $"{nameof(MemoryCacheService)}_{typeof(T).FullName}_{nameof(GetMemeryTData)}";
var dataSource = _memoryCache.GetOrCreate(key, entry =>
{
entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromDays(7);
var _list = _freeSql.Select<T>().Where(e => e.IsDeleted == false).ToList();
return _list;
});
return dataSource ?? new List<T>();
//缓存的结果加载进Freesql里进行计算
Freesql.Select<T>().WithMemory(dataSource);
📊 初期效果:没感觉,甚至有点失望
刚改造完那会儿,其实并没有感觉到相比之前有些许提升。大约莫快个1-2秒吧?感觉差别不是很大。当时觉得是服务器配置太差的缘故(毕竟用的是低配ECS云主机),就没太在意。
🚨 突发故障:同事反馈"打开特别慢"
上周有同事闲着访问博客,说这边打开特别特别慢。自己试了下确实很慢——打得开,但是需要加载很久。重启几次程序也不行,最后只能重启服务器恢复正常(以前从来没出现过这个情况)。
大致的排查过程记录(能力有限 只能查到这些了)
| 检查项 | 结果 |
|---|---|
| Nginx 日志 | 无异常请求、连接数正常 |
| 硬件资源监控 | CPU/内存无明显飙升 |
| 系统日志 | 未发现明显错误信息 |
| FreeSql 配置 | 缓存策略看起来没问题 |
排查一圈也发现不了具体原因,最后只能重启服务器暂时恢复。这种"偶发性慢"最搞心态了——你根本不知道问题出在哪。
🔍 AI诊断:性能隐患终于浮出水面
出于无奈,我用AI检查了下近期改动的代码。在AI给出的性能隐患给出的清单里发现了 FreeSql 的 WithMemory 这个方法的可能导致的性能问题。
🧪 代码自测验证(加了计时器自测)
测试结果:FreeSql 的 WithMemory + 数据缓存这个方法居然要2秒以上!
💡 AI给出的诊断结论
核心问题:WithMemory 功能会将内存数据转换为复杂的 SQL 查询,导致以下性能损耗:
- 生成极其庞大的 SQL 语句
- 数据库解析优化开销巨大
- 网络传输开销增加
- 失去了内存查询的优势(缓存反而变慢)
🛠️ 解决方案:改用 LINQ + 手动缓存管理
根据 AI的优化建议,我改用了 LINQ 查询方式配合外部缓存管理器。效果立竿见影——1ms都不需要,页面基本秒开。
小结: 估摸着之前的代码存在混用WithMemory存在调用Incloud的情况 导致内存和数据库混查的情况导致了网站加载非常慢的情况,但为啥必须得重启服务器才能恢复的原因 能力有限就不得而知了