美文网首页java学习
千万级用户站内信设计思路

千万级用户站内信设计思路

作者: 中v中 | 来源:发表于2019-04-17 12:16 被阅读3次

    千万级用户

    当用户量很大的时候,第二种方法也不行了,因为但凡每个系统,都有大量无效用户,即长期不在线之类的这种的。

    那我们每次还要给他插入一条状态数据,是不是很没有必要?

    表名:letter

    id,manager_id(管理员id),user_id(用户id,为0则是全部用户),content(站内信内容),create_at(发送时间)

    表名:letter_status

    id,user_id(用户id),letter_id(站内信的id),status(状态查看状态)

    letter表的user_id字段,需要存储为id,id,id的格式,例如3,15,23,45,把用户的id已逗号分隔的形式存储。

    letter_status表不操作。

    这样,当用户登录的时候,证明该用户为有效用户,查询遍历letter表,查询user_id为0或者当前用户id在user_id中的站内信,可以用mysql的find_in_set('str', filed)查询。

    比如当前用户的id为1;

    SQL语句:
    SELECT * FROM letter WHERE user_id=0 OR find_in_set(1, user_id);

    查询出来存在有站内信后,查询letter_status是否已经存在该条站内信,并且user_id是否为当前用户。 如果不存在,则插入一条到letter_status,这样用户就有一条未读站内信了。

    也可以用关联查询:
    SELECT letter.*,letter_status.id AS status_id FROM letter LEFT JOIN leter_status ON letter.id=leter_status.letter_id
    WHERE letter.user_id=0 OR find_in_set(1, letter.user_id);

    查询出来数据集后,遍历所有查询出的站内信,判断status_id是否为空,如果为空,就插入这条站内信的内容到ld_status里面,两种SQL查询的方式不同,不过只是把两次查询简化成了关联查询,但是达到的目的都是一样的。

    相关文章

      网友评论

        本文标题:千万级用户站内信设计思路

        本文链接:https://www.haomeiwen.com/subject/imggwqtx.html