国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

為什么我們做分布式使用Redis?

數據庫 其他數據庫 分布式 Redis
絕大部分寫業務的程序員,在實際開發中使用 Redis 的時候,只會 Set Value 和 Get Value 兩個操作,對 Redis 整體缺乏一個認知。這里對 Redis 常見問題做一個總結,解決大家的知識盲點。

 絕大部分寫業務的程序員,在實際開發中使用 Redis 的時候,只會 Set Value 和 Get Value 兩個操作,對 Redis 整體缺乏一個認知。這里對 Redis 常見問題做一個總結,解決大家的知識盲點。

1、為什么使用 Redis

在項目中使用 Redis,主要考慮兩個角度:性能和并發。如果只是為了分布式鎖這些其他功能,還有其他中間件 Zookpeer 等代替,并非一定要使用 Redis。

性能:

如下圖所示,我們在碰到需要執行耗時特別久,且結果不頻繁變動的 SQL,就特別適合將運行結果放入緩存。這樣,后面的請求就去緩存中讀取,使得請求能夠迅速響應。

特別是在秒殺系統,在同一時間,幾乎所有人都在點,都在下單。。。執行的是同一操作———向數據庫查數據。

根據交互效果的不同,響應時間沒有固定標準。在理想狀態下,我們的頁面跳轉需要在瞬間解決,對于頁內操作則需要在剎那間解決。

并發:

如下圖所示,在大并發的情況下,所有的請求直接訪問數據庫,數據庫會出現連接異常。這個時候,就需要使用 Redis 做一個緩沖操作,讓請求先訪問到 Redis,而不是直接訪問數據庫。

使用 Redis 的常見問題

  •     緩存和數據庫雙寫一致性問題
  •     緩存雪崩問題
  •     緩存擊穿問題
  •     緩存的并發競爭問題

2、單線程的 Redis 為什么這么快

這個問題是對 Redis 內部機制的一個考察。很多人都不知道 Redis 是單線程工作模型。

原因主要是以下三點:

  •     純內存操作
  •     單線程操作,避免了頻繁的上下文切換
  •     采用了非阻塞 I/O 多路復用機制

仔細說一說 I/O 多路復用機制,打一個比方:小名在 A 城開了一家快餐店店,負責同城快餐服務。小明因為資金限制,雇傭了一批配送員,然后小曲發現資金不夠了,只夠買一輛車送快遞。

經營方式一

客戶每下一份訂單,小明就讓一個配送員盯著,然后讓人開車去送。慢慢的小曲就發現了這種經營方式存在下述問題:

時間都花在了搶車上了,大部分配送員都處在閑置狀態,搶到車才能去送。

  •     隨著下單的增多,配送員也越來越多,小明發現快遞店里越來越擠,沒辦法雇傭新的配送員了。
  •     配送員之間的協調很花時間。
  •     綜合上述缺點,小明痛定思痛,提出了經營方式二。

經營方式二

小明只雇傭一個配送員。當客戶下單,小明按送達地點標注好,依次放在一個地方。最后,讓配送員依次開著車去送,送好了就回來拿下一個。上述兩種經營方式對比,很明顯第二種效率更高。

在上述比喻中:

  •     每個配送員→每個線程
  •     每個訂單→每個 Socket(I/O 流)
  •     訂單的送達地點→Socket 的不同狀態
  •     客戶送餐請求→來自客戶端的請求
  •     明曲的經營方式→服務端運行的代碼
  •     一輛車→CPU 的核數

于是有了如下結論:

  •     經營方式一就是傳統的并發模型,每個 I/O 流(訂單)都有一個新的線程(配送員)管理。
  •     經營方式二就是 I/O 多路復用。只有單個線程(一個配送員),通過跟蹤每個 I/O 流的狀態(每個配送員的送達地點),來管理多個 I/O 流。

下面類比到真實的 Redis 線程模型,如圖所示:

