如何使用Redis实现点赞取消点赞
代码实现:/**
*
* @param userId 点赞的人
* @param type 点赞与取消点赞的表示
* @param textId 文章ID
* @param entityUserId -- 被点赞的人,文章作者
*/
private void like(long userId,int type,int textId,long entityUserId){
redisTemplate.execute(new SessionCallback() {
@Override
public Object execute(RedisOperations operations) throws DataAccessException {
String entityLikeKey = RedisKeyUtil.getEntityLikeKey(type, textId);
String userLikeKey = RedisKeyUtil.getUserLikeKey(entityUserId);
boolean isMember = redisTemplate.opsForSet().isMember(entityLikeKey, userId);
//多个更新操作,需要事务
operations.multi();
if (isMember) {
//取消赞
redisTemplate.opsForSet().remove(entityLikeKey, userId);
redisTemplate.opsForValue().decrement(userLikeKey);
} else {
//点赞
redisTemplate.opsForSet().add(entityLikeKey, userId);
redisTemplate.opsForValue().increment(userLikeKey);
}
return operations.exec();
}
});
}
/**
*查询某实体(帖子,评论等)点赞数量
* @param type 1点赞,2评论。0表示取消点赞
* @param textId
* @return
*/
private long findEntityLikeCount(int type, int textId){
String entityLikeKey = RedisKeyUtil.getEntityLikeKey(type, textId);
return redisTemplate.opsForSet().size(entityLikeKey);
}
/**
* 查询某人对某文章的点赞状态
* @param textId 帖子ID
* @param userId
* @return
*/
private int findEntityLikeStatus(int textId,long userId){
String entityLikeKey = RedisKeyUtil.getEntityLikeKey(1, textId);
//此处返回int,是为了进行扩展。比如扩展踩,为止2.等等情况
return redisTemplate.opsForSet().isMember(entityLikeKey,userId)?1:0;
}
/**
* 查询某个用户获得赞,用于在个人主页查看收获了多少赞
* @param userId
* @return
*/
private int findUserLikeCount(long userId){
String userLikeKey = RedisKeyUtil.getUserLikeKey(userId);
Integer count = (Integer) redisTemplate.opsForValue().get(userLikeKey);
// count.intValue()数据的整数形式;
return count==null?0:count.intValue();
}
Redis&
ndash;
key设置
private static final String SPLIT = "
:"
;
private static final String PREFIX_ENTITY_LIKE = "
like:entity"
;
private static final String PREFIX_USER_LIKE = "
like:user"
;
private static final String PREFIX_USER_COMMENTS="
comments:user"
;
/**
*某个实体收到的赞,如帖子,
* like:entity:entityType:entityId ->
set(userId) 对应set,存入userId
* @param entityType
* @param entityId
* @return
*/
public static String getEntityLikeKey(int entityType, int entityId) {
return PREFIX_ENTITY_LIKE + entityType + SPLIT + entityId;
}
*某个用户收到的总赞数
* like:user:userId ->
long
* @param userId
public static String getUserLikeKey(long userId) {
return PREFIX_USER_LIKE + SPLIT + userId;
* 汇总某个帖子的评论数量
public static String getUserCommentsKey(int articleId) {
return PREFIX_USER_COMMENTS + SPLIT + articleId;
随着社交网络与直播平台的日益盛行,点赞功能已成为人们日常交流不可或缺的一部分。为了实现该功能,在后端数据库中存储点赞数据,很多团队选择了Redis。本文将介绍如何使用Redis实现点赞功能的方法。
一、Redis介绍
Redis是一个基于内存的Key-Value存储系统,是目前领先的缓存数据库之一,具有高效率、高可扩展性和灵活性等特点,广泛应用于缓存、消息队列等领域。
二、点赞逻辑及原理
点赞功能通常需要在前端界面中实现一组点赞按钮,点击改变按钮状态并将点赞数据发送到后台。在后台,需要将该条数据的点赞数加1,并将该用户的点赞记录存储在Redis数据库中。取消点赞则是将点赞数减1,并将该用户的点赞记录删除。
三、如何存储点赞数据
Redis提供了五种不同的数据类型,其中Hash是最常用的数据类型之一。在这里,我们可以使用Hash来存储点赞数据。对于每一条点赞数据,可以使用Hash表的Key来进行身份标识,同时使用Field来保存点赞数据。
四、如何实现点赞
当用户点击点赞按钮后,发送一个HTTP请求到后台,后台需要进行三种操作:将点赞数据加1、将该用户的点赞记录存储到Redis数据库中、改变点赞按钮的状态。
五、如何实现取消点赞
取消点赞与点赞操作类似,也需要进行三种操作:将点赞数据减1、将该用户的点赞记录从Redis数据库中删除、改变点赞按钮的状态。
六、如何防止恶意操作
由于Redis是一个无状态服务器,不会验证来自客户端的身份信息。因此需要在客户端发送请求时进行防范,比如判断当前用户是否已经点赞过该条数据,避免恶意刷赞。
七、总结
使用Redis实现点赞功能,可以高效地管理点赞表,减少服务器的负荷。通过本文的介绍,你可以更好地了解Redis的应用,也可以更好地应用于实际开发场景中。