之前看了一篇文章,講redis的應用場景,其中乙個應用場景就是實現點讚功能,紙上得來恐覺淺,必須實戰一波使用者某篇文章的點讚數 使用hashmap資料結構,hashmap中的key為articleid,value為set,set中的值為使用者id,即hashmap
使用者總的點讚數 使用hashmap資料結構,hashmap中的key為userid,value為string記錄總的點讚數
使用者點讚的文章 使用hashmap資料結構,hashmap中的key為userid,value為set,set中的值為文章id,即hashmap
article表結構
字段值字段型別
說明article_name
varchar
文章名字
content
blob
文章內容
total_like_count
bigint
文章總點讚數
文章總的點讚數需要和redis中的點讚數進行同步
user_like_article表結構
字段值字段型別
說明user_id
bigint
使用者id
article_id
bigint
文章id
記錄使用者點讚文章的資訊,是一張中間表
說明:表結構設計省略了id、deleted、gmt_create、gmt_modified欄位
流程圖比較簡單,點讚和取消點讚基本實現步驟相同
public
void
likearticle
(long articleid, long likeduserid, long likedpostid)
,likeduserid:{},likedpostid:{}"
, articleid, likeduserid, likedpostid)
;synchronized
(this
),likeduserid:{},likedpostid:{}"
, articleid, likeduserid, likedpostid);}
}
public
void
unlikearticle
(long articleid, long likeduserid, long likedpostid)
,likeduserid:{},likedpostid:{}"
, articleid, likeduserid, likedpostid)
;//1.使用者總點讚數-1
synchronized
(this
) logger.
info
("取消點讚資料存入redis結束,articleid:{},likeduserid:{},likedpostid:{}"
, articleid, likeduserid, likedpostid)
;}
@scheduled
(cron =
"0 0 0/1 * * ? "
)public
void
redisdatatomysql()
,開始執行redis資料持久化到mysql任務"
, localdatetime.
now().
format
(formatter));
//1.更新文章總的點讚數
maparticlecountmap = redistemplate.
opsforhash()
.entries
(article_liked_user_key)
;for
(map.entry
entry : articlecountmap.
entryset()
) logger.
info
("time:{},結束執行redis資料持久化到mysql任務"
, localdatetime.
now().
format
(formatter));
}
說明:
歡迎fork與 star,如有紕漏歡迎指正
redis實現點讚功能參考
public void likearticle long articleid,long likeduserid,long likedpostid likeduserid likedpostid articleid,likeduserid,likedpostid synchronized this l...
點讚功能與redis
摘要 前言點讚其實是乙個很有意思的功能。基本的設計思路有大致兩種,一種自然是用mysql等資料庫直接落地儲存,另外一種就是利用點讚的業務特徵來扔到redis 或memcache 中,然後離線刷回mysql等。直接寫入mysql直接寫入mysql是最簡單的做法。做兩個表即可,1 post like記錄...
點讚功能與redis
摘要 前言點讚其實是乙個很有意思的功能。基本的設計思路有大致兩種,一種自然是用mysql等資料庫直接落地儲存,另外一種就是利用點讚的業務特徵來扔到redis 或memcache 中,然後離線刷回mysql等。直接寫入mysql直接寫入mysql是最簡單的做法。做兩個表即可,1 post like記錄...