Redis实现用户关注的项目实践

 更新时间:2024年02月28日 14:45:49   作者:Blet-  
本文主要介绍了Redis实现用户关注的项目实践,通过使用Redis的set数据结构来存储关注对象,方便高效地进行添加和取消关注操作,具有一定的参考价值,感兴趣的可以了解一下
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

在实现社交网络功能中,实现互相关注是必不可少的。在这里,我们将使用Redis来实现这个功能,前端使用Vue框架实现。

功能要求

我们需要实现以下几个功能:

  • 用户能够关注其他用户
  • 用户能够取消关注其他用户
  • 用户能够查看自己关注的人和被谁关注
  • 在用户的主页上,能够显示关注和被关注的数量

Redis存储结构设计

我们使用Redis的set数据结构来存储用户关注的人和被关注的人。具体来说,每个用户都有一个followingfollowers属性,分别表示该用户关注的人和被谁关注。然后在Redis中使用set类型来存储这些关注信息,在set中,我们将每个关注对象的id存储下来,方便后续的查询。

后端实现

添加关注

我们需要通过API来让用户实现添加关注和取消关注。下面是添加关注的API代码:

// 添加关注
router.post('/followers/:id', async (req, res) => {
  try {
    const followerId = req.user.id;
    const followingId = req.params.id;

    // 获取被关注的用户和关注该用户的用户
    const following = await User.findById(followingId);
    const follower = await User.findById(followerId);

    // 添加关注对象
    await redis.sadd(`user:${followerId}:following`, followingId);
    await redis.sadd(`user:${followingId}:followers`, followerId);

    res.json({ message: `You are now following ${following.username}` });
  } catch (error) {
    console.error(error.message);
    res.status(500).send('Server Error');
  }
});

在这个代码中,我们使用了redis.sadd方法将关注对象的id添加到set中。

取消关注

接下来是取消关注的API代码:

// 取消关注
router.delete('/followers/:id', async (req, res) => {
 try {
    const followerId = req.user.id;
    const followingId = req.params.id;

    // 获取被取消关注的用户和取消关注该用户的用户
    const following = await User.findById(followingId);
    const follower = await User.findById(followerId);

    // 删除关注对象
    await redis.srem(`user:${followerId}:following`, followingId);
    await redis.srem(`user:${followingId}:followers`, followerId);

    res.json({ message: `You have unfollowed ${following.username}` });
  } catch (error) {
    console.error(error.message);
    res.status(500).send('Server Error');
  }
});

这个代码与添加关注的代码类似,只是使用了redis.srem方法来将关注对象的id从set中删除。

查看关注对象

最后,我们需要实现查看关注对象的API。这个API需要分别获取关注和被关注的set,然后将id转换为用户对象。

// 获取关注和粉丝
router.get('/followers', async (req, res) => {
  try {
    const userId = req.user.id;

    // 获取关注和被关注的set
    const [following, followers] = await Promise.all([
      redis.smembers(`user:${userId}:following`),
      redis.smembers(`user:${userId}:followers`),
    ]);

    // 将id转换为用户对象
    const followingUsers = await Promise.all(
      following.map((id) => User.findById(id))
    );
    const followerUsers = await Promise.all(
      followers.map((id) => User.findById(id))
    );

    res.json({ following: followingUsers, followers: followerUsers });
  } catch (error) {
    console.error(error.message);
    res.status(500).send('Server Error');
  }
});

前端实现

在前端中,我们使用Vue框架来实现。需要提供以下功能:

  • 用户可以通过点击按钮来添加和取消关注操作
  • 用户的主页可以显示关注和被关注的数量

添加关注和取消关注操作

在Vue中,我们可以使用@click监听用户点击事件,并在方法中发送API请求来进行添加和取消关注。下面是代码示例:

<!-- 添加关注 -->
<button @click="followUser(user._id)" v-if="!isFollowing(user._id)">关注</button>

<!-- 取消关注 -->
<button @click="unfollowUser(user._id)" v-else>取消关注</button>
methods: {
  // 添加关注
  async followUser(id) {
    await axios.post(`/api/followers/${id}`);
    // 更新关注状态
    this.isFollowingUsers[id] = true;
  },
  // 取消关注
  async unfollowUser(id) {
    await axios.delete(`/api/followers/${id}`);
    // 更新关注状态
    this.isFollowingUsers[id] = false;
  },
  // 判断是否关注
  isFollowing(id) {
    return this.isFollowingUsers[id];
  }
}

