当前位置:网站首页>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();
}
边栏推荐
- MPPT太阳能充放电控制器数据采集-通过网关采集电池电压容量电量SOC,wifi传输
- The real CTO is a technical person who understands products
- mmdetection trains a model related command
- StringJoiner详解
- Maximum area of solar panel od js
- FPGA-based vending machine
- ShardingJDBC usage summary
- 4、敏感词过滤(前缀树)
- Uninstallation of mysql5.7.37 under CentOS7 [perfect solution]
- Classic linked list OJ strong training problem - fast and slow double pointer efficient solution
猜你喜欢

知识蒸馏7:知识蒸馏代码详解

全流程调度——MySQL与Sqoop

MPPT solar charge controller data collection - through the gateway acquisition capacity battery SOC battery voltage, wi-fi

汉源高科8路HDMI综合多业务高清视频光端机8路HDMI视频+8路双向音频+8路485数据+8路E1+32路电话+4路千兆物理隔离网络

Layer 2 broadcast storm (cause + judgment + solution)

怎样做好一个创业公司CTO?

Tower of Hanoi problem

4、敏感词过滤(前缀树)

The final exam first year course

经典链表OJ强训题——快慢双指针高效解法
随机推荐
8. Unified exception handling (controller notifies @ControllerAdvice global configuration class, @ExceptionHandler handles exceptions uniformly)
你们程序员为什么不靠自己的项目谋生?而必须为其他人打工?
JS 函数 this上下文 运行时点语法 圆括号 数组 IIFE 定时器 延时器 self.备份上下文 call apply
LeetCode 1161 The largest element in the layer and the LeetCode road of [BFS binary tree] HERODING
mysql index
ShardingJDBC使用总结
multiplayer-hlap 包有问题,无法升级的解决方案
mysql view
字体压缩神器font-spider的使用
【C语言基础】解决C语言error: expected ‘;‘, ‘,‘ or ‘)‘ before ‘&‘ token
mmdetection trains a model related command
Intel's software and hardware optimization empowers Neusoft to accelerate the arrival of the era of smart medical care
mmdetection训练一个模型相关命令
AI中的数学思想
StringJoiner in detail
Maximum area of solar panel od js
局域网电脑硬件信息收集工具
英特尔软硬优化,赋能东软加速智慧医疗时代到来
公司官网建站笔记(六):域名进行公安备案并将备案号显示在网页底部
Drools规则属性,高级语法