Redis-client 在操作的時候,會產生具有不同事件類型的 Socket。在服務端,有一段 I/O 多路復用程序,將其置入隊列之中。然后,文件事件分派器,依次去隊列中取,轉發到不同的事件處理器中。

3、Redis 的數據類型及使用場景

一個合格的程序員,這五種類型都會用到。

String

最常規的 set/get 操作,Value 可以是 String 也可以是數字。一般做一些復雜的計數功能的緩存。

Hash

這里 Value 存放的是結構化的對象,比較方便的就是操作其中的某個字段。我在做單點登錄的時候,就是用這種數據結構存儲用戶信息,以 CookieId 作為 Key,設置 30 分鐘為緩存過期時間,能很好的模擬出類似 Session 的效果。

List

使用 List 的數據結構,可以做簡單的消息隊列的功能。另外,可以利用 lrange 命令,做基于 Redis 的分頁功能,性能極佳,用戶體驗好。

Set

因為 Set 堆放的是一堆不重復值的集合。所以可以做全局去重的功能。我們的系統一般都是集群部署,使用 JVM 自帶的 Set 比較麻煩。另外,就是利用交集、并集、差集等操作,可以計算共同喜好,全部的喜好,自己獨有的喜好等功能。

Sorted Set

Sorted Set 多了一個權重參數 Score,集合中的元素能夠按 Score 進行排列。可以做排行榜應用,取 TOP N 操作。Sorted Set 可以用來做延時任務。

4、Redis 的過期策略和內存淘汰機制

Redis 是否用到家,從這就能看出來。比如你 Redis 只能存 5G 數據,可是你寫了 10G,那會刪 5G 的數據。怎么刪的,這個問題思考過么?

正解:Redis 采用的是定期刪除+惰性刪除策略。

為什么不用定時刪除策略

定時刪除,用一個定時器來負責監視 Key,過期則自動刪除。雖然內存及時釋放,但是十分消耗 CPU 資源。在大并發請求下,CPU 要將時間應用在處理請求,而不是刪除 Key,因此沒有采用這一策略。

定期刪除+惰性刪除如何工作

定期刪除,Redis 默認每個 100ms 檢查,有過期 Key 則刪除。需要說明的是,Redis 不是每個 100ms 將所有的 Key 檢查一次,而是隨機抽取進行檢查。如果只采用定期刪除策略,會導致很多 Key 到時間沒有刪除。于是,惰性刪除派上用場。

采用定期刪除+惰性刪除就沒其他問題了么

不是的,如果定期刪除沒刪除掉 Key。并且你也沒及時去請求 Key,也就是說惰性刪除也沒生效。這樣,Redis 的內存會越來越高。那么就應該采用內存淘汰機制。

在 redis.conf 中有一行配置:

  1. # maxmemory-policy volatile-lru 

該配置就是配內存淘汰策略的:

  •     noeviction:當內存不足以容納新寫入數據時,新寫入操作會報錯。
  •     allkeys-lru:當內存不足以容納新寫入數據時,在鍵空間中,移除最近最少使用的 Key。(推薦使用,目前項目在用這種)(最近最久使用算法)
  •     allkeys-random:當內存不足以容納新寫入數據時,在鍵空間中,隨機移除某個 Key。(應該也沒人用吧,你不刪最少使用 Key,去隨機刪)
  •     volatile-lru:當內存不足以容納新寫入數據時,在設置了過期時間的鍵空間中,移除最近最少使用的 Key。這種情況一般是把 Redis 既當緩存,又做持久化存儲的時候才用。(不推薦)
  •     volatile-random:當內存不足以容納新寫入數據時,在設置了過期時間的鍵空間中,隨機移除某個 Key。(依然不推薦)
  •     volatile-ttl:當內存不足以容納新寫入數據時,在設置了過期時間的鍵空間中,有更早過期時間的 Key 優先移除。(不推薦)

5、Redis 和數據庫雙寫一致性問題

