1.社区主页瀑布流分页时显示点赞总数?
2.作品明细展示显示点赞总数、可点赞、可取消?
3.进入自己个人中心显示自己点赞作品(可取消)
4.进入他人个人中心显示他人点赞作品?
5.可查看作品下的点赞用户列表(分页、倒排)
1.总数与明细都要记录?
2.查频率高、写并发高?
3.回显实时性要求高?
4.传输数据量小?
5.数据是单体小,整体范围大、量多?
6.数据价值低?
1.点接口并发高?
2.新增数据量大范围广?
3.查询点赞量频繁?
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='作品点赞记录表';
1.新增作品点赞(作品ID、用户ID、时间戳)
2.取消作品点赞(作品ID、用户ID)
3.瀑布流查看作品连带赞数?
4.作品详情页面查询带出点赞数?
5.个人中心分页查出自己点赞作品?
6.他人个人中心分页查出他人点赞作品?
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);
}
}
1.个人点赞明细同步
触发时机:进入作品首页、刷新作品、分页1000次时
执行逻辑:取出Redis里个人点赞数据;DB查出旧数据;根据Map的Key特性;删除Map里旧数据;插入新数据。
2.作品点赞总数同步
空闲时间定时执行
/**
* 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);
}
/**
* 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);
}