亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

基于redis實(shí)現(xiàn)的點(diǎn)贊功能設(shè)計(jì)思路詳解

 更新時(shí)間:2017年05月08日 11:17:38   作者:Furion  
點(diǎn)贊是我們現(xiàn)在經(jīng)常見(jiàn)到的一個(gè)效果,如朋友圈、微博都有點(diǎn)贊的效果,下面這篇文章主要跟大家分享了基于redis實(shí)現(xiàn)的點(diǎn)贊功能設(shè)計(jì)思路的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家實(shí)現(xiàn)點(diǎn)贊功能具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。

前言

點(diǎn)贊其實(shí)是一個(gè)很有意思的功能?;镜脑O(shè)計(jì)思路有大致兩種, 一種自然是用mysql等

數(shù)據(jù)庫(kù)直接落地存儲(chǔ), 另外一種就是利用點(diǎn)贊的業(yè)務(wù)特征來(lái)扔到redis(或memcache)中, 然后離線刷回mysql等。

直接寫(xiě)入Mysql

直接寫(xiě)入Mysql是最簡(jiǎn)單的做法。

做兩個(gè)表即可,

1、post_like

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

2、user_like_post

記錄用戶(hù)贊過(guò)了哪些文章, 當(dāng)打開(kāi)文章列表時(shí),顯示的有沒(méi)有贊過(guò)的數(shù)據(jù)就在這里面;

缺點(diǎn)

1、數(shù)據(jù)庫(kù)讀寫(xiě)壓力大

熱門(mén)文章會(huì)有很多用戶(hù)點(diǎn)贊,甚至是短時(shí)間內(nèi)被大量點(diǎn)贊, 直接操作數(shù)據(jù)庫(kù)從長(zhǎng)久來(lái)看不是很理想的做法。

redis存儲(chǔ)隨后批量刷回?cái)?shù)據(jù)庫(kù)

redis主要的特點(diǎn)就是快, 畢竟主要數(shù)據(jù)都在內(nèi)存嘛;

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

下面具體的會(huì)用到這幾個(gè)類(lèi)型。

優(yōu)點(diǎn)

1、性能高

2、緩解數(shù)據(jù)庫(kù)讀寫(xiě)壓力

其實(shí)我更多的在于緩解寫(xiě)壓力, 真的讀壓力, 通過(guò)mysql主從甚至通過(guò)加入redis對(duì)熱點(diǎn)數(shù)據(jù)做緩存都可以解決,

寫(xiě)壓力對(duì)于前面的方案確實(shí)是不大好使。

缺點(diǎn)

1、開(kāi)發(fā)復(fù)雜

這個(gè)比直接寫(xiě)mysql的方案要復(fù)雜很多, 需要考慮的地方也很多;

2、不能保證數(shù)據(jù)安全性

redis掛掉的時(shí)候會(huì)丟失數(shù)據(jù), 同時(shí)不及時(shí)同步redis中的數(shù)據(jù), 可能會(huì)在redis內(nèi)存置換的時(shí)候被淘汰掉;

不過(guò)對(duì)于我們點(diǎn)贊而已, 稍微丟失一點(diǎn)數(shù)據(jù)問(wèn)題不大;

具體設(shè)計(jì)

Mysql設(shè)計(jì)

這一塊和寫(xiě)入寫(xiě)mysql是一樣的,畢竟是要落地存儲(chǔ)的。

所以還是同樣的需要post_like, user_like_post這兩表存儲(chǔ)文章被點(diǎn)贊的個(gè)數(shù)(等統(tǒng)計(jì)), 用戶(hù)對(duì)那些文章點(diǎn)了贊(取消贊)。

這兩表分別通過(guò)post_id, user_id進(jìn)行關(guān)聯(lián)。

redis設(shè)計(jì)部分:

post_set

在redis中弄一個(gè)set存放所有被點(diǎn)贊的文章

post_user_like_set_{$post_id}

對(duì)每個(gè)post以post_id作為key, 搞一個(gè)set存放所有對(duì)該post點(diǎn)贊的用戶(hù);

post_user_like_{$post_id}_{$user_id}