一致性問題還可以再分為最終一致性和強一致性。數據庫和緩存雙寫,就必然會存在不一致的問題。前提是如果對數據有強一致性要求,不能放緩存。我們所做的一切,只能保證最終一致性。

另外,我們所做的方案從根本上來說,只能降低不一致發生的概率。因此,有強一致性要求的數據,不能放緩存。首先,采取正確更新策略,先更新數據庫,再刪緩存。其次,因為可能存在刪除緩存失敗的問題,提供一個補償措施即可,例如利用消息隊列。

6、如何應對緩存穿透和緩存雪崩問題

這兩個問題,一般中小型傳統軟件企業很難碰到。如果有大并發的項目,流量有幾百萬左右,這兩個問題一定要深刻考慮。緩存穿透,即黑客故意去請求緩存中不存在的數據,導致所有的請求都懟到數據庫上,從而數據庫連接異常。

緩存穿透解決方案:

  •     利用互斥鎖,緩存失效的時候,先去獲得鎖,得到鎖了,再去請求數據庫。沒得到鎖,則休眠一段時間重試。
  •     采用異步更新策略,無論 Key 是否取到值,都直接返回。Value 值中維護一個緩存失效時間,緩存如果過期,異步起一個線程去讀數據庫,更新緩存。需要做緩存預熱(項目啟動前,先加載緩存)操作。
  •     提供一個能迅速判斷請求是否有效的攔截機制,比如,利用布隆過濾器,內部維護一系列合法有效的 Key。迅速判斷出,請求所攜帶的 Key 是否合法有效。如果不合法,則直接返回。

緩存雪崩,即緩存同一時間大面積的失效,這個時候又來了一波請求,結果請求都懟到數據庫上,從而導致數據庫連接異常。

緩存雪崩解決方案:

  •     給緩存的失效時間,加上一個隨機值,避免集體失效。
  •     使用互斥鎖,但是該方案吞吐量明顯下降了。
  •     雙緩存。我們有兩個緩存,緩存 A 和緩存 B。緩存 A 的失效時間為 20 分鐘,緩存 B 不設失效時間。自己做緩存預熱操作。
  •     然后細分以下幾個小點:從緩存 A 讀數據庫,有則直接返回;A 沒有數據,直接從 B 讀數據,直接返回,并且異步啟動一個更新線程,更新線程同時更新緩存 A 和緩存 B。

7、如何解決 Redis 的并發競爭 Key 問題

這個問題大致就是,同時有多個子系統去 Set 一個 Key。這個時候要注意什么呢?大家基本都是推薦用 Redis 事務機制。

但是我并不推薦使用 Redis 的事務機制。因為我們的生產環境,基本都是 Redis 集群環境,做了數據分片操作。你一個事務中有涉及到多個 Key 操作的時候,這多個 Key 不一定都存儲在同一個 redis-server 上。因此,Redis 的事務機制,十分雞肋。

如果對這個 Key 操作,不要求順序

這種情況下,準備一個分布式鎖,大家去搶鎖,搶到鎖就做 set 操作即可,比較簡單。

如果對這個 Key 操作,要求順序

假設有一個 key1,系統 A 需要將 key1 設置為 valueA,系統 B 需要將 key1 設置為 valueB,系統 C 需要將 key1 設置為 valueC。

期望按照 key1 的 value 值按照 valueA > valueB > valueC 的順序變化。這種時候我們在數據寫入數據庫的時候,需要保存一個時間戳。

假設時間戳如下:

系統 A key 1 {valueA 3:00}

系統 B key 1 {valueB 3:05}

系統 C key 1 {valueC 3:10}

那么,假設系統 B 先搶到鎖,將 key1 設置為{valueB 3:05}。接下來系統 A 搶到鎖,發現自己的 valueA 的時間戳早于緩存中的時間戳,那就不做 set 操作了,以此類推。其他方法,比如利用隊列,將 set 方法變成串行訪問也可以。

