V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
cnnblike
V2EX  ›  问与答

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

  •  
  •   cnnblike · 2017-04-27 04:12:33 +08:00 · 2737 次点击
    这是一个创建于 2796 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前情提要: 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
        1
    ericls  
       2017-04-27 08:20:10 +08:00 via iPhone
    用 redis 怎么 invalidate? Redis 里面存什么数据 这些数据拿到 node 怎么拼接成最后的数据?
    cnnblike
        2
    cnnblike  
    OP
       2017-04-27 08:46:44 +08:00
    @ericls LRU 吧主要还是,想不出啥高明的做法。duoshuo 的服务器端应该回应的都是 json 结构的东西,比方说吧,看这个接口“ http://dev.duoshuo.com/docs/50398b4b8551ece011000023 ”,这里的返回的整个 json 内容就保存在字符串中,等又收到请求说要某个博客的热评榜的时候就直接读取这个字符串,发出去就行,这样开销应该是最小的。
    ericls
        3
    ericls  
       2017-04-27 09:01:18 +08:00 via iPhone
    @cnnblike 比如有一个小部分更新了 你要同步那个大的缓存
    cnnblike
        4
    cnnblike  
    OP
       2017-04-27 09:18:44 +08:00
    @ericls redis 说到底就是缓存吧,反正每次有写入操作的时候(不到总请求的 1%)直接对 postgresql 里面的数据修改,ORM 出来的对象再 json 化后送到 redis 里面,想不出啥更好的办法了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2713 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 07:32 · PVG 15:32 · LAX 23:32 · JFK 02:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.