微信、微博的点赞功能是怎么实现的? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
klausgao
V2EX    程序员

微信、微博的点赞功能是怎么实现的?

  •  1
     
  •   klausgao 2017-08-02 17:57:45 +08:00 11831 次点击
    这是一个创建于 3022 天前的主题,其中的信息可能已经有所发展或是发生改变。
    本来以为很简单的,但是如果是一个 timeline 列表,有很多的各个 up 主的点赞内容,难不成是循环 sql 取出点赞列表?效率那么低也不对吧?
    第 1 条附言    2017-08-02 21:24:42 +08:00
    也许我也没说清楚,例如微信朋友圈里,a b c 用户发的图或文字下面,就有点赞好友的名字列表,还有回复的内容,我现在只能想到先取出好友发表的内容,再通过内容的 ID 循环取出各个内容的点赞人和回复的内容,但是这样的效率就很低了。
    所以这个要怎么设计数据结构才能提高效率?
    31 条回复    2017-08-03 18:13:10 +08:00
    geelaw
        1
    geelaw  
       2017-08-02 18:05:03 +08:00 via iPhone
    请先把你的问题描述清楚
    nutting
        2
    nutting  
       2017-08-02 18:07:52 +08:00
    这种一般都是 key value 的数据吧
    breadenglish
        3
    breadenglish  
       2017-08-02 18:08:59 +08:00
    mongoDB 之流
    whatsmyip
        4
    whatsmyip  
       2017-08-02 18:29:32 +08:00
    redis list 就可以做到吧
    run2
        5
    run2  
       2017-08-02 18:36:14 +08:00
    timeline 列表里获取每个点赞的用户是伪需求吧, 只要知道个数就行了 cache 一下点赞数
    klausgao
        6
    klausgao  
    OP
       2017-08-02 21:18:57 +08:00 via iPhone
    @sobigfish 怎么是伪需求啊?微信朋友圈不是吗?
    klausgao
        7
    klausgao  
    OP
       2017-08-02 21:19:31 +08:00 via iPhone
    casparchen
        8
    casparchen  
       2017-08-02 21:23:53 +08:00
    graph database 最适合这种了
    ericbize
        9
    ericbize  
       2017-08-02 21:55:48 +08:00
    我就记得 上 Database system 的时候老师说过,当年 FB 被点赞点到数据库挂了。
    owenliang
        10
    owenliang  
       2017-08-02 22:42:41 +08:00
    文章表,点赞表,留言表,根据文章 ID 查出点赞和留言。。。不知道楼主说的循环是什么意思。。
    iyaozhen
        11
    iyaozhen  
       2017-08-02 22:51:06 +08:00 via Android
    [再通过内容的 ID 循环取出各个内容的点赞人和回复的内容,但是这样的效率就很低了。 ]
    不慢吧,每个内容的点赞人和评论存 MySQL 的话一把也就差出来了
    iiduce
        12
    iiduce  
       2017-08-02 22:51:34 +08:00
    在 mongodb 中使用 EmbeddedModelField 字段放置点赞信息 model,同时最好添加一个点赞数字段。

    如果是 sql 数据库,应该使用存储过程?好些年没用 sql 了,记不清了。
    klausgao
        13
    klausgao  
    OP
       2017-08-02 22:52:48 +08:00 via iPhone
    @owenliang 那是个 timeline 啊,有很多的文章
    klausgao
        14
    klausgao  
    OP
       2017-08-02 22:53:24 +08:00 via iPhone
    @iyaozhen timeline 有很多文章啊,要查很多次啊
    iiduce
        15
    iiduce  
       2017-08-02 22:54:54 +08:00
    更正:mongodb 应该是放置 ListField(EmbeddedModelField(赞 model), null=True, blank=True)

    我的系统中是这样写的:
    favorites = ListField(EmbeddedModelField(favorite), null=True, blank=True)
    favorite_num = models.IntegerField(u'喜欢数目', default = 0, db_index=True)
    geelaw
        16
    geelaw  
       2017-08-02 23:43:54 +08:00 via iPhone
    可以 join 啊……你把状态的表和评论的表 join 一下咯,这样就会得到状态和每条评论,然后再按状态分组,格式化,返回。
    rootx
        17
    rootx  
       2017-08-03 01:43:10 +08:00 via iPhone
    key-value 形式存 json 数据如何?只要取出当前 ID 的 value 数量和内容就都出来了。
    klausgao
        18
    klausgao  
    OP
       2017-08-03 08:55:01 +08:00 via iPhone
    @geelaw 谢谢,这个似乎是最好的方案了
    Ouyangan
        19
    Ouyangan  
       2017-08-03 09:32:03 +08:00
    @geelaw #16 分库分表的时候一般不 join....
    klausgao
        20
    klausgao  
    OP
       2017-08-03 10:46:31 +08:00
    @Ouyangan 是哦,有这个问题。请问你们公司是怎么解决的?
    zacard
        21
    zacard  
       2017-08-03 13:46:46 +08:00
    这个应该是异构数据存在例如 redis 的系统中,一次就把点赞、留言内容等都取出来
    ty89
        22
    ty89  
       2017-08-03 13:59:48 +08:00
    《会的太少 想的太多系列》
    klausgao
        23
    klausgao  
    OP
       2017-08-03 14:09:11 +08:00
    @ty89 你是傻逼吗?
    run2
        24
    run2  
       2017-08-03 14:59:34 +08:00
    @klausgao #23 微信的列表里比你想的更复杂,因为只显示共同好友的回复内容
    所以专门为每个用户生成了他浏览的 timeline
    可以看看这个
    www.infoq.com/cn/presentations/technology-of-weixin-moments InfoQ 首页 演讲 微信朋友圈技术之道
    www.infoq.com/cn/articles/three-people-background-team-and-billions-daily-release 摘要
    v9ox
        25
    v9ox  
       2017-08-03 15:00:39 +08:00 via iPhone
    某点赞公司路过

    php 端确实是俺楼主所说 先抓 post 然后每个 post 去获取点赞
    后端的设计是 graph 和 sql 具体的还没看过
    klausgao
        26
    klausgao  
    OP
       2017-08-03 15:14:05 +08:00
    @sobigfish 这个真心是恐怖了。收藏了慢慢学习。
    klausgao
        27
    klausgao  
    OP
       2017-08-03 15:17:01 +08:00
    @v9ox 我是觉得在我的需求下 @geelaw 的#16 方案是最合适的,一次 join 可以把数据取出来,再进行分组合并,返回的数据量就能很小。或者直接不用分组合并,把数据压缩下直接返回前端,前端再进行分组合并即可。
    ty89
        28
    ty89  
       2017-08-03 16:57:28 +08:00
    @klausgao

    这里不是垃圾堆,先别急着喷脏话,出门左转百度贴吧更适合你
    klausgao
        29
    klausgao  
    OP
       2017-08-03 17:19:36 +08:00 via iPhone
    @ty89 看看大家的回帖,不是什么人都像你那么自以为是眼高手低的,这个是程序员节点,不是水区,相互学习吧。
    ppwangs
        30
    ppwangs  
       2017-08-03 17:36:16 +08:00
    把点赞当成评论的一种
    iyaozhen
        31
    iyaozhen  
       2017-08-03 18:13:10 +08:00 via Android
    @klausgao 你 timeline 不分页吗?一次 20 也没多少呀

    其实这就是一个典型的多线程 /协程应用场景
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1018 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 22:55 PVG 06:55 LAX 14:55 JFK 17:55
    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