點讚收藏瀏覽記錄功能

2021-10-12 03:50:08 字數 1106 閱讀 3802

全部基於一套redis邏輯,資料定時延遲落地

點讚收藏由於有取消和新增,複雜一些,瀏覽記錄存粹新增,簡單些

問題1:

取消點讚到全部取消時,會出現兩個問題.

一是快取穿透,由於zset為空時查出來的是null,會穿透快取查庫.

二是資料不一致,假定每日定時持久化時間點為00:00,前一日對乙個資源進行了點讚操作,今日取消點讚,此時zset為空,走查庫邏輯,但是庫中資料又是前一天的資料,今日的取消運算元據還在快取中未落地,導致查詢出來此資源還是已點贊狀態.

已解決快取穿透以及資料不一致問題,第一次查詢查庫時,放乙個空物件,score為0放入zset中,後面每次走快取查詢都刪除一次空物件,total數量每次都減1

問題2:

定時持久化,之前採用的是insert on duplicated key插入存在便更新,但是老大提出之前專案遇到過死鎖問題不能使用on duplicated key.問題大概是若高併發情況下對同乙個唯一鍵資料進行操作,有回滾的情況下,會造成死鎖問題.雖然我這塊邏輯上是不會存在此類問題,但不可避免未知錯誤的發生具體可參考此篇文章

解決方案:採用redis快取已儲存的記錄,具體格式為hash(resourceid,userid),判斷需要持久化的記錄是update還是insert,如果需要保證快取的已儲存記錄一致,最好的方式是在持久化前查一遍庫(此方案我一直覺得不是很好,但是暫時想不出效能更好的方案)

以點讚為例:

核心:bitmap,持久化快取佇列,zset,分布式鎖

一.點讚/取消點讚

1.根據bitmap判斷是否點讚

2.取相反狀態,設定bitmap

3.存入快取佇列

4.判斷查詢快取是否存在,不存在便初始化查詢快取

5.若點贊:zadd,若取消點讚,remove.此處操作的實體要注意不能把時間插進去,要保證相同資源的所有屬性一致,才能夠remove掉對應的資源

二.查詢快取

1.分頁查快取

2.快取為空,查庫查所有,所有塞快取,分頁

三.定時資料落地

此套方案基本上是基於redis製作,極度依賴redis,必須開啟rdb或aof持久化機制,否則宕機的話會造成大批量資料丟失,特指bitmap(雖然也可以在宕機後跑一邊指令碼把bitmap設好)

ajax 實現點讚功能

原理 1.通過ajax將資料提交到服務端。2.服務端處理並返回結果。jquery的ajax形式如下 ajax 需要提交的資料 success function data if data 2 服務端處理資料 post接受資料 id post id user post user sql update t...

點讚功能與redis

摘要 前言點讚其實是乙個很有意思的功能。基本的設計思路有大致兩種,一種自然是用mysql等資料庫直接落地儲存,另外一種就是利用點讚的業務特徵來扔到redis 或memcache 中,然後離線刷回mysql等。直接寫入mysql直接寫入mysql是最簡單的做法。做兩個表即可,1 post like記錄...

點讚功能與redis

摘要 前言點讚其實是乙個很有意思的功能。基本的設計思路有大致兩種,一種自然是用mysql等資料庫直接落地儲存,另外一種就是利用點讚的業務特徵來扔到redis 或memcache 中,然後離線刷回mysql等。直接寫入mysql直接寫入mysql是最簡單的做法。做兩個表即可,1 post like記錄...