cnnblike
V2EX  ›  问与答

postgresql 中存 json 还是存传统的结构?以及是否有必要用 Redis 做缓存?

  •  
  •   cnnblike · Apr 27, 2017 · 3996 views
    This topic created in 3487 days ago, the information mentioned may be changed or developed.

    前情提要: https://www.v2ex.com/t/355150#reply6

    仔细考虑后,最后决定用 Node.JS+koa+Sequelize.JS+Postgresql 这一套搞后端,纯 API,渲染统一放在前端,后端渲染还要浪费 VPS 的 CPU 时间,不能忍。

    多说的 api 的 request 和 response 都是 json 结构的,我查了一下,Javascript 的 JSON.Encode 会比 Python 的快不少: http://szborows.blogspot.com/2016/03/mini-restjson-benchmark-python-351-vs.html, 所以选的 NodeJS

    仔细分析博客评论系统的时间消耗

    ————考虑到大部分用户都是只读评论,并不写评论,即使是最优秀的博客,留言率也不超过 1%,也就是说,这是一个读远远多于写的服务。 除了不能消除的数据库查询时间(这一部分可以通过把这一整套东西放在 SSD-VPS 上尽量加快),剩下的从多到少应该是用“ ORM 映射到对象”,第二应该是“对象转换为 json ”。也就是说,JSON-对象-数据库中的数据的互转应该是最耗费时间的部分了。

    +--------+
    |        |    +-----------+   +------------+
    | Nodejs |    |           |   |            |
    | Koa    +----+ sequelize +---+ Postgresql |
    |        |    |           |   |            |
    +---+----+    +-----------+   +------------+
        |
        |
    +---+----+
    |        |
    | Redis  |
    |        |
    +--------+
    

    那么如果要考虑性能的话,那么加上一个 Redis 做服务器的缓冲————事实上只要缓冲最频繁读取的那一部分,就可以大大减少“ ORM 映射到对象”和“对象转换为 json ”这个两个操作了,也就是说,问题完美解决。

    问题是,我这样的设计是否有问题呢? Redis 是否有必要?

    接着就是 Postgresql 里面设计的时候是否有必要预先计算好各种请求的结果做存储呢?比方说

    1. 不存储评论的数据,存储评论的 json 形式的回答数据,在修改的时候先当字符串读取,读取完了修改之后再用 json 接着再回写? 或者
    2. 以传统数据库形式存储评论的数据,只在 redis 中存储 json 形式的缓冲?

    因为之前没想过类似的问题,所以也不知道这么想对不对。请各位大佬帮忙指点

    ericls
    ericls
    Apr 27, 2017 via iPhone
    1
    用 redis 怎么 invalidate? Redis 里面存什么数据 这些数据拿到 node 怎么拼接成最后的数据?
    cnnblike
    cnnblike
    OP
    Apr 27, 2017
    2
    @ericls LRU 吧主要还是,想不出啥高明的做法。duoshuo 的服务器端应该回应的都是 json 结构的东西,比方说吧,看这个接口“ http://dev.duoshuo.com/docs/50398b4b8551ece011000023 ”,这里的返回的整个 json 内容就保存在字符串中,等又收到请求说要某个博客的热评榜的时候就直接读取这个字符串,发出去就行,这样开销应该是最小的。
    ericls
    ericls
    Apr 27, 2017 via iPhone
    3
    @cnnblike 比如有一个小部分更新了 你要同步那个大的缓存
    cnnblike
    cnnblike
    OP
    Apr 27, 2017
    4
    @ericls redis 说到底就是缓存吧,反正每次有写入操作的时候(不到总请求的 1%)直接对 postgresql 里面的数据修改,ORM 出来的对象再 json 化后送到 redis 里面,想不出啥更好的办法了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4360 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 08:09 · PVG 16:09 · LAX 00:09 · JFK 03:09
    ♥ Do have faith in what you're doing.