在这个代码中,我们使用了isFollowingUsers对象来存储所有用户的关注状态。

显示关注和被关注数量

为了在用户的主页上显示关注和被关注的数量,我们需要在后端添加相应的API,并在前端调用数据显示。下面是相关代码:

// 获取关注和粉丝数量
router.get('/followers/count', async (req, res) => {
  try {
    const userId = req.user.id;

    // 获取关注和被关注数量
    const [followingCount, followerCount] = await Promise.all([
      redis.scard(`user:${userId}:following`),
      redis.scard(`user:${userId}:followers`),
    ]);

    res.json({ followingCount, followerCount });
  } catch (error) {
    console.error(error.message);
    res.status(500).send('Server Error');
  }
});
<!-- 显示关注和被关注数量 -->
<div>
  <p>关注 {{followingCount}}</p>
  <p>被关注 {{followerCount}}</p>
</div>

在这个代码中,我们使用了redis.scard方法来获取set的数量。

总结

以上就是使用Redis实现互相关注功能的全部内容。通过使用Redis的set数据结构来存储关注对象,方便高效地进行添加和取消关注操作。同时,在前端中使用Vue框架实现了可交互的关注和取消关注按钮,并在用户主页上显示了关注和被关注的数量。

到此这篇关于Redis实现用户关注的项目实践的文章就介绍到这了,更多相关Redis 用户关注内容请搜索程序员之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持程序员之家!

相关文章

  • redis批量删除key的步骤

    redis批量删除key的步骤

    本文分享最新版Redis批量删除key的方法,希望能帮到遇到同样问题的网友。
    2020-09-09
  • redis cluster支持pipeline的实现思路

    redis cluster支持pipeline的实现思路

    本文给大家介绍redis cluster支持pipeline的实现思路,在 cluster 上执行 pipeline 可能会由于 redis 节点扩缩容 中途 redirection 切换连接导致结果丢失,具体细节问题请参考下本文
    2021-06-06
  • Redis使用元素删除的布隆过滤器来解决缓存穿透问题

    Redis使用元素删除的布隆过滤器来解决缓存穿透问题

    本文主要介绍了Redis使用元素删除的布隆过滤器来解决缓存穿透问题,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • redis 过期策略及内存回收机制解析

    redis 过期策略及内存回收机制解析

    这篇文章主要介绍了redis 过期策略及内存回收机制,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Redis核心原理与实践之字符串实现原理

    Redis核心原理与实践之字符串实现原理

    这本书深入地分析了Redis常用特性的内部机制与实现方式,内容源自对Redis源码的分析,并从中总结出设计思路、实现原理。对Redis字符串实现原理相关知识感兴趣的朋友一起看看吧
    2021-09-09
  • redis复制有可能碰到的问题汇总

    redis复制有可能碰到的问题汇总

    这篇文章主要介绍了redis复制有可能碰到的问题汇总,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • 浅谈Redis位图(Bitmap)及Redis二进制中的问题

    浅谈Redis位图(Bitmap)及Redis二进制中的问题

    这篇文章主要介绍了Redis位图(Bitmap)及Redis二进制中的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • 使用Redis实现实时排行榜功能

    使用Redis实现实时排行榜功能

    排行榜功能是一个很普遍的需求。使用 Redis 中有序集合的特性来实现排行榜是又好又快的选择。接下来通过本文给大家介绍使用Redis实现实时排行榜功能,需要的朋友可以参考下
    2021-07-07
  • 安装redis(windows和Ubuntu)详解

    安装redis(windows和Ubuntu)详解

    这篇文章主要介绍了Redis在Ubuntu和Windows下的安装,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • 提高redis缓存命中率的方法

    提高redis缓存命中率的方法

    在本篇文章里小编给大家整理了关于怎么提高redis缓存命中率的相关知识点内容,有兴趣的朋友们跟着学习下。
    2019-06-06

最新评论

?


http://www.vxiaotou.com