代码Review

背景:

  公司APP社区模块首页数据,第一版从数据库拉取,由于关联表过多,数据量较大,导致查询较慢。通过监控查看接口TPM,实在惨不忍睹。SQL优化后,效果不佳,第二版上线内存数据库redis,将第一页数据缓存到redis中,直接拉取cache。由于当时为了降低数据库压力,急忙上线后,才发现添加缓存带了很多业务上的处理,如:用户点赞,发表动态,评论,回复时缓存的处理,缓存的排序处理等。第三版着重进行代码的Review,填补第二版的坑。

The Key:

  1、快速定位问题

       分析何种操作触发了问题,通过代码断点调试,进行操作重现问题。(保证测试环境同线上版本一致)

  2、灵活解决问题

       确定问题,找到解决方案后,及时编码验证。若长时间卡在某地方,进行讨论,若方案暂时无法解决,寻找其他解决方案。

Code:

  1、插入排序

for (int i = 1, l = TrendsList.Count; i < l; i++)
{
    int insertIndex = i - 1;var insertVal = TrendsList[i];
    while (insertIndex >= 0 && DateTime.Compare(insertVal.Time, TrendsList[insertIndex].Time) > 0)
    {
        TrendsList[insertIndex + 1] = TrendsList[insertIndex];
        insertIndex--;
    }
    TrendsList[insertIndex + 1] = insertVal;
}

 插入排序适用于最新,按照发表时间排序(忽略置顶,实际项目中会添加置顶)。

 2、LINQ

int praiseCount = 0;
string isTop = "0";
foreach (var item in TrendsList)
{
    praiseCount = item.Praise.Count + item.ReplyList.Count * 5;
    isTop = Convert.ToBoolean(item.IsTop) ? "1" : "0";
    if (item.SortKey == null)
    {
        item.SortKey = isTop + praiseCount.ToString("000000000");
    }
}
trend.SortKey = "0" + (trend.Praise.Count + trend.ReplyList.Count * 5 + 1).ToString("000000000");
TrendsList.Insert(0, trend);
TrendsList = TrendsList.OrderByDescending(o => o.SortKey).ToList();

 实体类添加排序字段(根据热门排序规则),使用List的linq倒序排列,在点赞数暂时未超过100000000时问题得以解决。

posted @ 2017-03-07 18:25  饿其体肤  阅读(285)  评论(0编辑  收藏  举报