8、總結

Redis 在國內各大公司都能看到其身影,比如我們熟悉的新浪,阿里,騰訊,百度,美團,小米等。學習 Redis,這幾方面尤其重要:Redis 客戶端、Redis 高級功能、Redis 持久化和開發運維常用問題探討、Redis 復制的原理和優化策略、Redis 分布式解決方案等。

 

責任編輯:龐桂玉 來源: 今日頭條
相關推薦

2018-12-12 15:20:27

2018-11-02 14:00:20

2018-06-05 09:14:42

Redis分布式場景

2019-06-19 15:40:06

分布式鎖RedisJava

2021-06-08 12:46:27

分布式阿里TCC

2025-03-14 08:00:00

分布式系統服務器一致性

2024-10-07 10:07:31

2024-04-01 05:10:00

Redis數據庫分布式鎖

2022-05-18 10:38:51

Redis分布式鎖數據

2020-12-15 06:57:24

java服務器

2021-11-05 07:18:15

分布式事務業務

2022-04-21 08:00:00

分布式云原生依賴管理

2018-01-30 09:07:36

Ceph分布式存儲

2015-08-19 15:45:33

2024-03-01 09:53:34

2019-12-04 14:59:01

分布式緩存高可用

2025-04-18 12:08:19

2020-12-14 14:24:07

CAP分布式數據一致性

2023-06-27 13:47:00

分布式事務本地事務

2019-01-04 11:08:38

開源分布式流存儲Pravega
點贊
收藏

51CTO技術棧公眾號

