亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

漫談Web緩存架構

發布時間:2020-07-02 19:03:50 來源:網絡 閱讀:526 作者:木可大大 欄目:開發技術

計算機領域多處地方用到緩存,比如說為了緩解CPU和內存之間的速度不匹配問題,我們往往通過增加一級、二級、三級緩存,CPU先從緩存中取指令,如果取不到,再從內存中取,并更新緩存,同時,根據程序的局部性原理,使得大部分情況下緩存都會命中。

目前,Web應用的核心數據通常存放在數據庫中,比如說用戶信息、訂單信息、交易信息等,同時,數據庫和編程語言是無關的,通過SQL交互,Java、Php等語言寫的程序需要訪問數據庫,執行業務邏輯,展示結果給用戶。但是數據庫有一定的局限性,譬如:1.數據庫連接是非常 "昂貴 "的資源,為了復用這些資源,目前采用連接池技術,2. 連接池的連接數是有限的,如果用戶過多,勢必要等待,3. 讀寫數據時需要加鎖。

通過上述介紹,我們知道一個大型系統中數據庫往往會成為瓶頸,我們不能每次訪問都訪問數據庫,尤其是在多用戶,大并發的情況下。面對這種情況,我們通常采用何種方法呢?在計算機行業中的所有問題,都可以通過增加一個抽象層來解決。那么,針對數據庫這個瓶頸,我們可以在應用層和數據庫層增加一層,即緩存層

如何實現緩存

如果你是某某大型公司的首席架構師,現在公司需要自研一套緩存系統,你應該怎么設計呢?我想在設計之前應該想好以下幾個問題:

  1. 緩存里放什么格式的數據?
  2. 應用程序(客戶端)如何訪問緩存?
  3. 緩存空間被應用程序用完了怎么辦?
  4. 要不要支持分布式存儲(數據的分片),怎么實現?
1. 緩存里放什么格式的數據?

目前常見的數據格式有序列化對象、XML、JSON、字符串(key,value)和基本的數據結構,其中針對Java語言的序列化對象有序列化和反序列化,而Google研發的protobuf是和語言無關的,比如說Python將某對象序列化,Java能將這個對象進行反序列化。

2. 應用程序如何訪問緩存

考慮到公司有很多后端小組,并且使用不同的編程語言,這就要求我們自研的緩存系統應該和編程語言無關,基于此,我們需要制定一套協議來支持各種語言。客戶端如何使用這套協議?最常見的就是客戶端/服務器模型。首先,服務器監聽請求;接著,客戶端發送請求,獲得響應,其中客戶端發送的請求就是協議;最后,基于Socket通信。比如說:set 'name' 'mukedada'get name

3. 緩存空間被用完了怎么辦?

緩存服務器端在啟動的時候,應該設置緩存大小,當緩存被沾滿時,采用LRU算法。

4. 實現分布式存儲

對于大型應用服務器,單機的緩存服務器是支撐不了的。那么,就需要對緩存服務器進行水平擴展(即增刪服務器,當活動結束后,就需要考慮刪減服務器),那么用什么算法讓數據相對平均的分配到每臺服務器?同時,這個算法應該放在客戶端還是服務端呢?

  • 客戶端實現
    注意這里的客戶端指的是Web應用服務,服務器列表信息通過配置文件獲得。當節點數發生變化時,需要讓客戶端知曉。
    漫談Web緩存架構

它的典型應用是Memcached,Memcached使用的是一致性Hash算法,在介紹它之前,我們先來看一下余數算法。對于用戶要存儲的(key,value),計算key的整數哈希值,然后對服務器的數目求余,這樣來確定存儲服務器。這個方法存在一個致命的問題:當服務器個數發送變化時,余數會發生變化,這樣一來需要重新到數據庫獲取數據
為了加深大家的理解,舉個具體的實例:假設有3臺服務器0、1、2,key1、key2的hash值分別是100,99,對應的余數分別是1和0,也就是說它們分別存放于編號為1和0的服務器中,現在如果增加一臺服務器3,那么它們的余數也會隨之發生變化,100%4 = 0,99%4 = 3,但是它們在0、3號服務器卻找不到對應的數據。
漫談Web緩存架構

