postgresql 中存 json 还是存传统的结构?以及是否有必要用 Redis 做缓存? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cnnblike
V2EX    问与答

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

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

    前情提要: 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     Solana     3582 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 10:31 PVG 18:31 LAX 02:31 JFK 05:31
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86