最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis之如何實(shí)現(xiàn)用戶(hù)關(guān)注

 更新時(shí)間:2025年03月20日 16:53:29   作者:沙漠真有魚(yú)  
這篇文章主要介紹了Redis之如何實(shí)現(xiàn)用戶(hù)關(guān)注問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Redis實(shí)現(xiàn)互相關(guān)注功能

在實(shí)現(xiàn)社交網(wǎng)絡(luò)功能中,實(shí)現(xiàn)互相關(guān)注是必不可少的。在這里,我們將使用Redis來(lái)實(shí)現(xiàn)這個(gè)功能,前端使用Vue框架實(shí)現(xiàn)。

功能要求

我們需要實(shí)現(xiàn)以下幾個(gè)功能:

  1. 用戶(hù)能夠關(guān)注其他用戶(hù)
  2. 用戶(hù)能夠取消關(guān)注其他用戶(hù)
  3. 用戶(hù)能夠查看自己關(guān)注的人和被誰(shuí)關(guān)注
  4. 在用戶(hù)的主頁(yè)上,能夠顯示關(guān)注和被關(guān)注的數(shù)量

Redis存儲(chǔ)結(jié)構(gòu)設(shè)計(jì)

我們使用Redis的set數(shù)據(jù)結(jié)構(gòu)來(lái)存儲(chǔ)用戶(hù)關(guān)注的人和被關(guān)注的人。

具體來(lái)說(shuō),每個(gè)用戶(hù)都有一個(gè)followingfollowers屬性,分別表示該用戶(hù)關(guān)注的人和被誰(shuí)關(guān)注。

然后在Redis中使用set類(lèi)型來(lái)存儲(chǔ)這些關(guān)注信息,在set中,我們將每個(gè)關(guān)注對(duì)象的id存儲(chǔ)下來(lái),方便后續(xù)的查詢(xún)。

后端實(shí)現(xiàn)

添加關(guān)注

我們需要通過(guò)API來(lái)讓用戶(hù)實(shí)現(xiàn)添加關(guān)注和取消關(guān)注。

下面是添加關(guān)注的API代碼:

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

    // 獲取被關(guān)注的用戶(hù)和關(guān)注該用戶(hù)的用戶(hù)
    const following = await User.findById(followingId);
    const follower = await User.findById(followerId);

    // 添加關(guān)注對(duì)象
    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');
  }
});

在這個(gè)代碼中,我們使用了redis.sadd方法將關(guān)注對(duì)象的id添加到set中。

取消關(guān)注

接下來(lái)是取消關(guān)注的API代碼:

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

    // 獲取被取消關(guān)注的用戶(hù)和取消關(guān)注該用戶(hù)的用戶(hù)
    const following = await User.findById(followingId);
    const follower = await User.findById(followerId);

    // 刪除關(guān)注對(duì)象
    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');
  }
});

這個(gè)代碼與添加關(guān)注的代碼類(lèi)似,只是使用了redis.srem方法來(lái)將關(guān)注對(duì)象的id從set中刪除。

查看關(guān)注對(duì)象

最后,我們需要實(shí)現(xiàn)查看關(guān)注對(duì)象的API。這個(gè)API需要分別獲取關(guān)注和被關(guān)注的set,然后將id轉(zhuǎn)換為用戶(hù)對(duì)象。

// 獲取關(guān)注和粉絲
router.get('/followers', async (req, res) => {
  try {
    const userId = req.user.id;

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

    // 將id轉(zhuǎn)換為用戶(hù)對(duì)象
    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');
  }
});

前端實(shí)現(xiàn)

在前端中,我們使用Vue框架來(lái)實(shí)現(xiàn)。需要提供以下功能:

  1. 用戶(hù)可以通過(guò)點(diǎn)擊按鈕來(lái)添加和取消關(guān)注操作
  2. 用戶(hù)的主頁(yè)可以顯示關(guān)注和被關(guān)注的數(shù)量

添加關(guān)注和取消關(guān)注操作

在Vue中,我們可以使用@click監(jiān)聽(tīng)用戶(hù)點(diǎn)擊事件,并在方法中發(fā)送API請(qǐng)求來(lái)進(jìn)行添加和取消關(guān)注。

下面是代碼示例:

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

<!-- 取消關(guān)注 -->
<button @click="unfollowUser(user._id)" v-else>取消關(guān)注</button>
methods: {
  // 添加關(guān)注
  async followUser(id) {
    await axios.post(`/api/followers/${id}`);
    // 更新關(guān)注狀態(tài)
    this.isFollowingUsers[id] = true;
  },
  // 取消關(guān)注
  async unfollowUser(id) {
    await axios.delete(`/api/followers/${id}`);
    // 更新關(guān)注狀態(tài)
    this.isFollowingUsers[id] = false;
  },
  // 判斷是否關(guān)注
  isFollowing(id) {
    return this.isFollowingUsers[id];
  }
}

在這個(gè)代碼中,我們使用了isFollowingUsers對(duì)象來(lái)存儲(chǔ)所有用戶(hù)的關(guān)注狀態(tài)。

顯示關(guān)注和被關(guān)注數(shù)量

為了在用戶(hù)的主頁(yè)上顯示關(guān)注和被關(guān)注的數(shù)量,我們需要在后端添加相應(yīng)的API,并在前端調(diào)用數(shù)據(jù)顯示。

下面是相關(guān)代碼:

// 獲取關(guān)注和粉絲數(shù)量
router.get('/followers/count', async (req, res) => {
  try {
    const userId = req.user.id;

    // 獲取關(guān)注和被關(guān)注數(shù)量
    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');
  }
});
<!-- 顯示關(guān)注和被關(guān)注數(shù)量 -->
<div>
  <p>關(guān)注 {{followingCount}}</p>
  <p>被關(guān)注 {{followerCount}}</p>
</div>

在這個(gè)代碼中,我們使用了redis.scard方法來(lái)獲取set的數(shù)量。

總結(jié)

以上就是使用Redis實(shí)現(xiàn)互相關(guān)注功能的全部?jī)?nèi)容。通過(guò)使用Redis的set數(shù)據(jù)結(jié)構(gòu)來(lái)存儲(chǔ)關(guān)注對(duì)象,方便高效地進(jìn)行添加和取消關(guān)注操作。同時(shí),在前端中使用Vue框架實(shí)現(xiàn)了可交互的關(guān)注和取消關(guān)注按鈕,并在用戶(hù)主頁(yè)上顯示了關(guān)注和被關(guān)注的數(shù)量。

這些僅為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Redis源碼設(shè)計(jì)剖析之事件處理示例詳解

    Redis源碼設(shè)計(jì)剖析之事件處理示例詳解

    這篇文章主要為大家介紹了Redis源碼設(shè)計(jì)剖析之事件處理示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Redis設(shè)置密碼以及設(shè)置后不生效的解決過(guò)程

    Redis設(shè)置密碼以及設(shè)置后不生效的解決過(guò)程

    這段描述主要講解了如何修改Redis配置文件以設(shè)置自定義密碼,并強(qiáng)調(diào)了在啟動(dòng)Redis時(shí)需使用配置文件的重要性,通過(guò)修改`redis.windows.conf`中的`requirepass`參數(shù)并重啟Redis服務(wù),可以實(shí)現(xiàn)自定義密碼設(shè)置
    2026-05-05
  • Redis的使用模式之計(jì)數(shù)器模式實(shí)例

    Redis的使用模式之計(jì)數(shù)器模式實(shí)例

    這篇文章主要介紹了Redis的使用模式之計(jì)數(shù)器模式實(shí)例,本文講解了匯總計(jì)數(shù)器、按時(shí)間匯總的計(jì)數(shù)器、速度控制、使用 Hash 數(shù)據(jù)類(lèi)型維護(hù)大量計(jì)數(shù)器等內(nèi)容,需要的朋友可以參考下
    2015-03-03
  • Redis數(shù)據(jù)存儲(chǔ)原理和結(jié)構(gòu)解讀

    Redis數(shù)據(jù)存儲(chǔ)原理和結(jié)構(gòu)解讀

    這篇文章詳細(xì)介紹了Redis的數(shù)據(jù)結(jié)構(gòu)和過(guò)期機(jī)制,包括鍵值對(duì)存儲(chǔ)、哈希表、字典、跳表等,并探討了大Key問(wèn)題和解決方法
    2026-03-03
  • 淺談Redis內(nèi)存回收策略

    淺談Redis內(nèi)存回收策略

    本文主要介紹了淺談Redis內(nèi)存回收策略,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Redis緩存擊穿的用法及說(shuō)明

    Redis緩存擊穿的用法及說(shuō)明

    文章介紹了緩存擊穿的概念、核心原因及其對(duì)系統(tǒng)的危害,并提出了兩種解決方案:互斥鎖方案和邏輯過(guò)期方案,互斥鎖方案能保證數(shù)據(jù)一致性但性能較低,邏輯過(guò)期方案則能提供高可用性和性能
    2026-04-04
  • redis簡(jiǎn)單介紹及安裝使用小結(jié)

    redis簡(jiǎn)單介紹及安裝使用小結(jié)

    本文主要是對(duì)于redis初步學(xué)習(xí)的小結(jié)內(nèi)容,包括了redis介紹,redis安裝以及最簡(jiǎn)單的使用,希望大家能夠喜歡
    2018-11-11
  • 深度剖析Redis雙寫(xiě)一致性問(wèn)題的解決方案

    深度剖析Redis雙寫(xiě)一致性問(wèn)題的解決方案

    在高并發(fā)場(chǎng)景下,緩存與數(shù)據(jù)庫(kù)的雙寫(xiě)一致性是每個(gè)開(kāi)發(fā)者必須直面的核心挑戰(zhàn),本文通過(guò)5大解決方案,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2025-09-09
  • Redis增減庫(kù)存避坑的實(shí)現(xiàn)

    Redis增減庫(kù)存避坑的實(shí)現(xiàn)

    在電商平臺(tái)或者倉(cāng)庫(kù)管理系統(tǒng)中,庫(kù)存的管理是非常重要的一項(xiàng)任務(wù),本文主要介紹了Redis增減庫(kù)存避坑的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • Redis實(shí)現(xiàn)查看服務(wù)狀態(tài)、關(guān)閉和啟動(dòng)方式

    Redis實(shí)現(xiàn)查看服務(wù)狀態(tài)、關(guān)閉和啟動(dòng)方式

    本文介紹了如何在Linux系統(tǒng)中查看、關(guān)閉和啟動(dòng)Redis服務(wù),包括使用命令行工具和配置文件進(jìn)行相關(guān)操作
    2025-11-11

最新評(píng)論

武川县| 福泉市| 通辽市| 甘泉县| 亚东县| 和田市| 桂阳县| 石台县| 磐石市| 通道| 米脂县| 花垣县| 十堰市| 买车| 清远市| 承德市| 淅川县| 巩留县| 阿鲁科尔沁旗| 眉山市| 河间市| 天镇县| 增城市| 揭阳市| 龙山县| 尼玛县| 吴旗县| 土默特左旗| 宁阳县| 深州市| 峨山| 榆社县| 青海省| 安乡县| 夏津县| 和林格尔县| 龙州县| 太和县| 耿马| 宜宾县| 甘南县|