V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
klausgao
V2EX  ›  程序员

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

  •  1
     
  •   klausgao · 2017-08-02 17:57:45 +08:00 · 11382 次点击
    这是一个创建于 2665 天前的主题,其中的信息可能已经有所发展或是发生改变。
    本来以为很简单的,但是如果是一个 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 就可以做到吧
    sobigfish
        5
    sobigfish  
       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 你是傻逼吗?
    sobigfish
        24
    sobigfish  
       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   ·   实用小工具   ·   1009 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 21:40 · PVG 05:40 · LAX 13:40 · JFK 16:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.