最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前言

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

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

直接寫入Mysql

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

做兩個表即可,

1、post_like

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

2、user_like_post

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

缺點(diǎn)

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

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

redis存儲隨后批量刷回數(shù)據(jù)庫

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

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

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

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

1、性能高

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

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

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

缺點(diǎn)

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

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

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

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

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

具體設(shè)計

Mysql設(shè)計

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

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

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

redis設(shè)計部分:

post_set

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

post_user_like_set_{$post_id}

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

post_user_like_{$post_id}_{$user_id}

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

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

為啥用hash

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

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

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

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

post_{$post_id}_counter

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

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

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

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

獲取user_id, post_id, 查詢該用戶是否已經(jīng)點(diǎn)過贊, 已點(diǎn)過則不允許再次點(diǎn)贊,

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

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

緩存和數(shù)據(jù)庫都要查詢, 緩存沒有再查詢數(shù)據(jù)庫。

將用戶的點(diǎn)贊/取消贊的情況記錄在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}

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

4、更新post_{$post_id}_counter

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

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

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

同步刷回數(shù)據(jù)庫

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

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

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

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

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

頁面展示

1、查詢用戶點(diǎn)贊情況

前面已經(jīng)說過, 需要同時查詢redis和mysql

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

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

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

總結(jié)

解決了mysql讀寫的問題

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

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

相關(guān)文章

  • Redis分布式鎖python-redis-lock使用方法

    Redis分布式鎖python-redis-lock使用方法

    這篇文章主要介紹了Redis分布式鎖python-redis-lock使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • Redis緩存鍵清理問題解決

    Redis緩存鍵清理問題解決

    對于使用redis作為緩存服務(wù)器的開發(fā)者而言,定期清除redis中的緩存數(shù)據(jù)是非常必要的,本文主要介紹了Redis緩存鍵清理問題解決,具有一定的參考價值,感興趣的可以了解一下
    2024-06-06
  • Redis2.8配置文件中文詳解

    Redis2.8配置文件中文詳解

    這篇文章主要介紹了Redis2.8配置文件中文詳解,本文提供的是是Redis2.8.9的配置文件各項(xiàng)的中文解釋,需要的朋友可以參考下
    2015-06-06
  • redis requires ruby version2.2.2的解決方案

    redis requires ruby version2.2.2的解決方案

    本文主要介紹了redis requires ruby version2.2.2的解決方案,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • Spring boot+redis實(shí)現(xiàn)消息發(fā)布與訂閱的代碼

    Spring boot+redis實(shí)現(xiàn)消息發(fā)布與訂閱的代碼

    這篇文章主要介紹了Spring boot+redis實(shí)現(xiàn)消息發(fā)布與訂閱,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值需要的朋友可以參考下
    2020-04-04
  • Redis7.0部署集群的實(shí)現(xiàn)步驟

    Redis7.0部署集群的實(shí)現(xiàn)步驟

    本文主要介紹了Redis7.0部署集群的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • redis分布式鎖優(yōu)化的實(shí)現(xiàn)

    redis分布式鎖優(yōu)化的實(shí)現(xiàn)

    本文主要介紹了redis分布式鎖優(yōu)化的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Windows系統(tǒng)安裝redis數(shù)據(jù)庫

    Windows系統(tǒng)安裝redis數(shù)據(jù)庫

    這篇文章介紹了Windows系統(tǒng)安裝redis數(shù)據(jù)庫的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • Redis出現(xiàn)(error)NOAUTH?Authentication?required.報錯的解決辦法(秒懂!)

    Redis出現(xiàn)(error)NOAUTH?Authentication?required.報錯的解決辦法(秒懂!)

    這篇文章主要給大家介紹了關(guān)于Redis出現(xiàn)(error)NOAUTH?Authentication?required.報錯的解決辦法,對于 這個錯誤這通常是因?yàn)镽edis服務(wù)器需要密碼進(jìn)行身份驗(yàn)證,但客戶端沒有提供正確的身份驗(yàn)證信息導(dǎo)致的,需要的朋友可以參考下
    2024-03-03
  • Redis在計數(shù)器和人員記錄的事務(wù)操作應(yīng)用小結(jié)

    Redis在計數(shù)器和人員記錄的事務(wù)操作應(yīng)用小結(jié)

    Redis是一個高性能的鍵值存儲系統(tǒng),專于處理計數(shù)器和事務(wù)操作,它提供了INCR、DECR等命令來進(jìn)行原子遞增或遞減操作,并通過MULTI、EXEC等命令實(shí)現(xiàn)事務(wù)操作,此外,Redis的Pipeline功能可減少網(wǎng)絡(luò)往返次數(shù),提高性能
    2024-10-10

最新評論

绥德县| 深泽县| 开原市| 凤庆县| 张家川| 木兰县| 偏关县| 黄骅市| 营口市| 蒙城县| 云龙县| 武义县| 巴彦淖尔市| 泰和县| 江达县| 时尚| 报价| 内江市| 桃江县| 孟州市| 济源市| 甘洛县| 毕节市| 句容市| 昌平区| 大理市| 新泰市| 三原县| 东丰县| 贵德县| 徐州市| 拉孜县| 汕尾市| 宜丰县| 吴忠市| 池州市| 宁陕县| 精河县| 萝北县| 汕尾市| 偏关县|