將每個(gè)用戶(hù)對(duì)每個(gè)post的點(diǎn)贊情況放到一個(gè)hash里面去, hash的字段就

隨意跟進(jìn)需求來(lái)處理就行了。

為啥用hash

只所以用hash是因?yàn)橥耆梢杂胔ash來(lái)存儲(chǔ)一個(gè)點(diǎn)贊的對(duì)象, 對(duì)應(yīng)數(shù)據(jù)庫(kù)的一行記錄。

當(dāng)然有同學(xué)會(huì)說(shuō)用key, value也可以, 將所有的數(shù)據(jù)序列化(json_encode等)

后全部放到value里面去。 反復(fù)序列化也是一個(gè)很大的開(kāi)銷(xiāo)不是, hash可以很

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

post_{$post_id}_counter

對(duì)每個(gè)post維護(hù)一個(gè)計(jì)數(shù)器, 用來(lái)記錄當(dāng)前在redis中的點(diǎn)贊數(shù),

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

刷回mysql中時(shí)將counter中的數(shù)據(jù)和數(shù)據(jù)庫(kù)已有的贊數(shù)相加即可。

用戶(hù)點(diǎn)贊/取消贊

獲取user_id, post_id, 查詢(xún)?cè)撚脩?hù)是否已經(jīng)點(diǎn)過(guò)贊, 已點(diǎn)過(guò)則不允許再次點(diǎn)贊,

或者設(shè)計(jì)為前端允許用戶(hù)點(diǎn), 只是后臺(tái)不重復(fù)計(jì)算;

這里需要注意的是用戶(hù)點(diǎn)贊的記錄可能在數(shù)據(jù)庫(kù)中, 也可能在緩存中, 所以查詢(xún)的時(shí)候

緩存和數(shù)據(jù)庫(kù)都要查詢(xún), 緩存沒(méi)有再查詢(xún)數(shù)據(jù)庫(kù)。

將用戶(hù)的點(diǎn)贊/取消贊的情況記錄在redis中, 具體為:

1、寫(xiě)入post_set

post_id寫(xiě)入post_set

2、寫(xiě)入post_user_like_set_{$post_id}

user_id寫(xiě)入post_user_like_set_{$post_id}

3、寫(xiě)入post_user_like_{$post_id}_{$user_id}

將用戶(hù)點(diǎn)贊數(shù)據(jù), 例如贊狀態(tài), post_id, user_id, ctime(操作時(shí)間), mtime(修改時(shí)間)寫(xiě)入post_user_like_{$post_id}_{$user_id}

4、更新post_{$post_id}_counter

更新post_{$post_id}_counter, 這里的更新稍晚復(fù)雜一點(diǎn), 需要和前面一樣先獲取當(dāng)前用戶(hù)是否對(duì)這個(gè)post點(diǎn)過(guò)贊

如果點(diǎn)過(guò), 并且本次是取消贊, counter減一, 如果沒(méi)點(diǎn)過(guò), 本次是點(diǎn)贊, counter加一。

如果原來(lái)是取消贊的情況, 本次是點(diǎn)贊, counter加一。

