点赞和关注功能

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

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

其实要实现点赞和关注功能,它考察的主要是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 {@Autowiredprivate 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 {@Autowiredprivate 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的粉丝列表。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/184624.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第八话:前途和钱总要占一个

是啊,有时候职场就是这么现实,你说你到一家公司能图啥,图它能让你享受累死累活的快感还是图他给你养老送终?还不是图那点工资,图能多学点东西在下一家公司开的高一点,多少人背井离乡不就为了博一个前程。 小蔡怎么说也算是陪公司从低谷爬起来的,至少也待了1、2年了,但是…

同旺科技 分布式数字温度传感器 -- OPC Servers测试

内附链接 1、数字温度传感器 主要特性有&#xff1a; ● 支持PT100 / PT1000 两种铂电阻&#xff1b; ● 支持 2线 / 3线 / 4线 制接线方式&#xff1b; ● 支持5V&#xff5e;17V DC电源供电&#xff1b; ● 支持电源反接保护&#xff1b; ● 支持通讯波特率1200bps、2…

谁可以从使用 Amazon Lightsail 进行 VPS 托管中受益?

文章作者&#xff1a;Libai 介绍 在当今数字化的环境中&#xff0c;拥有可靠和高效的托管解决方案对于企业和个人来说至关重要。由于其灵活性、可扩展性和成本效益&#xff0c;虚拟专用服务器&#xff08;VPS&#xff09;托管已经在市场上获得了巨大的流行。Amazon Lightsail …

最新Midjourney绘画提示词Prompt

最新Midjourney绘画提示词Prompt 一、AI绘画工具 SparkAi【无需魔法使用】&#xff1a; SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧&#xff01;本系统使用NestjsVueTypescript框架技术&am…

自己的邮箱名称出现在别人的此电脑的网络位置中

在公司别的同事告诉我&#xff0c;我的邮箱名字出现在他们的【此电脑】-【网络位置中】 如图&#xff1a; 当时吓我一跳&#xff0c;因为我总喜欢搞一些渗透的东西&#xff0c;我以为把自己暴漏了&#xff0c;然后疯狂的在网上找原因。 于是就搜到一位安暖的博主&#xff1a; …

字符串函数-C语言

介绍 字符串函数&#xff0c;简单说&#xff0c;就是处理字符串的函数&#xff0c;头文件是string.h&#xff0c;以下是今天的讲解中会讲到的一系列字符串函数 头文件&#xff1a;#include<string.h>strlen&#xff1a;求字符串长度strcpy&#xff1a;拷贝字符串strcat&…

使用自动化测试获取手机短信验证码

目前在职测试开发,,写一些脚本,个人认为这职业不科学不应该有的职业,测试就是测试,开发就是开发,运维还是老鸟,这行业总能折腾些莫名其妙的东西出来,刚做这行时学的第一门语言是bash shell, 去新去单位上班直接写了个一键搭建测试环境的测试脚本,本来不想干测试了,好好做微信小…

C++ Primer Plus第十一章笔记

目录 运算符重载 概述 1.2 重载限制 友元简介 创建友元 常用的友元&#xff1a;重载 << 运算符 重载运算符&#xff1a;作为成员函数还是非成员函数 类的自动转换和强制类型转换 两种类型转换 转换函数 运算符重载 操作符重载&#xff08;Operator Overloadi…

夜莺项目发布 v6.4.0 版本,新增全局宏变量功能

大家好&#xff0c;夜莺项目发布 v6.4.0 版本&#xff0c;新增全局宏变量功能&#xff0c;本文为大家简要介绍一下相关更新内容。 全局宏变量功能 像 SMTP 的配置中密码类型的信息&#xff0c;之前都是以明文的方式在页面展示&#xff0c;夜莺支持全局宏变量之后&#xff0c;可…

android11-隐藏状态栏和导航栏

隐藏导航栏 /android11/frameworks/base/packages/SystemUI/res/layout/navigation_bar.xml diff --git a/frameworks/base/packages/SystemUI/res/layout/navigation_bar.xml b/frameworks/base/packages/SystemUI/res/layout/navigation_bar.xml index ba6b6956f1..6db2348…

在Linux中如何检查网络问题

ping命令&#xff1a; ping example.com示例输出&#xff1a; PING example.com (93.184.216.34) 56(84) bytes of data. 64 bytes from 93.184.216.34 (93.184.216.34): icmp_seq1 ttl55 time10.3 ms 64 bytes from 93.184.216.34 (93.184.216.34): icmp_seq2 ttl55 time9.…

从 JSON 转 Java 实体的多种方法详解

将 JSON 数据转换为 Java 对象是现代应用程序开发中常见的任务。在 Java 中&#xff0c;有多种方法可以实现这一目标。本文将详细介绍几种常见的方法&#xff0c;以及它们的优缺点。 1. 手动映射&#xff08;Manual Mapping&#xff09; 手动映射是最基础的方法之一&#xff…

kibana安装

kibana安装下载注意事项 地址&#xff1a;curl -O https://artifacts.elastic.co/downloads/kibana/kibana-7.16.3-linux-x86_64.tar.gz 下载后直接解压启动即可 1. 但需要使用非root用户启动 &#xff0c;root用户启动会报错 2. kibana需要和elasticsearch版本一致 不然…

力扣labuladong一刷day21天滑动哈希算法共2题

力扣labuladong一刷day21天滑动哈希算法共2题 文章目录 力扣labuladong一刷day21天滑动哈希算法共2题一、187. 重复的DNA序列二、28. 找出字符串中第一个匹配项的下标 一、187. 重复的DNA序列 题目链接&#xff1a;https://leetcode.cn/problems/repeated-dna-sequences/descr…

管理Android12系统的WLAN热点

大家好!我是编码小哥,欢迎关注,持续分享更多实用的编程经验和开发技巧,共同进步。 要创建一个APK管理Android 12系统的WLAN热点,你需要遵循以下步骤: 1. 获取必要的权限和API访问权限。在AndroidManifest.xml文件中添加以下权限: ```xml <uses-permission android:…

vue3通过el-dropdown实现动态菜单切换页面

这是效果图 首先是主页index.vue <template><el-row><el-col :span"20"><!-- 顶部菜单 --><div v-if"showTop"><topmenu /></div><!-- 右侧下方区域动态切换的内容 --><div style"flex: 1;&quo…

oracle varchar2 和 nvarchar2的区别

oracle varchar2 和 nvarchar2的区别 VARCHAR2和NVARCHAR2在数据库中都用于存储变长字符数据&#xff0c;但两者在存储方式和字符长度上存在一些不同。以下是VARCHAR2和NVARCHAR2的区别&#xff1a; 存储方式&#xff1a;VARCHAR2是存储以字节为单位的字符串&#xff0c;而NV…

Qt Creator使用Heob检测内存泄漏

转自Qt windows MinGW编译环境下内存泄漏排查工具 heob使用教程-CSDN博客 问题描述 最近开发的一个小项目&#xff0c;正常使用时&#xff0c;占用内存随时间增加越来越大&#xff0c;直至程序崩溃。 内存泄漏排查工具heob 在Qt creator4.6以后&#xff0c;可以使用heob进行内…

css浮动属性学习

在此文&#xff0c; html菜单的基本制作-CSDN博客 已经看到css 浮动属性的效果&#xff1b;下面单独看一下浮动属性&#xff1b; 做4个div&#xff0c;设置不同的背景色&#xff0c;不为div添加float属性&#xff1b;效果如下&#xff1b; 因为div是块级元素&#xff0c;默认…

上海震坤行:水泥行业数字化采购的趋势、策略与实践

上海震坤行&#xff1a;水泥行业数字化采购的趋势、策略与实践 在中国水泥协会发布的《2023年上半年水泥行业经济运行及下半年展望》中提到了水泥行业的发展现状——2023年上半年&#xff0c;在全球经济增长放缓、国内经济延续恢复态势、但市场需求不足的宏观环境下&#xff0…