Redis点赞设计

点赞设计

方案一

考虑:此方案不针对于排行榜,只是文章的点赞。

缺点: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

方案二

排行榜

需要考虑,公司业务,在开发完后要求延长活动时间的问题