同步刷回?cái)?shù)據(jù)庫(kù)

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

    根據(jù){$post_id} , 每次從post_user_like_set_{$post_id}中pop出來(lái)一個(gè)user_id直到空

        根據(jù)post_id, user_id, 直接獲取對(duì)應(yīng)的hash表的內(nèi)容(post_user_like_{$post_id}_{$user_id}

        將hash表中的數(shù)據(jù)寫(xiě)入user_like_post表中

        將post_{$post_id}_counter中的數(shù)據(jù)和post_like中的數(shù)據(jù)相加, 將結(jié)果寫(xiě)入到post_like表中

頁(yè)面展示

1、查詢(xún)用戶(hù)點(diǎn)贊情況

前面已經(jīng)說(shuō)過(guò), 需要同時(shí)查詢(xún)r(jià)edis和mysql

2、查詢(xún)post點(diǎn)贊統(tǒng)計(jì)

同樣需要查詢(xún)r(jià)edis中的post_{$post_id}_counter和mysql的post_like表, 并將兩者相加

得到的結(jié)果才是正確的結(jié)果

總結(jié)

解決了mysql讀寫(xiě)的問(wèn)題

但沒(méi)有針對(duì)用戶(hù)量較大的場(chǎng)景考慮分表的設(shè)計(jì), 可以考慮針對(duì)user_id或者post_id進(jìn)行分表

好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • Redis報(bào)錯(cuò):無(wú)法連接Redis服務(wù)的解決方法

    Redis報(bào)錯(cuò):無(wú)法連接Redis服務(wù)的解決方法

    在Linux系統(tǒng)上運(yùn)行Redis服務(wù)時(shí),有時(shí)會(huì)遇到“無(wú)法連接Redis服務(wù)”的報(bào)錯(cuò),本文就詳細(xì)的介紹一下解決方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • redis實(shí)現(xiàn)計(jì)數(shù)器-防止刷單方法介紹

    redis實(shí)現(xiàn)計(jì)數(shù)器-防止刷單方法介紹

    本文主要向大家介紹了redis實(shí)現(xiàn)計(jì)數(shù)器防止刷單的方法和有關(guān)代碼,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • 異步redis隊(duì)列實(shí)現(xiàn) 數(shù)據(jù)入庫(kù)的方法

    異步redis隊(duì)列實(shí)現(xiàn) 數(shù)據(jù)入庫(kù)的方法

    今天小編就為大家分享一篇異步redis隊(duì)列實(shí)現(xiàn) 數(shù)據(jù)入庫(kù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-10-10
  • Redis Cluster 字段模糊匹配及刪除

    Redis Cluster 字段模糊匹配及刪除

    在數(shù)據(jù)庫(kù)內(nèi)我們可以通過(guò)like關(guān)鍵字、%、*或者REGEX關(guān)鍵字進(jìn)行模糊匹配。而在Redis內(nèi)我們?nèi)绾芜M(jìn)行模糊匹配呢?本文就來(lái)介紹一下
    2021-05-05
  • Redis如何實(shí)現(xiàn)分布式鎖

    Redis如何實(shí)現(xiàn)分布式鎖

    相信大家對(duì)鎖已經(jīng)不陌生了,本文主要介紹了Redis如何實(shí)現(xiàn)分布式鎖,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Redis中什么是Big?Key(大key)問(wèn)題?如何解決Big?Key問(wèn)題?

    Redis中什么是Big?Key(大key)問(wèn)題?如何解決Big?Key問(wèn)題?

    大key并不是指key的值很大,而是key對(duì)應(yīng)的value很大,下面這篇文章主要給大家介紹了Redis中什么是Big?Key(大key)問(wèn)題?如何解決Big?Key問(wèn)題的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • 淺談redis加鎖常用幾種方式

    淺談redis加鎖常用幾種方式

    這篇文章主要介紹了淺談redis加鎖常用幾種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • SpringSession+Redis實(shí)現(xiàn)集群會(huì)話共享的方法

    SpringSession+Redis實(shí)現(xiàn)集群會(huì)話共享的方法

    為了保證WEB應(yīng)用的承載能力, 需要對(duì)WEB應(yīng)用進(jìn)行集群處理.這篇文章主要介紹了SpringSession+Redis實(shí)現(xiàn)集群會(huì)話共享的方法,需要的朋友參考下吧
    2018-08-08
  • Redis實(shí)現(xiàn)庫(kù)存扣減的示例代碼

    Redis實(shí)現(xiàn)庫(kù)存扣減的示例代碼

    在日常開(kāi)發(fā)中有很多地方都有類(lèi)似扣減庫(kù)存的操作,本文主要介紹了Redis實(shí)現(xiàn)庫(kù)存扣減的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-07-07
  • Redis快速實(shí)現(xiàn)分布式session的方法詳解

    Redis快速實(shí)現(xiàn)分布式session的方法詳解

    Session是客戶(hù)端與服務(wù)器通訊會(huì)話跟蹤技術(shù),服務(wù)器與客戶(hù)端保持整個(gè)通訊的會(huì)話基本信息。本文主要介紹了Redis快速實(shí)現(xiàn)分布式session的方法,感興趣的可以學(xué)習(xí)一下
    2022-01-01

最新評(píng)論