点赞设计
方案一
考虑:此方案不针对于排行榜,只是文章的点赞。
缺点:redis挂掉的时候会丢失数据, 同时不及时同步redis中的数据, 可能会在redis内存置换的时候被淘汰掉;
不过对于我们点赞而已, 稍微丢失一点数据问题不大;
mysql设计:
表post_like() 记录文章被赞的次数,已有多少人赞过这种数据就可以直接从表中查到
字段id/post_name/likes_num…
表user_like_post() 记录用户赞过了哪些文章, 当打开文章列表时,显示的有没有赞过的数据就在这里面;
字段post_id/user_id
redis设计
1 2 3 4 5 6 7 8
| 1、写入post_set —— 1个post一个set,将点过赞的post_id写入post_set
2、写入post_user_like_set_{$post_id}—— 1个post一个set ,将点过赞的user_id写入
3、写入post_user_like_{$post_id}_{$user_id}—— hash类型,将用户点赞数据, 例如赞状态, post_id, user_id, ctime(操作时间), mtime(修改时间)写入其中。对应数据库的一行记录
4、更新post_{$post_id}_counter——string类型,计数器,一个post一个,更新 需要和前面一样先获取当前用户是否对这个post点过赞。如果点过, 并且本次是取消赞, counter减一, 如果没点过, 本次是点赞, counter加一。 如果原来是取消赞的情况, 本次是点赞, counter加一。
|
同步刷回数据库
1 2 3 4 5 6 7
| 这里用的应该是定时任务
循环从post_set中pop出来一个post_id至到空,根据{$post_id} ; 每次从post_user_like_set_{$post_id}中pop出来一个user_id直到空; 根据post_id, user_id, 直接获取对应的hash表的内容(post_user_like_{$post_id}_{$user_id} 将hash表中的数据写入user_like_post表中; 将post_{$post_id}_counter中的数据和post_like中的数据相加, 将结果写入到post_like表中
|
页面展示
1 2 3 4 5
| 1、查询用户点赞情况,需要同时查询redis和mysql
2、查询post点赞统计
同样需要查询redis中的post_{$post_id}_counter和mysql的post_like表, 并将两者相加,得到的结果才是正确的结果
|
参考链接:https://blog.csdn.net/weixin_42691388/article/details/115505648
方案二
排行榜
需要考虑,公司业务,在开发完后要求延长活动时间的问题