当前位置:网站首页>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();
}
边栏推荐
- How to do a startup CTO?
- print task sorting js od huawei
- mysql index
- execsnoop 工具
- TCP/IP四层模型
- Maximum area of solar panel od js
- JS 函数 this上下文 运行时点语法 圆括号 数组 IIFE 定时器 延时器 self.备份上下文 call apply
- Calculate S=a+aa+…+aa…a
- StringJoiner详解
- 1. Non-type template parameters 2. Specialization of templates 3. Explanation of inheritance
猜你喜欢
随机推荐
知识蒸馏7:知识蒸馏代码详解
Word/Excel fixed table size, when filling in the content, the table does not change with the cell content
Difference between CMOS and TTL?
系统需求多变如何设计
如何搭建私有yum源
General introduction to the Unity interface
【shell基础】判断目录是否为空
Detailed explanation of STP election (step + case)
How to design the changing system requirements
StringJoiner详解
FPGA-based vending machine
Pythagorean tuple od js
完整复制虚拟机原理(云计算)
mysql index
Drools Rule Properties, Advanced Syntax
Brute Force/Adjacency List Breadth First Directed Weighted Graph Undirected Weighted Graph
8. Unified exception handling (controller notifies @ControllerAdvice global configuration class, @ExceptionHandler handles exceptions uniformly)
Draw Your Cards
静态路由解析(最长掩码匹配原则+主备路由)
Shell script to loop through values in log file to sum and calculate average, max and min