使用 Redis 緩存實現(xiàn)點贊和取消點贊的示例代碼
點贊功能是很多平臺都會提供的一個功能,那么,我們要如何實現(xiàn)點贊和取消點贊呢?
這篇文章總結(jié)了我在項目中實現(xiàn)點贊的方法。
緩存 vs 數(shù)據(jù)庫?
首先我們要考慮的是數(shù)據(jù)要放到哪里,很多時候我們都會把數(shù)據(jù)放到數(shù)據(jù)庫(如 MySQL),由于關(guān)系型數(shù)據(jù)庫的穩(wěn)定性,大部分場景下我們也都會使用關(guān)系數(shù)據(jù)庫來存儲數(shù)據(jù)。
不過,在一些特殊的場景下,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫很可能無法滿足我們的需求。比如,在訪問量較大的情況下,數(shù)據(jù)庫很可能會宕機(jī)或者訪問速度非常慢。這對用戶來說是不能容忍的。因此就有了非關(guān)系型數(shù)據(jù)庫,如 Redis 作為緩存,將數(shù)據(jù)放到內(nèi)存中,實現(xiàn)數(shù)據(jù)的快速獲取。下面我們就來看看如何使用 Redis 緩存實現(xiàn)點贊功能。
Redis 基本數(shù)據(jù)結(jié)構(gòu)
| 數(shù)據(jù)結(jié)構(gòu) | 含義 |
|---|---|
| string | 字符串變量 |
| list | 鏈表 |
| hash | 映射表 |
| set | 無序集合 |
| zset | 有序集合 |
具體介紹可以參考這篇博客。
點贊相關(guān)操作
- 對帖子點贊
- 對帖子取消點贊
- 查看帖子點贊數(shù)
我們可以先定義一個接口,包含了點贊的相關(guān)操作:
public interface LikeCacheService {
/**
* 獲取更新過的點贊帖子 id
* @return
*/
Set<Object> listUpdatedPost();
/**
* 測試用戶是否已經(jīng)對帖子點過贊
* @param userId 點贊用戶 id
* @param postId 待測試帖子 id
* @return true if user has liked post
*/
boolean hasLiked(Integer userId, Long postId);
/**
* 獲取帖子點贊數(shù)
* @param postId 帖子 id
* @return 帖子的點贊數(shù)
*/
Integer getLikeCount(Long postId);
/**
* 點贊
* @param uid 用戶 id
* @param pid 帖子 id
*/
void like(Integer uid, Long pid);
/**
* 取消點贊
* @param uid 用戶 id
* @param pid 帖子 id
*/
void unlike(Integer uid, Long pid);
/**
* 某個帖子的點贊數(shù) +1
* @param pid 帖子 id
*/
void incrLikedCount(Long pid);
/**
* 某個帖子的點贊數(shù) -1
* @param pid 帖子 id
*/
void decrLikedCount(Long pid);
/**
* 刪除某個帖子的點贊信息
* @param pid 帖子 id
*/
void deletePostLikeSet(Long pid);
/**
* 獲取帖子點贊數(shù)據(jù)列表
*/
List<FmsUserLikePost> listLikedData();
/**
* 獲取帖子點贊數(shù)列表
*/
List<FmsLikedCountDTO> listLikedCount();
/**
* 同步帖子點贊數(shù)據(jù)到數(shù)據(jù)庫
*/
void syncLikeDataToDatabase();
}
接下來,我們考慮一下要使用哪些數(shù)據(jù)結(jié)構(gòu)來實現(xiàn)這些功能。
首先,點贊操作和取消點贊不能重復(fù)操作的,也就是不能連續(xù)點多次贊或者連續(xù)取消多次贊,每個用戶只能對某帖子點一次贊,因此我們可以使用 set 來存儲每個帖子的點贊用戶,key 為帖子 id,value 為 每個對該帖子點贊的用戶 id 集合。
- 點贊:將點贊用戶 id 加入對應(yīng)帖子的點贊用戶集
- 取消點贊:將點贊用戶 id 從對應(yīng)帖子的點贊用戶集移除
然后就是帖子點贊數(shù)的統(tǒng)計,由于每個帖子都對應(yīng)一個點贊數(shù),因此我們可以使用 hash 結(jié)構(gòu)存儲帖子的點贊數(shù),key 為帖子 id,value 為該帖子的點贊數(shù)。
- 點贊:對應(yīng) hash 結(jié)構(gòu)的 value + 1
- 取消點贊:對應(yīng) hash 結(jié)構(gòu)的 value - 1
此外,為了保證數(shù)據(jù)的可恢復(fù)性,我們可以將 Redis 緩存中的數(shù)據(jù)定時寫入關(guān)系型數(shù)據(jù)庫中,進(jìn)行數(shù)據(jù)持久化。
具體的實現(xiàn)代碼可以參考這個項目的代碼:FmsLikeCacheServiceImpl.java。
到此這篇關(guān)于使用 Redis 緩存實現(xiàn)點贊和取消點贊的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)Redis點贊和取消點贊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
微服務(wù)鏈路追蹤Spring Cloud Sleuth整合Zipkin解析
這篇文章主要為大家介紹了微服務(wù)鏈路追蹤Spring Cloud Sleuth整合Zipkin解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
Java利用FileUtils讀取數(shù)據(jù)和寫入數(shù)據(jù)到文件
這篇文章主要介紹了Java利用FileUtils讀取數(shù)據(jù)和寫入數(shù)據(jù)到文件,下面文章圍繞FileUtils的相關(guān)資料展開怎么讀取數(shù)據(jù)和寫入數(shù)據(jù)到文件的內(nèi)容,具有一定的參考價值,徐婭奧德小伙伴可以參考一下2021-12-12
Spring boot @RequestBody數(shù)據(jù)傳遞過程詳解
這篇文章主要介紹了Spring boot @RequestBody數(shù)據(jù)傳遞過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12
Java中dubbo+zookeeper微服務(wù)架構(gòu)簡介
Apache Dubbo是一款高性能的 Java RPC 框架,這篇文章主要介紹了Java中dubbo+zookeeper微服務(wù)架構(gòu),需要的朋友可以參考下2021-09-09
idea在工具欄中顯示快速創(chuàng)建包和類的圖標(biāo)的詳細(xì)步驟
點擊需要創(chuàng)建包或者類的位置,在點擊對用的圖標(biāo)就可以快速創(chuàng)建類或者包了,下面小編給大家介紹idea在工具欄中顯示快速創(chuàng)建包和類的圖標(biāo)的詳細(xì)步驟,感興趣的朋友一起看看吧2024-02-02
IntelliJ IDEA之配置JDK的4種方式(小結(jié))
這篇文章主要介紹了IntelliJ IDEA之配置JDK的4種方式(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10

