我现在在做论坛头像的徽标数这个功能。
我的想法是:
1.每个用户有一个数据库,记录被人@ta或者点赞ta或者回复ta的信息,别人有针对ta的操作时就往他的数据库里create一条数据。有ID,操作类型(点赞·回复·@),操作类型在其他数据库的ID,是否已读四个属性。但是这样用户多了的话要好多数据库,感觉不现实。
2.把上面的所有用户操作的信息都综合起来,放到一个数据库里。但是这样感觉数据库好大,每次都要全部扫描一遍把属于这个用户的信息select出来。 select * from table where id = userid。
然后为了避免这个数据库太大,当已读status变为1的时候就永久删除这条记录。
大佬一般都是怎么做的?
把 @/点赞/回复 作为事件发送到队列(
redis
支撑),然后后台一个服务不停的从队列中读取,根据目标用户id
来把事件发送到目标用户。发送成功了就存数据库、失败了看你要丢弃还是重新放回队列。
发送成功的记录按 每用户上限10条(也可以每种类型都上限10条) 这样保存到内存数据库(
redis
),这样可以做一个缓存,你也可以自己做个机制去节约这块的资源。这样就几乎不会有 全表扫描,除非用户想翻很久之前的记录,那么你可以用
Hash分表
来优化大用户量下的表结构,但MySQL
的性能足以撑起一个比较大的量级了,你可以先不考虑这个。哦你也可以先存数据库再往队列里发免得队列服务不小心挂掉用户的消息就丢了。