springboot集成redis实现点赞功能
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、springboot引入redis?
springboot中引入redis,在pom.xml文件中引入redis的包即可。
<!-- redis 缓存操作 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
二、功能实现
1.点赞流程说明
点赞操作是比较频繁的,而且是比较随意的,数据的变化是比较快的,如果使用关系型数据库的话(例如使用mysql操作),会对数据库产生比较大的压力,所以选择非关系型数据库redis来记录点赞的用户数,为防止数据丢失,可以把数据同步给mysql。
点赞的数据需要哪些呢,包含点赞的文章id(topicId),被点赞的用户(fromUid),点赞的状态。
2.代码实现
代码如下:
public enum LikedStatusEnum {
LIKE(1, "点赞"),
UNLIKE(0, "取消点赞/未点赞"),
;
private Integer code;
private String msg;
LikedStatusEnum(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
public interface RedisService {
/**
* 点赞。状态为1
*
* @param topicId
* @param fromUserId
*/
void saveLiked2Redis(String topicId, String fromUserId);
/**
* 取消点赞。将状态改变为0
*
* @param topicId
* @param fromUserId
*/
void unlikeFromRedis(String topicId, String fromUserId);
}
@Service
public class RedisServiceImpl implements RedisService {
private RedisTemplate redisTemplate;
public RedisServiceImpl(RedisTemplate redisTemplate){
this.redisTemplate = redisTemplate;
}
/**
* 点赞。状态为1
*
* @param topicId
* @param fromUserId
*/
@Override
public void saveLiked2Redis(String topicId, String fromUserId) {
String key = RedisKeyUtils.getLikedKey(topicId, fromUserId);
//用户点赞,存储的键为:topicId::fromUId,对应的值为 1
// hash
redisTemplate.opsForHash().put(RedisKeyUtils.MAP_KEY_USER_LIKED, key, LikedStatusEnum.LIKE.getCode());
}
/**
* 取消点赞。将状态改变为0
*
* @param topicId
* @param fromUserId
*/
@Override
public void unlikeFromRedis(String topicId, String fromUserId) {
String key = RedisKeyUtils.getLikedKey(topicId, fromUserId);
// 用户点赞,存储的键为:topicId::fromUId,对应的值为 0
redisTemplate.opsForHash().put(RedisKeyUtils.MAP_KEY_USER_LIKED, key, LikedStatusEnum.UNLIKE.getCode());
}
}
public class RedisKeyUtils {
/**
* 保存用户点赞数据的key-这里的key在实际项目中应该采用 MAP_USER_LIKED::userId 组合,userId表示被点在的用户id
*/
public static final String MAP_KEY_USER_LIKED = "MAP_USER_LIKED";
/**
* 拼接被点赞的文章id和点赞的人的id作为kek
*
* @param topicId likedUserId 被点赞的文章id == topicId
* @param fromUid likedPostId 点赞的人的id == fromUid
* @return
*/
public static String getLikedKey(String topicId, String fromUid) {
StringBuilder builder = new StringBuilder();
builder.append(topicId);
builder.append("::");
builder.append(fromUid);
return builder.toString();
}
}
redis中存储数据结构如下图所示,redis采用hash数据结构存储点赞数据,Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。
总结
以上代码就可以实现redis简单的点赞功能,至于查询redis中hash数据代码未贴出,请读者自行实现。
第一次写文章,写的不好的地方,请大家多多担待。谢谢