当前位置:网站首页>10. Redis implements likes (Set) and obtains the total number of likes
10. Redis implements likes (Set) and obtains the total number of likes
2022-07-31 02:40:00 【A snicker】
实现点赞

No need to write the data access layer,直接在Servicelayer can be written.
1、创建RedisKeyUtil工具类生成key:
public class RedisKeyUtil {
private static final String SPLIT = ":";
private static final String PREFIX_ENTITY_LIKE = "like:entity";
// 某个实体的赞
// like:entity:entityType:entityId -> set(userId)
public static String getEntityLikeKey(int entityType, int entityId) {
return PREFIX_ENTITY_LIKE + SPLIT + entityType + SPLIT + entityId;
}
}
2、LikeService
@Service
public class LikeService {
@Autowired
private RedisTemplate redisTemplate;
// 点赞,查看该用户userId是否在集合里,Not in the set,加进去,like;在集合里,取消点赞,remove掉
public void like(int userId, int entityType, int entityId) {
String entityLikeKey = RedisKeyUtil.getEntityLikeKey(entityType, entityId);
boolean isMember = redisTemplate.opsForSet().isMember(entityLikeKey, userId);
if (isMember) {
redisTemplate.opsForSet().remove(entityLikeKey, userId);// 取消点赞
} else {
redisTemplate.opsForSet().add(entityLikeKey, userId);
}
}
// 查询某实体点赞的数量,See how many are in the setuserId
public long findEntityLikeCount(int entityType, int entityId) {
String entityLikeKey = RedisKeyUtil.getEntityLikeKey(entityType, entityId);
return redisTemplate.opsForSet().size(entityLikeKey);
}
// 查询某人对某实体的点赞状态,看某userId是否在集合里,返回1点赞了,返回0没点赞(Tap to go back-1)
public int findEntityLikeStatus(int userId, int entityType, int entityId) {
String entityLikeKey = RedisKeyUtil.getEntityLikeKey(entityType, entityId);
return redisTemplate.opsForSet().isMember(entityLikeKey, userId) ? 1 : 0;
}
}
3、LikeController
@Controller
public class LikeController {
@Autowired
private LikeService likeService;
@Autowired
private HostHolder hostHolder;
@RequestMapping(path = "/like", method = RequestMethod.POST)
@ResponseBody
public String like(int entityType, int entityId) {
User user = hostHolder.getUser();
// 点赞
likeService.like(user.getId(), entityType, entityId);
// 重新计算数量
long likeCount = likeService.findEntityLikeCount(entityType, entityId);
// 重新计算状态
int likeStatus = likeService.findEntityLikeStatus(user.getId(), entityType, entityId);
Map<String, Object> map = new HashMap<>();
map.put("likeCount", likeCount);
map.put("likeStatus", likeStatus);
return CommunityUtil.getJSONString(0, null, map);
}
}
4、异步请求,discuss.js
function like(btn, entityType, entityId) {
$.post(
CONTEXT_PATH + "/like",
{
"entityType":entityType,"entityId":entityId},
function(data) {
data = $.parseJSON(data);
if(data.code == 0) {
$(btn).children("i").text(data.likeCount);
$(btn).children("b").text(data.likeStatus==1?'已赞':"赞");
} else {
alert(data.msg);
}
}
);
}
Get total likes
1、改key拼接工具类RedisKeyUtil
private static final String PREFIX_USER_LIKE = "like:user";
// The total number of likes for a user, value是Object->强转成Integer->intValue()转成int型
// like:user:userId -> int
public static String getUserLikeKey(int userId){
return PREFIX_USER_LIKE + SPLIT + userId;
}
2、LikeService,编程式事务
保证事务性,Add two likes at once,编程式事务
public void like(int userId, int entityType, int entityId, int entityUserId) {
// 保证事务性,Two likes at a time increase,编程式事务
redisTemplate.execute(new SessionCallback() {
@Override
public Object execute(RedisOperations operations) throws DataAccessException {
String entityLikeKey = RedisKeyUtil.getEntityLikeKey(entityType, entityId);
String userLikeKey = RedisKeyUtil.getUserLikeKey(entityUserId);
// The query should precede the transaction,It cannot be placed in a transaction,Otherwise, the transaction will be executed after committing.
boolean isMember = operations.opsForSet().isMember(entityLikeKey, userId);
operations.multi();
if (isMember) {
operations.opsForSet().remove(entityLikeKey, userId);// 取消点赞
operations.opsForValue().decrement(userLikeKey);// Decrease the number of likes for an entity
}else{
operations.opsForSet().add(entityLikeKey, userId);// 点赞
operations.opsForValue().increment(userLikeKey);// Increase the number of likes for an entity
}
return operations.exec();
}
});
}
Query the total number of likes a user has received
// Query the total number of likes a user has received
public int findUserLikeCount(int userId) {
String userLikeKey = RedisKeyUtil.getUserLikeKey(userId);
Integer count = (Integer) redisTemplate.opsForValue().get(userLikeKey);
return count == null ? 0 : count.intValue();
}
边栏推荐
- The comprehensive result of the case statement, do you know it?[Verilog Advanced Tutorial]
- Live Preview | KDD2022 Doctoral Dissertation Award Champion and Runner-up Dialogue
- SQL注入 Less54(限制次数的SQL注入+union注入)
- Intranet Infiltration - Privilege Escalation
- 1. Non-type template parameters 2. Specialization of templates 3. Explanation of inheritance
- 8、统一处理异常(控制器通知@ControllerAdvice全局配置类、@ExceptionHandler统一处理异常)
- General introduction to the Unity interface
- LeetCode 1161 最大层内元素和[BFS 二叉树] HERODING的LeetCode之路
- 基于opencv实现人脸检测
- Word/Excel fixed table size, when filling in the content, the table does not change with the cell content
猜你喜欢

工程(五)——小目标检测tph-yolov5

How to do a startup CTO?

真正的CTO,是一个懂产品的技术人

16. Registration Center-consul

ShardingJDBC使用总结

YOLOV5学习笔记(三)——网络模块详解

YOLOV5 study notes (3) - detailed explanation of network module

数学解决——环形链表问题

Intel's software and hardware optimization empowers Neusoft to accelerate the arrival of the era of smart medical care

To write good test cases, you must first learn test design
随机推荐
16. Registration Center-consul
静态路由解析(最长掩码匹配原则+主备路由)
怎样做好一个创业公司CTO?
The real CTO is a technical person who understands products
二层广播风暴(产生原因+判断+解决)
全流程调度——MySQL与Sqoop
Force buckled brush the stairs (7/30)
医疗影像领域AI软件开发流程
Modbus on AT32 MCU
你们程序员为什么不靠自己的项目谋生?而必须为其他人打工?
ShardingJDBC使用总结
多线程下类对象的服务承诺探讨
[1153] The boundary range of between in mysql
汉源高科8路HDMI综合多业务高清视频光端机8路HDMI视频+8路双向音频+8路485数据+8路E1+32路电话+4路千兆物理隔离网络
AtCoder Beginner Contest 261 Partial Solution
Basic introduction to ShardingJDBC
英特尔软硬优化,赋能东软加速智慧医疗时代到来
CorelDRAW2022精简亚太新增功能详细介绍
CentOS7下mysql5.7.37的安装【完美方案】
Tower of Hanoi problem