Markdown 博客的渲染、缓存与阅读统计

渲染放在读取时还是写入时?阅读量怎么统计才不拖慢页面?这里有两个务实的选择。

Markdown 博客的渲染、缓存与阅读统计

博客的存储格式和展示格式应该分离:数据库保存 Markdown,页面按需渲染 HTML。

为什么不存渲染结果

存 HTML 看起来更快,但会带来两个问题:模板或渲染规则升级后,历史文章需要批量重刷;同一个字段存在两种事实来源,容易不一致。

把渲染封装成属性,语义清晰:

@property
def content_html(self):
    return render_markdown(self.content_md)

访问量不大时这点开销可以忽略;如果确实需要优化,可以在服务层加短时缓存,而不是改动数据模型。

阅读量统计

最直接的实现是每次详情页访问执行一次自增:

Post.query.filter_by(id=post.id).update({"views": Post.views + 1})
db.session.commit()

注意两点:用数据库自增而不是「读出来加一」,避免并发覆盖;统计失败不应该阻断页面渲染。

首页聚合

首页需要最新文章、精选文章和统计数据,这些查询各自独立。把它们组合在服务层,模板只负责展示,避免在 Jinja 里写 SQL 逻辑。

体验细节

  • 阅读时长按字符数估算,给读者一个预期
  • 相关文章优先同分类,不足时用最新文章补齐
  • 标签与分类筛选参数保留在分页链接中