使用 Redis 緩存實(shí)現(xiàn)點(diǎn)贊和取消點(diǎn)贊的示例代碼
點(diǎn)贊功能是很多平臺(tái)都會(huì)提供的一個(gè)功能,那么,我們要如何實(shí)現(xiàn)點(diǎn)贊和取消點(diǎn)贊呢?
這篇文章總結(jié)了我在項(xiàng)目中實(shí)現(xiàn)點(diǎn)贊的方法。
緩存 vs 數(shù)據(jù)庫(kù)?
首先我們要考慮的是數(shù)據(jù)要放到哪里,很多時(shí)候我們都會(huì)把數(shù)據(jù)放到數(shù)據(jù)庫(kù)(如 MySQL),由于關(guān)系型數(shù)據(jù)庫(kù)的穩(wěn)定性,大部分場(chǎng)景下我們也都會(huì)使用關(guān)系數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)數(shù)據(jù)。
不過(guò),在一些特殊的場(chǎng)景下,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)很可能無(wú)法滿(mǎn)足我們的需求。比如,在訪問(wèn)量較大的情況下,數(shù)據(jù)庫(kù)很可能會(huì)宕機(jī)或者訪問(wèn)速度非常慢。這對(duì)用戶(hù)來(lái)說(shuō)是不能容忍的。因此就有了非關(guān)系型數(shù)據(jù)庫(kù),如 Redis 作為緩存,將數(shù)據(jù)放到內(nèi)存中,實(shí)現(xiàn)數(shù)據(jù)的快速獲取。下面我們就來(lái)看看如何使用 Redis 緩存實(shí)現(xiàn)點(diǎn)贊功能。
Redis 基本數(shù)據(jù)結(jié)構(gòu)
數(shù)據(jù)結(jié)構(gòu) | 含義 |
---|---|
string | 字符串變量 |
list | 鏈表 |
hash | 映射表 |
set | 無(wú)序集合 |
zset | 有序集合 |
具體介紹可以參考這篇博客。
點(diǎn)贊相關(guān)操作
- 對(duì)帖子點(diǎn)贊
- 對(duì)帖子取消點(diǎn)贊
- 查看帖子點(diǎn)贊數(shù)
我們可以先定義一個(gè)接口,包含了點(diǎn)贊的相關(guān)操作:
public interface LikeCacheService { /** * 獲取更新過(guò)的點(diǎn)贊帖子 id * @return */ Set<Object> listUpdatedPost(); /** * 測(cè)試用戶(hù)是否已經(jīng)對(duì)帖子點(diǎn)過(guò)贊 * @param userId 點(diǎn)贊用戶(hù) id * @param postId 待測(cè)試帖子 id * @return true if user has liked post */ boolean hasLiked(Integer userId, Long postId); /** * 獲取帖子點(diǎn)贊數(shù) * @param postId 帖子 id * @return 帖子的點(diǎn)贊數(shù) */ Integer getLikeCount(Long postId); /** * 點(diǎn)贊 * @param uid 用戶(hù) id * @param pid 帖子 id */ void like(Integer uid, Long pid); /** * 取消點(diǎn)贊 * @param uid 用戶(hù) id * @param pid 帖子 id */ void unlike(Integer uid, Long pid); /** * 某個(gè)帖子的點(diǎn)贊數(shù) +1 * @param pid 帖子 id */ void incrLikedCount(Long pid); /** * 某個(gè)帖子的點(diǎn)贊數(shù) -1 * @param pid 帖子 id */ void decrLikedCount(Long pid); /** * 刪除某個(gè)帖子的點(diǎn)贊信息 * @param pid 帖子 id */ void deletePostLikeSet(Long pid); /** * 獲取帖子點(diǎn)贊數(shù)據(jù)列表 */ List<FmsUserLikePost> listLikedData(); /** * 獲取帖子點(diǎn)贊數(shù)列表 */ List<FmsLikedCountDTO> listLikedCount(); /** * 同步帖子點(diǎn)贊數(shù)據(jù)到數(shù)據(jù)庫(kù) */ void syncLikeDataToDatabase(); }
接下來(lái),我們考慮一下要使用哪些數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)這些功能。
首先,點(diǎn)贊操作和取消點(diǎn)贊不能重復(fù)操作的,也就是不能連續(xù)點(diǎn)多次贊或者連續(xù)取消多次贊,每個(gè)用戶(hù)只能對(duì)某帖子點(diǎn)一次贊,因此我們可以使用 set 來(lái)存儲(chǔ)每個(gè)帖子的點(diǎn)贊用戶(hù),key 為帖子 id,value 為 每個(gè)對(duì)該帖子點(diǎn)贊的用戶(hù) id 集合。
- 點(diǎn)贊:將點(diǎn)贊用戶(hù) id 加入對(duì)應(yīng)帖子的點(diǎn)贊用戶(hù)集
- 取消點(diǎn)贊:將點(diǎn)贊用戶(hù) id 從對(duì)應(yīng)帖子的點(diǎn)贊用戶(hù)集移除
然后就是帖子點(diǎn)贊數(shù)的統(tǒng)計(jì),由于每個(gè)帖子都對(duì)應(yīng)一個(gè)點(diǎn)贊數(shù),因此我們可以使用 hash 結(jié)構(gòu)存儲(chǔ)帖子的點(diǎn)贊數(shù),key 為帖子 id,value 為該帖子的點(diǎn)贊數(shù)。
- 點(diǎn)贊:對(duì)應(yīng) hash 結(jié)構(gòu)的 value + 1
- 取消點(diǎn)贊:對(duì)應(yīng) hash 結(jié)構(gòu)的 value - 1
此外,為了保證數(shù)據(jù)的可恢復(fù)性,我們可以將 Redis 緩存中的數(shù)據(jù)定時(shí)寫(xiě)入關(guān)系型數(shù)據(jù)庫(kù)中,進(jìn)行數(shù)據(jù)持久化。
具體的實(shí)現(xiàn)代碼可以參考這個(gè)項(xiàng)目的代碼:FmsLikeCacheServiceImpl.java。
到此這篇關(guān)于使用 Redis 緩存實(shí)現(xiàn)點(diǎn)贊和取消點(diǎn)贊的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Redis點(diǎn)贊和取消點(diǎn)贊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot上傳臨時(shí)文件被刪除引起報(bào)錯(cuò)的解決
這篇文章主要介紹了SpringBoot上傳臨時(shí)文件被刪除引起報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11IntelliJ IDEA的數(shù)據(jù)庫(kù)管理工具實(shí)在太方便了(推薦)
這篇文章主要介紹了IntelliJ IDEA的數(shù)據(jù)庫(kù)管理工具實(shí)在太方便了,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09通過(guò)openOffice將office文件轉(zhuǎn)成pdf
這篇文章主要介紹了通過(guò)openOffice將office文件轉(zhuǎn)成pdf,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11SpringBoot-application.yml多環(huán)境配置詳解
本文主要介紹了SpringBoot-application.yml多環(huán)境配置詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07詳談Spring是否支持對(duì)靜態(tài)方法進(jìn)行Aop增強(qiáng)
這篇文章主要介紹了Spring是否支持對(duì)靜態(tài)方法進(jìn)行Aop增強(qiáng),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12Java多線程之JUC(java.util.concurrent)的常見(jiàn)類(lèi)(多線程編程常用類(lèi))
這篇文章主要給大家介紹了關(guān)于Java多線程之JUC(java.util.concurrent)的常見(jiàn)類(lèi)(多線程編程常用類(lèi))的相關(guān)資料,Java中的JUC(java.util.concurrent)包提供了一些并發(fā)編程中常用的類(lèi),這些類(lèi)可以幫助我們更方便地實(shí)現(xiàn)多線程編程,需要的朋友可以參考下2024-02-02Jsoup獲取全國(guó)地區(qū)數(shù)據(jù)屬性值(省市縣鎮(zhèn)村)
這篇文章主要介紹了Jsoup獲取全國(guó)地區(qū)數(shù)據(jù)屬性值(省市縣鎮(zhèn)村)的相關(guān)資料,需要的朋友可以參考下2015-10-10分享40個(gè)Java多線程問(wèn)題小結(jié)
多個(gè)線程共存于同一JVM進(jìn)程里面,所以共用相同的內(nèi)存空間,較之多進(jìn)程,多線程之間的通信更輕量級(jí),本文給大家分享40個(gè)Java多線程問(wèn)題小結(jié) 的相關(guān)資料,需要的朋友可以參考下2015-12-12