波多野结衣视频一区| 任你弄在线视频免费观看| 日韩美女精品| 欧美精品三级在线观看| 成人黄动漫网站免费| 电影k8一区二区三区久久| 丰满放荡岳乱妇91ww| 国产精品一区二区三| 深夜成人影院| 天天影视色香欲综合网老头| 欧美性受xxxx黑人猛交88| 牛牛在线精品视频| 一区二区成人在线| 国产精品久久久久久久久久三级 | 26uuu精品一区二区在线观看| 激情视频一区二区| 欧美成人一品| 欧美肥婆姓交大片| 精品国产亚洲一区二区三区在线| 亚洲黄色av女优在线观看 | 久久久久久久久亚洲| 久久影院资源站| 欧美激情国产日韩精品一区18| 99re久久| 精品捆绑美女sm三区| av大片在线看| 亚洲国产精品资源| 2001个疯子在线观看| 91精品办公室少妇高潮对白| 国产精品一卡二卡三卡| 亚洲成人午夜电影| av在线播放天堂| 青青草国产精品97视觉盛宴| 综合色婷婷一区二区亚洲欧美国产| 综合天堂av久久久久久久| 成人黄在线观看| 欧美精品日韩| 欧美一二三区| 国产福利一区二区| 欧美精品久久久| 日日摸夜夜添夜夜添亚洲女人| 97se亚洲综合| 麻豆精品一区二区三区| 亚洲一区尤物| 99久久综合色| 欧美vide| 日韩欧美一级二级三级久久久| 久久香蕉av| 日韩中文在线视频| 香蕉久久99| 国产精品亚洲精品| 日韩高清一区二区| 欧美日韩国产高清视频| 亚洲最大在线| 久久人人97超碰精品888| 久久不见久久见国语| 久久久欧美一区二区| 日韩激情图片| 亚洲综合视频一区| 国产午夜精品一区二区三区视频 | 成人av影音| 久久影院理伦片| 视频一区二区欧美| 色老板视频在线观看| 日韩欧美国产wwwww| 日韩精品一区二区三区中文 | 精品一区免费av| 免费观看v片在线观看| 69久久夜色精品国产69蝌蚪网| 成人国产精品一区二区免费麻豆| 亚洲电影在线观看| 日韩免费在线| 激情网站五月天| 中文字幕av在线一区二区三区| 三上悠亚在线免费观看| 中文字幕国产精品| 精品裸体bbb| **亚洲第一综合导航网站| 国产精品成人一区二区不卡| 在线播放 亚洲| 欧美精品九九99久久| 欧美激情欧美| 国产一区二区在线免费播放| 欧美区视频在线观看| 麻豆国产一区| 久久视频这里有精品| 精品久久久久久最新网址| 成人免费黄色| 国产伦精品一区二区三区四区视频 | 欧美激情亚洲精品| 久久久天天操| 免费黄色在线网站| 96pao国产成视频永久免费| 国产精品国产三级国产普通话蜜臀 | 一区二区三区在线免费| caoporn成人| 亚洲国产婷婷香蕉久久久久久99| 日韩写真欧美这视频| 日本成人在线视频网站| 超碰国产一区| 精品www久久久久奶水| 久久精品国产精品| 专区另类欧美日韩| 蜜臀91精品国产高清在线观看| 黄a免费视频| 成人在线一区二区| 欧美一区二区在线免费观看| 日韩国产在线观看| abab456成人免费网址| 天堂а√在线8种子蜜桃视频 | www污在线观看| 欧美中文字幕精品| 欧美日韩视频第一区| 午夜亚洲福利| 国产毛片精品久久| 国产黄色片大全| 久久国产精品一区二区三区四区| 日韩av一区在线| 亚洲精品乱码久久久久久日本蜜臀| 亚洲经典视频在线观看| 美女高潮在线观看| ckplayer中文字幕| 欧洲高清一区二区| 久久久国产视频| 国产精品你懂的在线欣赏| 中文一区二区| 久久不卡国产精品一区二区| 成人av黄色| xxx亚洲日本| 国产精品美女999| 日韩在线免费视频| 色婷婷av一区二区三区gif| 成人在线免费小视频| 污污视频在线| 免费免费啪视频在线观看| 一区二区精品国产| 97精品久久久| 欧美va天堂va视频va在线| 日本不卡的三区四区五区| 久久国产精品黑丝| 青檬在线电视剧在线观看| 欧美少妇性生活视频| 日韩女优人人人人射在线视频| 欧美一区二区三区系列电影| 亚洲黄网站在线观看| 亚洲欧美激情插| 亚洲精品免费播放| 国产精品网站在线播放| 国产成人丝袜美腿| 国产91对白在线观看九色| 成人高潮a毛片免费观看网站| 黄色精品免费看| 精品176二区| а√中文在线8| 亚洲视频tv| 国产精品久久久久一区二区国产| 成人免费激情视频| 日本成人免费在线| 久热99视频在线观看| 精品国产一区二区在线| 久久久久久亚洲精品不卡| 久久综合久中文字幕青草| 最新中文字幕亚洲| 日韩性生活视频| 欧美乱大交xxxxx另类电影| 久久久久久国产精品美女| 久久久久久久一| 日韩69视频在线观看| 国产精品.com| 国产欧美综合精品一区二区| 欧美最猛性xxxxx(亚洲精品)| 国产精品视频午夜| 亚洲天堂男人天堂| 欧美激情免费在线| 亚洲最大的网站| 超碰97网站| 色哟哟免费网站| 精品少妇人妻av免费久久洗澡| 国产3p露脸普通话对白| 视频免费裸体网站| 成人资源www网在线最新版| 国产精品传媒麻豆hd| 中国成人一区| 日韩欧美精品| 久久精品亚洲成在人线av网址| 中文一区一区三区免费在线观看| 亚洲影视在线| 国产精品乱码久久久久久| 日本精品免费观看高清观看| 色香蕉成人二区免费| 欧美一卡2卡三卡4卡5免费| 久久精品久久久久| 国产美女91呻吟求| 亚洲精品成人三区| 日韩一级在线免费观看| 青青草原成人网| av电影在线观看| 忘忧草精品久久久久久久高清| 国内精品视频666| 国产欧美日韩卡一|