成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

點贊功能,用MySQL還是Redis

移動開發 Android Redis
點贊功能是目前app開發基本的功能,今天我們就來聊聊 點贊、評論、收藏等這些場景的db數據庫設計問題,

點贊功能是目前app開發基本的功能

今天我們就來聊聊 點贊、評論、收藏等這些場景的db數據庫設計問題,

1. 我們先來看看場景的需求:

  • 顯示點贊數量
  • 判斷用戶是否點過贊,用于去重,必須的判斷
  • 顯示個人點贊列表,一般在用戶中心
  • 顯示文章點贊列表

我們先看一下頭條和微博的例子 

點贊功能,用mysql還是redis?
頭條的點贊

 

點贊功能,用mysql還是redis?
微博的點贊

這兩個都是具有頂級流量的,后端肯定有復雜的架構,我們今天只談大眾化的方案。

2.1 mysql方案

mysql方案, 隨著nosql的流行,大數據的持續熱點,但是mysql仍然不可替代,對于大多數的中小項目,低于千萬級的數據量,采用mysql分表+cache,是完全可以勝任的,而且穩定性是其他方案無可比擬的:

  1. 文章表 
  2.  
  3. create table post { 
  4.  
  5.         post_id int(11) NOT NULL AUTO_INCREMENT, 
  6.  
  7.         ...... 
  8.  
  9.         star_num int(11) COMMENT '點贊數量' 
  10.  
  11.  
  12. 用戶表 
  13.  
  14. create table user { 
  15.  
  16.         user_id int(11) NOT NULL AUTO_INCREMENT, 
  17.  
  18.         ...... 
  19.  
  20.         star_num int(11) COMMENT '點贊數量' 
  21.  
  22.  
  23. 點贊表 
  24.  
  25. create table star { 
  26.  
  27.         id int(11) NOT NULL AUTO_INCREMENT, 
  28.  
  29.         post_id, 
  30.  
  31.         user_id, 
  32.  
  33.         ...... 
  34.  

常用的查詢:

  1. 查詢用戶點贊過的文章 select post_id from star where user_id=?  
  2. 查詢文章的點贊用戶 select user_id from star where post_id=? 

點贊數量可以通過定時異步統計更新到post和user 表中。

數據量不大的時候,這種設計基本可以滿足需求了,

缺點:

  • 數據量大時,一張表在查詢時壓力巨大,需要分表,而不論用post_id還是user_id來hash分表都與我們的需求有沖突,唯一的辦法就是做兩個表冗余。這增加了存儲空間和維護工作量,還可能有一致性問題。

2.2 redis方案

當數據量達到上億的量,上cache是必經的階段,由于點贊這種動作很隨意,很多人看到大拇指就想點,所以數據量增長很快,數據規模上來后,對mysql讀寫都有很大的壓力,這時就要考慮memcache、redis進行存儲或cache。

為什么一般都選擇redis, redis作為流行的nosql,有著豐富的數據類型,可以適應多個場景的需求。

采用redis有兩種用途,一種是storage,一種是純cache,需要+mysql一起。純cache就是把數據從mysql先寫入redis,用戶先讀cache,miss后再拉取MySQL,同時cache做同步。 

點贊功能,用mysql還是redis?
cache

多數場景二者是同時使用的,并不沖突。

下面說下redis作為storage的方案:

場景a :顯示點贊數量

在點贊的地方,只是顯示一個點贊數量,能區分用戶是否點贊過,一般用戶不關心這個列表,這個場景只要一個數字就可以了,當數量比較大時,一般顯示為"7k" ,"10W" 這樣。

以文章id為key

  1. //以文章id=888為例  
  2. 127.0.0.1:6379[2]> set star:tid:888 898 //設置點贊數量  
  3. OK  
  4. 127.0.0.1:6379[2]> incr star:tid:888 //實現數量自增 (integer)  
  5. 899 

場景b:點贊去重,避免重復點贊

要實現這個需求,必須有文章點贊的uid列表,以uid為key場景c:一般在用戶中心,可以看到用戶自己的點贊列表

這個需求可以使用場景b的數據來實現。 

點贊功能,用mysql還是redis?
用戶中心點贊列表

場景d:文章的點贊列表,類似場景b,以文章id為key

  1. //以文章id=888為例  
  2. 127.0.0.1:6379[2]> sadd star:list:tid:888 123 456 789  //點贊uid列表 (integer)  
  3. 3  
  4. 127.0.0.1:6379[2]> sismember star:list:tid:888 456  //判斷是否點贊 (integer)  

點贊的地方,如果點贊過顯示紅色,沒有則顯示黑白色,

今日頭條是沒有地方可以看到點贊列表的,而微博點進去,詳情頁可以看到點贊列表,但是只會顯示最近的幾十條,沒有分頁顯示。

如下圖,我選了一條熱點,擁有眾多粉絲的“豬豬” 

點贊功能,用mysql還是redis?
帖子點贊列表

可能有人覺得,點贊列表沒人關心,存儲又會浪費大量資源,不如不存!但是,這個數據是必須要有的。兩點:

a. 去重。點贊數可以不精確,但去重必須是精確的,

b.另外一個社交產品,用戶行為的一點一滴都需要記錄,對于后續的用戶行為分析和數據挖掘都是有意義的。

上面使用string存儲的用戶點贊數量,除了string,還可以用hash來存儲,對文章id分塊,每100個存到一個hash,分別存入hash table,每個文章id為hash的一個key,value存儲點贊的用戶id,如果點贊用戶很多,避免id過多產生性能問題,可以單列出來,用sorted set結構保存,熱點的畢竟是少數。 

點贊功能,用mysql還是redis?
hash

方案優缺點比對

hash:使用了更少的全局key ,節省了內存空間;但是也帶來了問題

如何根據文章id路由到對應的hash?

查找一個用戶id是在hash還是set?存在不確定性

使用hash雖然節省了空間,但增加了復雜度,如何選擇就看個人需求了。

除此之外,你還有其他的方法嗎?

3. 數據一致性

redis作為storage使用時,一定要做好數據的持久化,必須開啟 rdb 和 aof,這會導致業務只能使用一半的機器內存,所以要做好容量的監控,及時擴容。

另外只要有數據copy,就會有一致性問題,這就是另外一個很重要的話題了。以后有時間再細聊吧!

寫在最后:把問題寫明白,真不是一件容易的事情,請大家多多關注,留言,謝謝!

前幾天寫的一篇文章,受到眾多同行的熱情回復,能和眾多同行一起交流,深感榮幸!對于工程類問題,沒有標準的方案,一千個人有一千個方案,哪個最適合你只有你自己知道!期待你更好的思路和方法。

 

責任編輯:未麗燕 來源: 今日頭條
相關推薦

2020-07-02 16:40:40

MySQLRedis數據庫

2020-01-10 15:15:53

Redis點贊數據庫

2020-12-03 11:00:29

Spring ClouRedis數據庫

2015-07-17 10:41:59

點贊按鈕

2021-08-10 15:37:34

鴻蒙HarmonyOS應用

2021-04-14 14:28:14

Python點攢抖音

2019-07-16 09:22:10

RedisZookeeper分布式鎖

2020-11-16 12:55:41

Redis分布式鎖Zookeeper

2020-08-21 10:41:07

微信隱藏點評評論

2024-02-26 08:25:00

模型訓練

2025-06-13 08:26:08

JetpackCompose按鈕

2025-02-17 09:20:00

MySQL存儲數據庫

2025-04-28 14:02:08

ChatGPTOpenAI醫療助手

2019-08-28 10:44:48

RedisJava文章

2015-07-21 15:22:20

點贊仿知乎按鈕動畫

2018-05-10 16:47:10

戴爾

2020-02-10 16:02:29

東華軟件

2019-10-23 09:48:46

RedisMySQLMongoDB

2021-09-06 06:45:07

NacosUdp通信

2022-08-11 09:30:52

transitionCSS
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品一级 | 亚洲综合区 | 成人一区精品 | 黄网站涩免费蜜桃网站 | 成人精品一区二区 | 亚洲国产精品日本 | www.99精品| 少妇精品亚洲一区二区成人 | 国产一区不卡 | 91精品国产欧美一区二区 | 九九精品在线 | 福利片在线观看 | 亚洲导航深夜福利涩涩屋 | 精品自拍视频在线观看 | 91在线免费视频 | 国产精品99久久久久久久久久久久 | 国产视频黄色 | 99久久免费观看 | 亚洲 中文 欧美 日韩 在线观看 | 韩日在线| 国产精品99久久久久久动医院 | 亚洲97| 激情一区| 91日日| 精品国产乱码久久久久久中文 | 激情毛片 | 日韩福利| 中文字幕精品视频在线观看 | 精品乱码一区二区 | 中文字幕国产一区 | 欧美男人天堂 | 日本亚洲一区 | 欧美黄a| 久久久久九九九女人毛片 | 天堂一区二区三区 | 国产在线观看网站 | 久久黄网 | 国产在线看片 | a级片www| 欧美日韩成人在线 | 国产乱码一二三区精品 |