<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      基于redis的點贊功能設計

      前言

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

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

      直接寫入Mysql

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

      做兩個表即可,

      • post_like

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

      • user_like_post

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

      缺點

      • 數據庫讀寫壓力大

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

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

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

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

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

      優點

      • 性能高

      • 緩解數據庫讀寫壓力

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

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

      缺點

      • 開發復雜

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

      • 不能保證數據安全性

        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中, 具體為:

      • 寫入post_set

        將post_id寫入post_set

      • 寫入post_user_like_set_{$post_id}

        將user_id寫入post_user_like_set_{$post_id}

      • 寫入post_user_like_{$post_id}_{$user_id}

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

      • 更新post_{$post_id}_counter

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

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

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

      同步刷回數據庫

      • 循環從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表中

      頁面展示

      • 查詢用戶點贊情況
        前面已經說過, 需要同時查詢redis和mysql

      • 查詢post點贊統計

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

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

      總結

        • 解決了mysql讀寫的問題

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

       

      http://www.furion.info/808.html?utm_source=tuicool&utm_medium=referral

       

      posted @ 2016-08-10 10:35  去.玩兒  閱讀(569)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 综合偷自拍亚洲乱中文字幕| 欧美人人妻人人澡人人尤物| 亚洲国产精品综合久久20| 亚洲国产午夜精品福利| 日本污视频在线观看| 久久国产成人高清精品亚洲| 精品国产免费人成在线观看| 日韩精品无码一区二区视频| 人妻夜夜爽天天爽三区麻豆av| 成人国产精品一区二区网站公司| 日韩国产精品中文字幕| 青青草国产精品日韩欧美| 亚洲精品一区二区三区四区乱码| 欧美白妞大战非洲大炮| 亚洲av色一区二区三区| 亚洲天堂伊人久久a成人| 娇妻玩4p被三个男人伺候| 亚洲av乱码一区二区| www欧美在线观看| 无码中文字幕人妻在线一区| 一区二区不卡99精品日韩| 无码专区视频精品老司机| 少妇办公室好紧好爽再浪一点| 国产亚洲综合另类色专区| 国产sm重味一区二区三区| 中文人妻av高清一区二区| 日韩视频中文字幕精品偷拍| 夜夜爽免费888视频| 91中文字幕一区二区| 激情在线网| 窝窝午夜色视频国产精品破| 国产日韩av二区三区| 日韩人妻少妇一区二区三区| AV最新高清无码专区| 国产av无码国产av毛片| 国产成人精品无码播放| 成年女人免费碰碰视频| 深夜福利成人免费在线观看| 狠狠躁夜夜躁人人爽天天5| 亚洲另类欧美综合久久图片区| 无码三级av电影在线观看|