為了解決余數算法存在的問題,我們的先輩們提出了分布式一致性hash算法。它思路就是當服務器個數發生變化時,盡可能的減少影響。譬如:當我們新增node5,只影響局部范圍內的key,而余數算法則影響全局。
漫談Web緩存架構

但是它也存在分布不均勻的問題,導致有的服務器上緩存的數據多,有的少。一種方法就是虛擬節點,也就是說讓一個服務器化身為多個虛擬節點,分布到環上。Memcache采用的就是這種方法。
漫談Web緩存架構
另一種方法就是Hash槽。Redis采用的就是這種方法,在介紹路由實現時會詳細介紹該方法。

  • 代理實現
    代理程序放在服務器端,它的典型案例有Twemproxy和Codis。它的基本思想:應用程序向Proxy發送請求,Proxy通過一定算法計算得到數據應該從哪個節點獲取,并且返回響應給客戶端。為了防止Proxy出現單點故障,可以通過集群等方式實現Proxy高可用。
    漫談Web緩存架構

  • 路由實現
    它的典型案例就是Redis。它的基本思想是應用程序可以將請求發送到任意一個節點,當節點包含該請求數據,則直接返回響應給應用程序,當節點不包含該請求數據時,則告訴它跳轉到其他節點中取數據,其中,客戶端程序庫需要解析相應的指令。例如:當node1中沒有數據,會讓客戶端程序訪問node3,這類似于web中的重定向,缺點: node1需要知道其他節點的數據,即node1和其他節點是相互通信的。
    漫談Web緩存架構
    首先它有16284個槽,每個node節點管理一段Hash槽,每當新來一個請求,都對它的key值進行CRC16(key)%16384求余,最終會落到0~16383這個區間的槽中。
    漫談Web緩存架構

但是,每當新增一個節點時,需要從原先的每個節點中獲取hash槽,這時需要涉及數據遷移的過程。如果在數據遷移的過程中有一個用戶請求,這個時候該怎么辦?目前一種解決方法是讓node1和node4的持有相同的槽,但是設置不同的狀態,例如node1的槽的狀態設置為正在遷移,而node4的狀態是正在導入,首先將請求交給node1,如果node1中有數據則直接返回,如果沒有則交給ndoe4。如下圖所示。
漫談Web緩存架構

同時,我們注意到node1、node2等存在單點故障,為增加可用性,我們對每個node使用主從模式。數據首先寫入到master節點,之后有兩種方式,方式一,直接將結果返回給客戶端,然后將master節點數據同步到slave從節點中,這樣做的好處就是響應周期短,缺點是可能存在數據不一致的情況,即master節點將結果返回給客戶端之后,還沒來得及將數據同步到slave節點中就發生故障,那么這部分數據就會丟失。方式二,數據寫入到master節點之后,需要將數據同步到slave節點成功之后,再將結果返回給客戶端,這種方式保證了數據強一致性,但是用戶需要更長的時間來等待。
漫談Web緩存架構

緩存擊穿問題

用戶每次訪問緩存都沒有命中,導致每次請求都要訪問數據庫,這就是緩存擊穿問題,出現這種情況導致緩存沒起效果,反而增加了系統消耗。針對這個問題,一般諸如雙十一等活動都會在活動開始之前將用戶信息預先存放到緩存中。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

大邑县| 威远县| 文化| 临猗县| 彰武县| 潍坊市| 鹿邑县| 黑龙江省| 张掖市| 广宁县| 辽阳市| 双峰县| 临西县| 县级市| 滦南县| 资中县| 普定县| 讷河市| 牡丹江市| 辰溪县| 武鸣县| 炉霍县| 托克托县| 全椒县| 大石桥市| 枣阳市| 栖霞市| 扬中市| 宁武县| 油尖旺区| 姚安县| 伊川县| 武宁县| 衡水市| 延长县| 新密市| 专栏| 全椒县| 恭城| 许昌县| 皮山县|