本帖最后由 匿名 于 2023-8-4 20:10 编辑 . 1point3acres
是不是4个表就可以了?.google и
1. user (primary key: user ID), item(primary key: item ID),user_likes_item (combined key: user id/item id), item_liked_by_user (combined key: item id/user id).
(其实后面两个table的信息是一样的,但是因为item和user的shard方式不一样,可能需要shard到不同的mysql host,然后根据item id和user id可以方便的找到他们对应的shard)
2. 4个table都可以shard到多个mysql host。
其中, user , user_likes_item是根据user id来shard
item,item_liked_by_user是根据item id 来shard。. .и
然后在query的时候做各种统计。
1. 多个server接受1m qps, 根据item id找到相应的shard,然后查找 item_liked_by_user。 如果后台的db host即使shard之后也无法承受相应的qps,那么中间层加入cache,like的时候写入cache,unlike的时候delete。
2.必须直接写相应的table.google и
3. 和1类似。如果可以的话,直接根据item id找到item_liked_by_user, 然后count。如果引入cache的话,<item id, count> 。每当一个item被like或者unlike,count做加减处理。其中,要定期invalidate cache,以保证cache会定期的到数据库取最新的准确数据来更新cache。. check 1point3acres for more.
如果一个item的被like/unlike的concurrency太高的话,只能是invalidate cache然后写数据库,等下次读的时候再根据数据库的信息更新cache。
抛砖引玉。 |