基於 SpringCloud, 用戶發起點讚、取消點讚後先存入 Redis 中,再每隔兩小時從 Redis 讀取點讚數據寫入資料庫中做持久化存儲。
點讚功能在很多系統中都有,但別看功能小,想要做好需要考慮的東西還挺多的。
點讚、取消點讚是高頻次的操作,若每次都讀寫資料庫,大量的操作會影響資料庫性能,所以需要做緩存。
至於多久從 Redis 取一次數據存到資料庫中,根據項目的實際情況定吧,我是暫時設了兩個小時。
項目需求需要查看都誰點讚了,所以要存儲每個點讚的點讚人、被點讚人,不能簡單地做計數。
文章分四部分介紹:
Redis 緩存設計及實現資料庫設計資料庫操作開啟定時任務持久化存儲到資料庫一、Redis 緩存設計及實現
1.1 Redis 安裝及運行
Redis 安裝請自行查閱相關教程。
說下Docker 安裝運行 Redis
dockerrun-d-p6379:6379redis:4.0.8
如果已經安裝了 Redis,打開命令行,輸入啟動 Redis 的命令
redis-server
1.2 Redis 與 SpringBoot 項目的整合
1.在 pom.xml 中引入依賴
2.在啟動類上添加注釋 @EnableCaching
3.編寫 Redis 配置類 RedisConfig
至此 Redis 在 SpringBoot 項目中的配置已經完成,可以愉快的使用了。
1.3 Redis 的數據結構類型
Redis 可以存儲鍵與5種不同數據結構類型之間的映射,這5種數據結構類型分別為String(字符串)、List(列表)、Set(集合)、Hash(散列)和 Zset(有序集合)。
下面來對這5種數據結構類型作簡單的介紹:
1.4 點讚數據在 Redis 中的存儲格式
用 Redis 存儲兩種數據,一種是記錄點讚人、被點讚人、點讚狀態的數據,另一種是每個用戶被點讚了多少次,做個簡單的計數。
由於需要記錄點讚人和被點讚人,還有點讚狀態(點讚、取消點讚),還要固定時間間隔取出 Redis 中所有點讚數據,分析了下 Redis 數據格式中 Hash 最合適。
因為 Hash 裡的數據都是存在一個鍵裡,可以通過這個鍵很方便的把所有的點讚數據都取出。這個鍵裡面的數據還可以存成鍵值對的形式,方便存入點讚人、被點讚人和點讚狀態。
設點讚人的 id 為 likedPostId,被點讚人的 id 為 likedUserId ,點讚時狀態為 1,取消點讚狀態為 0。將點讚人 id 和被點讚人 id 作為鍵,兩個 id 中間用 :: 隔開,點讚狀態作為值。
所以如果用戶點讚,存儲的鍵為:likedUserId::likedPostId,對應的值為 1 。取消點讚,存儲的鍵為:likedUserId::likedPostId,對應的值為 0 。取數據時把鍵用 :: 切開就得到了兩個id,也很方便。
在可視化工具 RDM 中看到的是這樣子
1.5 操作 Redis
將具體操作方法封裝到了 RedisService 接口裡
RedisService.java
實現類 RedisServiceImpl.java
用到的工具類和枚舉類
RedisKeyUtils, 用於根據一定規則生成 key
LikedStatusEnum 用戶點讚狀態的枚舉類
package com.solo.coderiver.user.enums;
二、資料庫設計
資料庫表中至少要包含三個欄位:被點讚用戶id,點讚用戶id,點讚狀態。再加上主鍵id,創建時間,修改時間就行了。
建表語句
對應的對象 UserLike
三、資料庫操作
操作資料庫同樣封裝在接口中
LikedService
LikedServiceImpl 實現類
資料庫的操作就這些,主要還是增刪改查。
四、開啟定時任務持久化存儲到資料庫
定時任務 Quartz 很強大,就用它了。
Quartz 使用步驟:
添加依賴
2.編寫配置文件
3.編寫執行任務的類繼承自 QuartzJobBean
在定時任務中直接調用 LikedService 封裝的方法完成數據同步。
以上就是點讚功能的設計與實現,不足之處還請各位大佬多多指教。
如有更好的實現方案歡迎在評論區交流…