Redis實現(xiàn)用戶關注的項目實踐
在實現(xiàn)社交網絡功能中,實現(xiàn)互相關注是必不可少的。在這里,我們將使用Redis來實現(xiàn)這個功能,前端使用Vue框架實現(xiàn)。
功能要求
我們需要實現(xiàn)以下幾個功能:
- 用戶能夠關注其他用戶
- 用戶能夠取消關注其他用戶
- 用戶能夠查看自己關注的人和被誰關注
- 在用戶的主頁上,能夠顯示關注和被關注的數(shù)量
Redis存儲結構設計
我們使用Redis的set
數(shù)據結構來存儲用戶關注的人和被關注的人。具體來說,每個用戶都有一個following
和followers
屬性,分別表示該用戶關注的人和被誰關注。然后在Redis中使用set
類型來存儲這些關注信息,在set中,我們將每個關注對象的id存儲下來,方便后續(xù)的查詢。
后端實現(xiàn)
添加關注
我們需要通過API來讓用戶實現(xiàn)添加關注和取消關注。下面是添加關注的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中刪除。
查看關注對象
最后,我們需要實現(xiàn)查看關注對象的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'); } });
前端實現(xiàn)
在前端中,我們使用Vue框架來實現(xiàn)。需要提供以下功能:
- 用戶可以通過點擊按鈕來添加和取消關注操作
- 用戶的主頁可以顯示關注和被關注的數(shù)量
添加關注和取消關注操作
在Vue中,我們可以使用@click
監(jiān)聽用戶點擊事件,并在方法中發(fā)送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}`); // 更新關注狀態(tài) this.isFollowingUsers[id] = true; }, // 取消關注 async unfollowUser(id) { await axios.delete(`/api/followers/${id}`); // 更新關注狀態(tài) this.isFollowingUsers[id] = false; }, // 判斷是否關注 isFollowing(id) { return this.isFollowingUsers[id]; } }
在這個代碼中,我們使用了isFollowingUsers
對象來存儲所有用戶的關注狀態(tài)。
顯示關注和被關注數(shù)量
為了在用戶的主頁上顯示關注和被關注的數(shù)量,我們需要在后端添加相應的API,并在前端調用數(shù)據顯示。下面是相關代碼:
// 獲取關注和粉絲數(shù)量 router.get('/followers/count', async (req, res) => { try { const userId = req.user.id; // 獲取關注和被關注數(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'); } });
<!-- 顯示關注和被關注數(shù)量 --> <div> <p>關注 {{followingCount}}</p> <p>被關注 {{followerCount}}</p> </div>
在這個代碼中,我們使用了redis.scard
方法來獲取set的數(shù)量。
總結
以上就是使用Redis實現(xiàn)互相關注功能的全部內容。通過使用Redis的set
數(shù)據結構來存儲關注對象,方便高效地進行添加和取消關注操作。同時,在前端中使用Vue框架實現(xiàn)了可交互的關注和取消關注按鈕,并在用戶主頁上顯示了關注和被關注的數(shù)量。
到此這篇關于Redis實現(xiàn)用戶關注的項目實踐的文章就介紹到這了,更多相關Redis 用戶關注內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Caffeine實現(xiàn)類似redis的動態(tài)過期時間設置示例
這篇文章主要為大家介紹了Caffeine實現(xiàn)類似redis的動態(tài)過期時間示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08