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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。