CMS—作品点赞功能设计
2023-12-26 17:43:34
一、需求分析?
1.1、需求整理?
1.社区主页瀑布流分页时显示点赞总数?
2.作品明细展示显示点赞总数、可点赞、可取消?
3.进入自己个人中心显示自己点赞作品(可取消)
4.进入他人个人中心显示他人点赞作品?
5.可查看作品下的点赞用户列表(分页、倒排)
1.2、特性分析?
1.总数与明细都要记录?
2.查频率高、写并发高?
3.回显实时性要求高?
4.传输数据量小?
5.数据是单体小,整体范围大、量多?
6.数据价值低?
1.3、难点分析?
1.点接口并发高?
2.新增数据量大范围广?
3.查询点赞量频繁?
二、表、接口设计?
2.1、表结构设计?
CREATE TABLE `work_likes` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`work_id` bigint DEFAULT NULL COMMENT '评论ID',
`user_id` bigint DEFAULT NULL COMMENT '点赞人ID',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `agdkey` (`work_id`,`user_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='作品点赞记录表';
2.2、接口设计?
1.新增作品点赞(作品ID、用户ID、时间戳)
2.取消作品点赞(作品ID、用户ID)
3.瀑布流查看作品连带赞数?
4.作品详情页面查询带出点赞数?
5.个人中心分页查出自己点赞作品?
6.他人个人中心分页查出他人点赞作品?
三、使用案例?
3.1、点赞、取消
private final RedisTemplate redisTemplate;
/**
* 作品点赞/取消
*/
@GetMapping("/workLikeOrCanal")
public R workLikeOrCanal(@RequestBody Work work){
// 作品ID 的 value
Long workId = works.getId();
// 用户ID 的 value
Long userId = works.getUserId();
// 作品点赞 key
String workLikeKey = "workLikeKey:" + workId;
// 用户点赞 key
String userLikeKey = "userLikeKey:" + userId;
// 用户取消点赞 key
String userUnLikeKey = "userUnLikeKey:" + userId;
boolean workFlag = redisTemplate.hasKey(workLikeKey);
if(!workFlag){
// Redis无数据,到DB里拉取数据
// DB数据无数据,Redis设置 0.
}
boolean userFlag = redisTemplate.hasKey(userLikeKey);
if(!userFlag){
// Redis无数据,到DB里拉取数据
// DB数据无数据,Redis设置 0.
}
// 判断此用户是否已点赞
boolean falg = redisTemplate.opsForHash().hasKey(userId,workId);
if(falg){
// 作品-总点赞记录-减
redisTemplate.opsForSet().members(workLikeKey).remove(userId);
// 用户-个人赞记录-减
redisTemplate.opsForHash().delete(userLikeKey,workId);
// 用户-取消点赞记录-加
redisTemplate.opsForSet().add(userUnLikeKey,workId);
// 获取作品-总点赞
Long size = redisTemplate.opsForSet().size(workLikeKey);
return R.ok("Success",size);
}else {
// 作品-总点赞记录-加
redisTemplate.opsForSet().add(workLikeKey,userId);
// 用户-个人点赞记录-加
redisTemplate.opsForHash().put(userLikeKey,workId,new Date());
// 用户-取消点赞记录-减
redisTemplate.opsForSet().members(userUnLikeKey).remove(workId);
// 获取作品-总点赞
Long size = redisTemplate.opsForSet().size(workLikeKey);
return R.ok("Success",size);
}
}
3.2、同步数据
1.个人点赞明细同步
触发时机:进入作品首页、刷新作品、分页1000次时
执行逻辑:取出Redis里个人点赞数据;DB查出旧数据;根据Map的Key特性;删除Map里旧数据;插入新数据。
2.作品点赞总数同步
空闲时间定时执行
3.3、查询作品点赞接口
/**
* Redis、DB双向查询
*/
@GetMapping("/queryWorkLikes")
public R workUnLike(@RequestBody Comment work){
Long workId = work.getWorkId();
String workLikeKey = "workLikeKey:"+ workId;
// 获取作品-总点赞
Long size = redisTemplate.opsForSet().size(workLikeKey);
// Redis 无数据再查DB......略
return R.ok("Success",size);
}
3.4、查询个人点赞作品接口?
/**
* DB、Redis 双向查询
*/
@GetMapping("/queryUserkLikes")
public R queryUserkLikes(@RequestBody Comment work){
Long userId = work.getUserId();
String userKey = "userKey:"+ userId;
// 获取用户-总点赞
Long size = redisTemplate.opsForHash().size(userKey);
// Redis 无数据再查DB......略
return R.ok("Success",size);
}
文章来源:https://blog.csdn.net/weixin_42679286/article/details/135019431
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!