帖子詳情涉及內容詳情/閱讀數/評論數/點贊數/評論列表顯示、點贊/取消贊、判斷是否點贊、評論、更新閱讀數/評論數/點贊數等。
拿以上功能舉例,業務一開始有帖子表、評論表、點贊表,所有操作未做任何處理均直連數據庫,產生如下數據庫操作:
- 獲取帖子詳情:通過tid查詢帖子表拿到數據、對瀏覽數+1操作、通過uid和tid查詢點贊表存在記錄為已點贊。
- 新增評論:評論數據插入評論表、帖子表評論數+1操作。
- 點贊/取消點贊:點贊表插入數據、帖子表點贊數+1操作。
當數據量和訪問量上去的時候,直連數據庫查詢就很慢了,解決方案是使用緩存和消息隊列異步處理。
緩存
將接口獲取的數據存到redis內存中消息隊列異步處理業務
以redis list隊列形式保存數據,取數據時按先進先出或者先進后出這樣的形式有序進行。通常可以將需要做的操作加入到消息隊列,另外一個服務專門處理消化這個隊列,達到業務高峰期消峰和業務統一逐一處理的目的。
獲取帖子詳情
建立以tiezi:{tid}為key,hash數據結構保存字段和值的形式緩存。
原則先讀緩存,緩存無數據再讀數據庫返回并寫入緩存。
判斷用戶是否點贊
建立以userlikes:{tid}為key,sorted set數據結構保存用戶的id(uid)和點贊時間,判斷方式為當前uid存在此sort set集合中表示用戶已點贊。使用sorted set結構是因為需要獲取帖子的點贊列表
原則先讀緩存,緩存無數據再讀數據庫同時更新緩存。
用戶點贊/取消贊
更新緩存對應key進行增加/移除uid操作,將uid和tid插入點贊隊列然后直接返回完成操作。另外一個后臺任務會不斷的從這個隊列取出數據進行相應的數據庫操作。
增加閱讀數/點贊數
對緩存數據pvs進行+1操作,每天定時同步更新至數據庫。
或者新增一個key=pvs的hash緩存,專門存放不同帖子今日的pv,然后每次獲取帖子pv的時候,帖子詳情中的pv加上今日pv即可。
新增評論/評論列表展示
思路是將評論數據先插入緩存,再加入消息隊列異步插入到數據庫中。
先插入緩存再插入數據庫的方式,表的主鍵就不能使用數據庫的自增了,主鍵需要改成通過程序生成, 然后將帖子的評論id保存起來,就像上面緩存帖子點贊一樣的形式(sorted set),讀取出來的評論id可以按插入時間有序排列。
評論列表展示時,例如拿最新的20條評論,先通過有序集合拿出這篇文章最新的前20個評論ID,再通過評論ID去拿評論內容展示出來。