点赞和关注功能

今天分享一个常见的面试题:如何实现点赞和关注功能?

下面笔者将深入浅出给出这个面试的解答,笔者不仅会分享思路,而且还会给出具体代码实现,帮助读者更好地完全理解功能实现。

其实要实现点赞和关注功能,它考察的主要是Redis的应用

点赞功能

点赞功能的实现思路:

  1. 数据存储:使用 Redis 的集合(Set)数据结构来存储每个帖子的点赞用户列表。集合是无序的,且每个元素都是唯一的,适合用于点赞场景。
  2. 点赞操作:当用户点赞一个帖子时,将用户ID添加到该帖子的点赞集合中。
  3. 取消点赞操作:当用户取消点赞时,从集合中移除用户ID。
  4. 查询操作:检查用户是否点赞:查询用户ID是否在帖子的点赞集合中。获取点赞数量:计算集合中的元素数量。
  5. 性能考虑:Redis 是一个高性能的内存数据库,适合处理此类高频率的读写操作。使用 Redis 集合可以有效地支持大量用户的点赞操作,同时保证数据的一致性和快速访问。
  6. 扩展性:这种实现方式易于扩展,可以添加更多功能,如点赞列表的获取、点赞用户的分页显示等。

下面给出代码实现:

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)。

  • 关注:当用户 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 的关注列表中移除 followUserIdredisTemplate.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的粉丝列表。

学完如何实现点赞和关注功能后,还不能给博主点赞+收藏+关注嘛~

你可能感兴趣的:(后端八股文,Java后端,Redis,Web开发)