今天分享一个常见的面试题:如何实现点赞和关注功能?
下面笔者将深入浅出给出这个面试的解答,笔者不仅会分享思路,而且还会给出具体代码实现,帮助读者更好地完全理解功能实现。
其实要实现点赞和关注功能,它考察的主要是Redis的应用。
点赞功能的实现思路:
下面给出代码实现:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
@Service
public class LikeService {
@Autowired
private RedisTemplate<String, String> redisTemplate;
// 点赞
public void likePost(String userId, String postId) {
redisTemplate.opsForSet().add("postLikes:" + postId, userId);
}
// 取消点赞
public void unlikePost(String userId, String postId) {
redisTemplate.opsForSet().remove("postLikes:" + postId, userId);
}
// 检查用户是否点赞
public boolean isLiked(String userId, String postId) {
return redisTemplate.opsForSet().isMember("postLikes:" + postId, userId);
}
// 获取点赞数量
public long getLikesCount(String postId) {
return redisTemplate.opsForSet().size("postLikes:" + postId);
}
}
接下来详细解释每行代码的用处。
点赞功能 (likePost 方法):
userId
(用户ID)和 postId
(帖子ID)。redisTemplate.opsForSet().add
方法将用户ID添加到与帖子ID关联的 Redis 集合中。这个集合的键是 "postLikes:" + postId
。取消点赞功能 (unlikePost 方法):
userId
(用户ID)和 postId
(帖子ID)。redisTemplate.opsForSet().remove
方法从集合中移除用户ID。检查是否点赞 (isLiked 方法):
userId
(用户ID)和 postId
(帖子ID)。redisTemplate.opsForSet().isMember
方法检查用户ID是否在集合中,以确定用户是否已经点赞。获取点赞数量 (getLikesCount 方法):
postId
(帖子ID)。redisTemplate.opsForSet().size
方法获取集合的大小,即点赞的用户数量。关注功能的实现思路:
使用 Redis 的集合(Set)数据结构来存储每个用户的关注列表(userFollows:userId
)和粉丝列表(userFollowers:userId
)。集合中的每个元素都是唯一的,这符合关注功能的需求。
关注功能的核心逻辑包括两个部分:关注(follow)和取消关注(unfollow)。
下面给出代码实现:
@Service
public class FollowService {
@Autowired
private RedisTemplate<String, String> redisTemplate;
// 关注
public void followUser(String userId, String followUserId) {
redisTemplate.opsForSet().add("userFollows:" + userId, followUserId);
redisTemplate.opsForSet().add("userFollowers:" + followUserId, userId);
}
// 取消关注
public void unfollowUser(String userId, String followUserId) {
redisTemplate.opsForSet().remove("userFollows:" + userId, followUserId);
redisTemplate.opsForSet().remove("userFollowers:" + followUserId, userId);
}
// 获取关注列表
public Set<String> getFollows(String userId) {
return redisTemplate.opsForSet().members("userFollows:" + userId);
}
// 获取粉丝列表
public Set<String> getFollowers(String userId) {
return redisTemplate.opsForSet().members("userFollowers:" + userId);
}
}
接下来详细解释每行代码的用处。
关注功能(followUser方法):这个方法用于实现我(userId
)去关注谁(followUserId
)的功能。这样,每个用户的关注列表和粉丝列表都被维护在 Redis 中。
userId
(用户ID),followUserId
(被关注用户ID)redisTemplate.opsForSet().add("userFollows:" + userId, followUserId)
这行代码维护的是该用户userId
它所关注的爱豆列表(即存储了它所喜欢的全部爱豆ID)。redisTemplate.opsForSet().add("userFollowers:" + followUserId, userId)
这行代码维护的是这个爱豆followUserId
它的粉丝列表(即存储它所拥有的全部粉丝ID)。取关功能(unfollowUser方法):这个方法用于实现我(userId
)去取关谁(followUserId
)的功能。
userId
(用户ID),followUserId
(被关注用户ID)redisTemplate.opsForSet().remove("userFollows:" + userId, followUserId)
这行代码实现的是从 userId
的关注列表中移除 followUserId
。redisTemplate.opsForSet().remove("userFollowers:" + followUserId, userId)
这行代码实现的是从 followUserId
的粉丝列表中移除 userId
。获取关注列表(getFollows方法):这个方法用于获取我(userId
)的关注列表。
userId
(用户ID)redisTemplate.opsForSet().members("userFollows:" + userId)
这行代码通过键"userFollows:" + userId
在redis中查询出用户userId的关注列表。获取粉丝列表(getFollowers方法):这个方法用于获取我(userId
)的粉丝列表。
userId
(用户ID)redisTemplate.opsForSet().members("userFollowers:" + userId)
这行代码通过键"userFollowers:" + userId
在redis中查询出用户userId的粉丝列表。学完如何实现点赞和关注功能后,还不能给博主点赞+收藏+关注嘛~