搜尋
首頁資料庫Redisredis分散式怎麼做

redis分散式怎麼做

Jun 24, 2019 am 10:30 AM
redis分散式

redis分散式怎麼做

一 為什麼使用 Redis

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

效能:

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

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

redis分散式怎麼做

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

 並發:

如下圖所示,在大併發的情況下,所有的請求直接存取資料庫,資料庫會出現連線例外。這個時候,就需要使用 Redis 做一個緩衝操作,讓請求先存取到 Redis,而不是直接存取資料庫。

redis分散式怎麼做

使用Redis 的常見問題

  • 快取和資料庫雙寫一致性問題
  • 快取雪崩問題
  • 快取擊穿問題
  • 快取的並發競爭問題

二單執行緒的Redis 為什麼這麼快

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

原因主要是以下三點:

  • 純記憶體操作
  • 單執行緒操作,避免了頻繁的上下文切換
  • #採用了非阻塞I/O 多路復用機制

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

經營方式一

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

 

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

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

小明只僱用一個配送員。當客戶下單,小明依送達地點標示好,依序放在一個地方。最後,讓配送員依序開車去送,送好了就回來拿下一個。上述兩種經營方式對比,很明顯第二種效率較高。

在上述比喻中:

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

於是有瞭如下結論:

  • 經營方式一就是傳統的並發模型,每個I/O 流(訂單)都有一個新的執行緒(配送員)管理。
  • 經營方式二就是 I/O 多重化。只有單一執行緒(一個配送員),透過追蹤每個 I/O 流的狀態(每個配送員的送達地點),來管理多個 I/O 流。

下面類比到真實的Redis 執行緒模型,如圖所示:

redis分散式怎麼做

#Redis-client 在操作的時候,會產生具有不同事件類型的Socket。在服務端,有一段 I/O 多重化程序,將其置入佇列之中。然後,檔案事件分派器,依序去佇列中取,轉送到不同的事件處理器。

三 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 可以用來做延時任務

四 Redis 的過期策略和記憶體淘汰機制

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

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

為什麼不用定時刪除策略

定時刪除,用計時器來負責監視 Key,過期則會自動刪除。雖然記憶體及時釋放,但十分消耗 CPU 資源。 在大並發請求下,CPU 要將時間應用在處理請求,而不是刪除 Key,因此沒有採用此策略。

定期刪除 惰性刪除如何運作

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

採用定期刪除 惰性刪除就沒其他問題了麼

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

在redis.conf 中有一行配置:

# maxmemory-policy volatile-lru

該配置就是配記憶體淘汰策略的:

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

五Redis 和資料庫雙寫一致性問題

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

 

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

六 如何處理快取穿透和快取雪崩問題

這兩個問題,一般中小型傳統軟體企業很難碰到。如果有大並發的項目,流量有幾百萬左右,這兩個問題一定要深刻考慮。快取穿透,也就是駭客故意去請求快取中不存在的數據,導致所有的請求都懟到資料庫上,從而資料庫連線異常。

快取穿透解決方案:

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

 

快取雪崩,也就是快取相同時間大面積的失效,這個時候又來了一波請求,結果請求都懟到資料庫上,導致資料庫連線異常。

快取雪崩解決方案:

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

八 如何解決 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 方法變成串行存取也可以

更多Redis相關技術文章,請造訪Redis教學欄位學習!

以上是redis分散式怎麼做的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
REDIS:探索其功能和功能REDIS:探索其功能和功能Apr 19, 2025 am 12:04 AM

Redis脫穎而出是因為其高速、多功能性和豐富的數據結構。 1)Redis支持字符串、列表、集合、散列和有序集合等數據結構。 2)它通過內存存儲數據,支持RDB和AOF持久化。 3)從Redis6.0開始引入多線程處理I/O操作,提升了高並發場景下的性能。

Redis是SQL還是NOSQL數據庫?答案解釋了Redis是SQL還是NOSQL數據庫?答案解釋了Apr 18, 2025 am 12:11 AM

RedisisclassifiedasaNoSQLdatabasebecauseitusesakey-valuedatamodelinsteadofthetraditionalrelationaldatabasemodel.Itoffersspeedandflexibility,makingitidealforreal-timeapplicationsandcaching,butitmaynotbesuitableforscenariosrequiringstrictdataintegrityo

REDIS:提高應用程序性能和可擴展性REDIS:提高應用程序性能和可擴展性Apr 17, 2025 am 12:16 AM

Redis通過緩存數據、實現分佈式鎖和數據持久化來提升應用性能和可擴展性。 1)緩存數據:使用Redis緩存頻繁訪問的數據,提高數據訪問速度。 2)分佈式鎖:利用Redis實現分佈式鎖,確保在分佈式環境中操作的安全性。 3)數據持久化:通過RDB和AOF機制保證數據安全性,防止數據丟失。

REDIS:探索其數據模型和結構REDIS:探索其數據模型和結構Apr 16, 2025 am 12:09 AM

Redis的數據模型和結構包括五種主要類型:1.字符串(String):用於存儲文本或二進制數據,支持原子操作。 2.列表(List):有序元素集合,適合隊列和堆棧。 3.集合(Set):無序唯一元素集合,支持集合運算。 4.有序集合(SortedSet):帶分數的唯一元素集合,適用於排行榜。 5.哈希表(Hash):鍵值對集合,適合存儲對象。

REDIS:對其數據庫方法進行分類REDIS:對其數據庫方法進行分類Apr 15, 2025 am 12:06 AM

Redis的數據庫方法包括內存數據庫和鍵值存儲。 1)Redis將數據存儲在內存中,讀寫速度快。 2)它使用鍵值對存儲數據,支持複雜數據結構,如列表、集合、哈希表和有序集合,適用於緩存和NoSQL數據庫。

為什麼要使用redis?利益和優勢為什麼要使用redis?利益和優勢Apr 14, 2025 am 12:07 AM

Redis是一個強大的數據庫解決方案,因為它提供了極速性能、豐富的數據結構、高可用性和擴展性、持久化能力以及廣泛的生態系統支持。 1)極速性能:Redis的數據存儲在內存中,讀寫速度極快,適合高並發和低延遲應用。 2)豐富的數據結構:支持多種數據類型,如列表、集合等,適用於多種場景。 3)高可用性和擴展性:支持主從復制和集群模式,實現高可用性和水平擴展。 4)持久化和數據安全:通過RDB和AOF兩種方式實現數據持久化,確保數據的完整性和可靠性。 5)廣泛的生態系統和社區支持:擁有龐大的生態系統和活躍社區,

了解NOSQL:Redis的關鍵特徵了解NOSQL:Redis的關鍵特徵Apr 13, 2025 am 12:17 AM

Redis的關鍵特性包括速度、靈活性和豐富的數據結構支持。 1)速度:Redis作為內存數據庫,讀寫操作幾乎瞬時,適用於緩存和會話管理。 2)靈活性:支持多種數據結構,如字符串、列表、集合等,適用於復雜數據處理。 3)數據結構支持:提供字符串、列表、集合、哈希表等,適合不同業務需求。

REDIS:確定其主要功能REDIS:確定其主要功能Apr 12, 2025 am 12:01 AM

Redis的核心功能是高性能的內存數據存儲和處理系統。 1)高速數據訪問:Redis將數據存儲在內存中,提供微秒級別的讀寫速度。 2)豐富的數據結構:支持字符串、列表、集合等,適應多種應用場景。 3)持久化:通過RDB和AOF方式將數據持久化到磁盤。 4)發布訂閱:可用於消息隊列或實時通信系統。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具