下面笔者将深入浅出给出这个面试的解答,笔者不仅会分享思路,而且还会给出具体代码实现,帮助读者更好地完全理解功能实现。
点赞功能
- 数据存储:使用 Redis 的集合(Set)数据结构来存储每个帖子的点赞用户列表。集合是无序的,且每个元素都是唯一的,适合用于点赞场景。
- 点赞操作:当用户点赞一个帖子时,将用户ID添加到该帖子的点赞集合中。
- 取消点赞操作:当用户取消点赞时,从集合中移除用户ID。
- 查询操作:检查用户是否点赞:查询用户ID是否在帖子的点赞集合中。获取点赞数量:计算集合中的元素数量。
- 性能考虑:Redis 是一个高性能的内存数据库,适合处理此类高频率的读写操作。使用 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);
}
}
- 参数:
userId
(用户ID)和postId
(帖子ID)。 - 实现:使用
redisTemplate.opsForSet().add
方法将用户ID添加到与帖子ID关联的 Redis 集合中。这个集合的键是"postLikes:" + postId
。
- 参数:
userId
(用户ID)和postId
(帖子ID)。 - 实现:使用
redisTemplate.opsForSet().isMember
方法检查用户ID是否在集合中,以确定用户是否已经点赞。
关注功能
关注功能的实现思路:
使用 Redis 的集合(Set)数据结构来存储每个用户的关注列表(userFollows:userId
)和粉丝列表(userFollowers:userId
)。集合中的每个元素都是唯一的,这符合关注功能的需求。
关注功能的核心逻辑包括两个部分:关注(follow)和取消关注(unfollow)。
- 关注:当用户 A 关注用户 B 时,用户 B 的标识符被添加到用户 A 的关注列表中,同时用户 A 的标识符被添加到用户 B 的粉丝列表中。
- 取关:当用户 A 取消关注用户 B 时,执行相反的操作,即从各自的列表中移除对方的标识符。
下面给出代码实现:
@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的粉丝列表。
学完如何实现点赞和关注功能后,还不能给博主点赞+收藏+关注嘛~
原文地址:https://blog.csdn.net/qq_45832461/article/details/134668699
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_40872.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。