redis——实战点赞
Redis 实战 点赞
2023-09-27 14:25:55 时间
点赞功能随处可见,我们都知道点赞是一个非常高频的操作,redis就非常适合做这种工作。
实现效果:
分析:三种类型:给帖子点赞,给评论点赞,给回复点赞
我们只实现查看点赞数量的话,只要一个int记录一下就可以,但是我们之后还想查看点赞的人,所以要把每一个点赞的信息都记录好,方便后面的功能继续做出来。
思路:
点赞:把点赞的信息放进去。
取消:把点赞的信息删除。
在此之前,我们要封装一个get到key的类,方便后面复用。
package com.now.community.community.util;
public class RedisKeyUtil {
private static final String SPLIT = ":";
private static final String PREFIX_ENTITY_LIKE = "like:entity";
private static final String PREFIX_USER_LIKE = "like:user";
// 某个实体的赞
// like:entity:entityType:entityId -> set(userId)
public static String getEntityLikeKey(int entityType, int entityId) {
return PREFIX_ENTITY_LIKE + SPLIT + entityType + SPLIT + entityId;
}
// 某个用户的赞
// like:user:userId -> int
public static String getUserLikeKey(int userId) {
return PREFIX_USER_LIKE + SPLIT + userId;
}
}
点赞业务:
// 点赞
public void like(int userId, int entityType, int entityId, int entityUserId) {
redisTemplate.execute(new SessionCallback() {
@Override
public Object execute(RedisOperations operations) throws DataAccessException {
String entityLikeKey = RedisKeyUtil.getEntityLikeKey(entityType, entityId);
boolean isMember = operations.opsForSet().isMember(entityLikeKey, userId);
operations.multi();
if (isMember) {
operations.opsForSet().remove(entityLikeKey, userId);
} else {
operations.opsForSet().add(entityLikeKey, userId);
}
return operations.exec();
}
});
}
我们要查找是否点赞,还有点赞数量,方便页面显示:
// 查询某实体点赞的数量
public long findEntityLikeCount(int entityType, int entityId) {
String entityLikeKey = RedisKeyUtil.getEntityLikeKey(entityType, entityId);
return redisTemplate.opsForSet().size(entityLikeKey);
}
// 查询某人对某实体的点赞状态
public int findEntityLikeStatus(int userId, int entityType, int entityId) {
String entityLikeKey = RedisKeyUtil.getEntityLikeKey(entityType, entityId);
return redisTemplate.opsForSet().isMember(entityLikeKey, userId) ? 1 : 0;
}
点赞LikeController
@RequestMapping(path = "/like", method = RequestMethod.POST)
@ResponseBody
public String like(int entityType, int entityId,int entityUserId,int postId) {
User user = hostHolder.getUser();
// 点赞
likeService.like(user.getId(), entityType, entityId,entityUserId);
// 数量
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);
}
相关文章
- redis实战笔记(10)-第10章 扩展Redis
- redis实战笔记(8)-第8章 构建简单的社交网站
- redis实战笔记(2)-第2章 使用 Redis构建Web应用
- 《Netty Redis Zookeeper 高并发实战》 勘误
- redis 在 php 中的应用(List篇)
- 零散逻辑验证不再烦恼:基于Python和Redis的实践
- Redis 集合(Set)
- PHP+Redis 简单计数器实战
- PHP+Redis 简单实现排行榜实战
- PHP+Redis 简单字符串缓存
- redis实战 -- python知识散记
- CentOS下redis安装部署实战
- 如何保障 MySQL 和 Redis 的数据一致性?
- 《Redis实战》一第一部分 入门
- 《Redis实战》一1.1 Redis简介
- 《Redis实战》一1.5 小结
- 《Redis实战》一第2章 使用Redis构建Web应用
- 《Redis实战》一2.4 数据行缓存
- 《Redis入门指南》一4.1 事务
- ThinkPHP6项目基操(16.实战部分 redis+token登录)
- Redis 应用实战
- php+redis实战留言板(todolist)与互粉功能
- redis压测
- 基于Redis GEO实现加油站搜索附近车辆
- spring-session用redis实现session共享实践
- HAProxy advanced Redis health check---ref
- Redis性能指标监控