麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 數據庫 > Redis > 正文

基于redis實現的點贊功能設計思路詳解

2020-03-17 12:38:14
字體:
來源:轉載
供稿:網友

前言

點贊其實是一個很有意思的功能。基本的設計思路有大致兩種, 一種自然是用mysql等

數據庫直接落地存儲, 另外一種就是利用點贊的業(yè)務特征來扔到redis/224550.html">redis(或memcache)中, 然后離線刷回mysql等。

直接寫入Mysql

直接寫入Mysql是最簡單的做法。

做兩個表即可,

1、post_like

記錄文章被贊的次數,已有多少人贊過這種數據就可以直接從表中查到;

2、user_like_post

記錄用戶贊過了哪些文章, 當打開文章列表時,顯示的有沒有贊過的數據就在這里面;

缺點

1、數據庫讀寫壓力大

熱門文章會有很多用戶點贊,甚至是短時間內被大量點贊, 直接操作數據庫從長久來看不是很理想的做法。

redis存儲隨后批量刷回數據庫

redis主要的特點就是快, 畢竟主要數據都在內存嘛;

另外為啥我選擇redis而不是memcache的主要原因在于redis支持更多的數據類型, 例如hash, set, zset等。

下面具體的會用到這幾個類型。

優(yōu)點

1、性能高

2、緩解數據庫讀寫壓力

其實我更多的在于緩解寫壓力, 真的讀壓力, 通過mysql主從甚至通過加入redis對熱點數據做緩存都可以解決,

寫壓力對于前面的方案確實是不大好使。

缺點

1、開發(fā)復雜

這個比直接寫mysql的方案要復雜很多, 需要考慮的地方也很多;

2、不能保證數據安全性

redis掛掉的時候會丟失數據, 同時不及時同步redis中的數據, 可能會在redis內存置換的時候被淘汰掉;

不過對于我們點贊而已, 稍微丟失一點數據問題不大;

具體設計

Mysql設計

這一塊和寫入寫mysql是一樣的,畢竟是要落地存儲的。

所以還是同樣的需要post_like, user_like_post這兩表存儲文章被點贊的個數(等統計), 用戶對那些文章點了贊(取消贊)。

這兩表分別通過post_id, user_id進行關聯。

redis設計部分:

post_set

在redis中弄一個set存放所有被點贊的文章

post_user_like_set_{$post_id}

對每個post以post_id作為key, 搞一個set存放所有對該post點贊的用戶;

post_user_like_{$post_id}_{$user_id}

將每個用戶對每個post的點贊情況放到一個hash里面去, hash的字段就

隨意跟進需求來處理就行了。

為啥用hash

只所以用hash是因為完全可以用hash來存儲一個點贊的對象, 對應數據庫的一行記錄。

當然有同學會說用key, value也可以, 將所有的數據序列化(json_encode等)

后全部放到value里面去。 反復序列化也是一個很大的開銷不是, hash可以很

方便的修改某個字段, 而序列化和反序列化的操作。

post_{$post_id}_counter

對每個post維護一個計數器, 用來記錄當前在redis中的點贊數,

這里我們只用counter記錄尚未同步到mysql中的點贊數(可以為負), 每次

刷回mysql中時將counter中的數據和數據庫已有的贊數相加即可。

用戶點贊/取消贊

獲取user_id, post_id, 查詢該用戶是否已經點過贊, 已點過則不允許再次點贊,

或者設計為前端允許用戶點, 只是后臺不重復計算;

這里需要注意的是用戶點贊的記錄可能在數據庫中, 也可能在緩存中, 所以查詢的時候

緩存和數據庫都要查詢, 緩存沒有再查詢數據庫。

將用戶的點贊/取消贊的情況記錄在redis中, 具體為:

1、寫入post_set

post_id寫入post_set

2、寫入post_user_like_set_{$post_id}

user_id寫入post_user_like_set_{$post_id}

3、寫入post_user_like_{$post_id}_{$user_id}

將用戶點贊數據, 例如贊狀態(tài), post_id, user_id, ctime(操作時間), mtime(修改時間)寫入post_user_like_{$post_id}_{$user_id}

4、更新post_{$post_id}_counter

更新post_{$post_id}_counter, 這里的更新稍晚復雜一點, 需要和前面一樣先獲取當前用戶是否對這個post點過贊

如果點過, 并且本次是取消贊, counter減一, 如果沒點過, 本次是點贊, counter加一。

如果原來是取消贊的情況, 本次是點贊, counter加一。

同步刷回數據庫

循環(huán)從post_set中pop出來一個post_id至到空

    根據{$post_id} , 每次從post_user_like_set_{$post_id}中pop出來一個user_id直到空

        根據post_id, user_id, 直接獲取對應的hash表的內容(post_user_like_{$post_id}_{$user_id}

        將hash表中的數據寫入user_like_post表中

        將post_{$post_id}_counter中的數據和post_like中的數據相加, 將結果寫入到post_like表中

頁面展示

1、查詢用戶點贊情況

前面已經說過, 需要同時查詢redis和mysql

2、查詢post點贊統計

同樣需要查詢redis中的post_{$post_id}_counter和mysql的post_like表, 并將兩者相加

得到的結果才是正確的結果

總結

解決了mysql讀寫的問題

但沒有針對用戶量較大的場景考慮分表的設計, 可以考慮針對user_id或者post_id進行分表

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到Redis頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 欧美在线a | 国产精品久久久久久久久久尿 | av电影网站在线观看 | 精品一二三区视频 | 中文字幕在线一 | 插插操| 国产99视频精品免视看9 | 国产精品久久久久久久午夜片 | 欧美aⅴ视频 | 中文字幕在线观看精品 | 国产69精品久久99不卡免费版 | 久久久一区二区三区精品 | 欧美综合在线观看 | 一区二区三区视频在线播放 | 最新久久免费视频 | 色网站免费观看 | 在线播放黄色网址 | 国产一级αv片免费观看 | 鲁人人人鲁人人鲁精品 | 91精品国 | 日操操夜操操 | 一级免费特黄视频 | 蜜桃网站在线观看 | 亚洲最大的成人网 | 亚洲第一视频在线 | 成人福利在线播放 | 亚洲综合一区二区三区 | 史上最强炼体老祖动漫在线观看 | 中文字幕网在线 | 欧美一级毛片美99毛片 | 91网址在线播放 | 午夜视频在线免费播放 | 黄网站色成年大片免费高 | 免费毛片在线 | 成熟女人特级毛片www免费 | 久草在线免费看 | 禁漫天堂久久久久久久久久 | 免费看污视频在线观看 | 最新久久免费视频 | 一边吃奶一边摸下娇喘 | 羞羞答答影院 |