使用 Redis 緩存實現點贊和取消點贊


點贊功能是很多平台都會提供的一個功能,那么,我們要如何實現點贊和取消點贊呢?

這篇文章總結了我在項目中實現點贊的方法。

緩存 vs 數據庫?

首先我們要考慮的是數據要放到哪里,很多時候我們都會把數據放到數據庫(如 MySQL),由於關系型數據庫的穩定性,大部分場景下我們也都會使用關系數據庫來存儲數據。

不過,在一些特殊的場景下,傳統的關系型數據庫很可能無法滿足我們的需求。比如,在訪問量較大的情況下,數據庫很可能會宕機或者訪問速度非常慢。這對用戶來說是不能容忍的。因此就有了非關系型數據庫,如 Redis 作為緩存,將數據放到內存中,實現數據的快速獲取。下面我們就來看看如何使用 Redis 緩存實現點贊功能。

Redis 基本數據結構

數據結構 含義
string 字符串變量
list 鏈表
hash 映射表
set 無序集合
zset 有序集合

具體介紹可以參考 這篇博客

點贊相關操作

  • 對帖子點贊
  • 對帖子取消點贊
  • 查看帖子點贊數

我們可以先定義一個接口,包含了點贊的相關操作:

public interface LikeCacheService {

    /**
     * 獲取更新過的點贊帖子 id
     * @return
     */
    Set<Object> listUpdatedPost();

    /**
     * 測試用戶是否已經對帖子點過贊
     * @param userId 點贊用戶 id
     * @param postId 待測試帖子 id
     * @return true if user has liked post
     */
    boolean hasLiked(Integer userId, Long postId);

    /**
     * 獲取帖子點贊數
     * @param postId 帖子 id
     * @return 帖子的點贊數
     */
    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);

    /**
     * 某個帖子的點贊數 +1
     * @param pid 帖子 id
     */
    void incrLikedCount(Long pid);

    /**
     * 某個帖子的點贊數 -1
     * @param pid 帖子 id
     */
    void decrLikedCount(Long pid);

    /**
     * 刪除某個帖子的點贊信息
     * @param pid 帖子 id
     */
    void deletePostLikeSet(Long pid);

    /**
     * 獲取帖子點贊數據列表
     */
    List<FmsUserLikePost> listLikedData();

    /**
     * 獲取帖子點贊數列表
     */
    List<FmsLikedCountDTO> listLikedCount();

    /**
     * 同步帖子點贊數據到數據庫
     */
    void syncLikeDataToDatabase();
}

接下來,我們考慮一下要使用哪些數據結構來實現這些功能。

首先,點贊操作和取消點贊不能重復操作的,也就是不能連續點多次贊或者連續取消多次贊,每個用戶只能對某帖子點一次贊,因此我們可以使用 set 來存儲每個帖子的點贊用戶,key 為帖子 id,value 為 每個對該帖子點贊的用戶 id 集合。

  • 點贊:將點贊用戶 id 加入對應帖子的點贊用戶集
  • 取消點贊:將點贊用戶 id 從對應帖子的點贊用戶集移除

然后就是帖子點贊數的統計,由於每個帖子都對應一個點贊數,因此我們可以使用 hash 結構存儲帖子的點贊數,key 為帖子 id,value 為該帖子的點贊數。

  • 點贊:對應 hash 結構的 value + 1
  • 取消點贊:對應 hash 結構的 value - 1

此外,為了保證數據的可恢復性,我們可以將 Redis 緩存中的數據定時寫入關系型數據庫中,進行數據持久化。

具體的實現代碼可以參考這個項目的代碼:FmsLikeCacheServiceImpl.java


(全文完)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM