欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用 Redis 緩存實(shí)現(xiàn)點(diǎn)贊和取消點(diǎn)贊的示例代碼

 更新時(shí)間:2021年03月15日 10:44:04   作者:gnulxj  
這篇文章主要介紹了使用 Redis 緩存實(shí)現(xiàn)點(diǎn)贊和取消點(diǎn)贊的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

點(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ò)的解決

    這篇文章主要介紹了SpringBoot上傳臨時(shí)文件被刪除引起報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • IntelliJ IDEA的數(shù)據(jù)庫(kù)管理工具實(shí)在太方便了(推薦)

    IntelliJ 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ò)openOffice將office文件轉(zhuǎn)成pdf,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • SpringBoot-application.yml多環(huán)境配置詳解

    SpringBoot-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)

    這篇文章主要介紹了Spring是否支持對(duì)靜態(tài)方法進(jìn)行Aop增強(qiáng),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 查看java對(duì)象所占內(nèi)存大小的方法

    查看java對(duì)象所占內(nèi)存大小的方法

    這篇文章主要為大家介紹了如何查看java對(duì)象所占內(nèi)存大小的方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Java關(guān)鍵字super超詳細(xì)解釋

    Java關(guān)鍵字super超詳細(xì)解釋

    在Java中super是一個(gè)關(guān)鍵字,用于訪問(wèn)父類(lèi)中的屬性、方法或構(gòu)造函數(shù),這篇文章主要給大家介紹了關(guān)于Java關(guān)鍵字super超詳細(xì)解釋的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • Java多線程之JUC(java.util.concurrent)的常見(jiàn)類(lèi)(多線程編程常用類(lèi))

    Java多線程之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-02
  • Jsoup獲取全國(guó)地區(qū)數(shù)據(jù)屬性值(省市縣鎮(zhèn)村)

    Jsoup獲取全國(guó)地區(qū)數(shù)據(jù)屬性值(省市縣鎮(zhèn)村)

    這篇文章主要介紹了Jsoup獲取全國(guó)地區(qū)數(shù)據(jù)屬性值(省市縣鎮(zhèn)村)的相關(guān)資料,需要的朋友可以參考下
    2015-10-10
  • 分享40個(gè)Java多線程問(wèn)題小結(jié)

    分享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

最新評(píng)論