成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

學(xué)習(xí)筆記之Memcached原理

imingyu / 1417人閱讀

摘要:而多路復(fù)用無需等待任務(wù)完成,而是將所有任務(wù)維護(hù)在一個組中,在等待過程中線程可以去處理其他的任務(wù),當(dāng)某個任務(wù)完成后,再去操作該操作符。而目前僅有的調(diào)優(yōu)方案是調(diào)整因子,讓的大小盡可能的接近,減少空間的浪費(fèi)。

0x00 Memcached簡述

Memcached是一套高性能的分布式內(nèi)存對象緩存系統(tǒng),用于在動態(tài)系統(tǒng)中減少數(shù)據(jù)庫負(fù)載,提升性能。

0x01 Memcached特性

基于libevent的事件處理

內(nèi)置內(nèi)存存儲方式SLab Allocation機(jī)制

并不單一的數(shù)據(jù)刪除機(jī)制

基于客戶端的分布式系統(tǒng)

0x02 高性能的基礎(chǔ):libevent事件處理

Libevent 是一個用C語言編寫的、輕量級的開源高性能網(wǎng)絡(luò)庫,主要有以下幾個亮點(diǎn):事件驅(qū)動( event-driven),高性能;輕量級,專注于網(wǎng)絡(luò),不如 ACE 那么臃腫龐大;源代碼相當(dāng)精煉、易讀;跨平臺,支持 Windows、 Linux、 *BSD 和 Mac Os;支持多種 I/O 多路復(fù)用技術(shù), epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定時器和信號等事件;注冊事件優(yōu)先級。

以上引自百度百科,在不支持I/O多路復(fù)用的情況下,一個線程同時只能處理一個socket文件操作符,所以當(dāng)一個任務(wù)未完成時,線程需要等待任務(wù)的處理,這種處理模型效率低下。而I/O多路復(fù)用無需等待任務(wù)完成,而是將所有任務(wù)維護(hù)在一個I/O組中,在等待過程中線程可以去處理其他的任務(wù),當(dāng)某個任務(wù)完成后,再去操作該socket操作符。值得一提的是,在I/O多路復(fù)用技術(shù)中,epoll是非常棒的,相比于select模型,epoll沒有文件操作符數(shù)量的限制;并且select模型是將所有操作符維護(hù)在一個I/O組中,當(dāng)有socket數(shù)據(jù)可操作時,線程需要在組中尋找哪個文件操作符可操作,而epoll只將可操作的socket文件操作符給線程,線程無需自己尋找,可以直接操作該socket,提高了處理性能。

所以,使用libevent時間處理模型,非常好的提升了memcached的性能。

0x03 SLab Allocation機(jī)制

在memcached中,內(nèi)存不是直接C語言提供的malloc() free() 進(jìn)行管理的,因?yàn)樵膬?nèi)存管理方式會造成內(nèi)存碎片,會加重內(nèi)存管理器的內(nèi)存管理負(fù)擔(dān)。而SLab Allocation機(jī)制完美的解決了內(nèi)存碎片化的問題。

a.解決內(nèi)存碎片化

SLab Allocator 在初始化時,通過將內(nèi)存分配成預(yù)先設(shè)置的大小,將這些內(nèi)存分割成特定長度的塊(chunk),并把尺寸相同的chunk分成一個組,也就是chunk集合,而這種方式就解決了內(nèi)存碎片化的問題。

b.內(nèi)存預(yù)分配

在需要存儲緩存數(shù)據(jù)時,memcached會在chunk中選擇與所存數(shù)據(jù)大小最接近的chunk,并將數(shù)據(jù)存儲到該chunk中,這樣不需要每次在存儲數(shù)據(jù)時,都向操作系統(tǒng)申請空間,提升了memcached的處理性能。

c.內(nèi)存重復(fù)利用

當(dāng)存儲的數(shù)據(jù)過期后,memcached不會釋放該數(shù)據(jù)的所占用的內(nèi)存,而僅僅是將該數(shù)據(jù)標(biāo)記為不可用,當(dāng)有新數(shù)據(jù)需要存儲時,memcached會將數(shù)據(jù)重新存儲到該空間中,用這種方式對內(nèi)存進(jìn)行重復(fù)利用。

d.缺點(diǎn)

因?yàn)镾lab Allocator將內(nèi)存分割成固定大小的塊,當(dāng)存儲的數(shù)據(jù)小于chunk的長度,會導(dǎo)致該chunk剩余空間的浪費(fèi)。例如:當(dāng)一個數(shù)據(jù)占用60K,而最接近的chunk長度為64K,此時就有4K的空間造成浪費(fèi)。而目前僅有的調(diào)優(yōu)方案是調(diào)整Growth Factor因子,讓chunk的大小盡可能的接近,減少空間的浪費(fèi)。

0x04 memached的刪除機(jī)制
a.不會真正刪除記錄

當(dāng)存儲在memcached中的記錄過期時,memcached不會釋放該內(nèi)存,而是讓客戶端對該記錄不可見。留下內(nèi)存來,讓之后的存儲記錄進(jìn)行內(nèi)存重復(fù)利用。

b.Lazy Expiration(懶過期機(jī)制)

memcached為了提升性能,在內(nèi)部不會對存儲在memcached中的記錄進(jìn)行監(jiān)視,而是在每次get數(shù)據(jù)的時候,對該記錄的過期時間進(jìn)行校驗(yàn),當(dāng)記錄過期,則不返回?cái)?shù)據(jù)。

c.LRU(最近最少使用)

雖然memcached擁有內(nèi)存重復(fù)利用的機(jī)制,但是進(jìn)行大量數(shù)據(jù)緩存時,還是會出現(xiàn)內(nèi)存吃滿,memcached無法在SLab中獲取到空閑的內(nèi)存,在這種情況下,memcached會觸發(fā)LRU,會在最近未被使用的記錄中進(jìn)行搜索,并將這些空間分配給新的記錄。

0x05 memcached的分布式

不同于其他軟件的分布式,memcached的分布式不存在于服務(wù)端,而是完全由客戶端進(jìn)行分布式的處理。這樣的好處是,減少memcached服務(wù)端之間的網(wǎng)絡(luò)連接,當(dāng)某一個服務(wù)器宕機(jī)時,不至于影響其他機(jī)器的正常使用。

a.根據(jù)余數(shù)計(jì)算分散

通過crc32()計(jì)算出鍵的整數(shù)哈希值,然后除以服務(wù)器的臺數(shù),求得余數(shù)進(jìn)行服務(wù)器節(jié)點(diǎn)的選擇,此種方式的優(yōu)點(diǎn)是,簡單易操作,并且數(shù)據(jù)的分散性也非常優(yōu)秀。但缺點(diǎn)是,當(dāng)改變服務(wù)器的數(shù)量時,緩存重組的代價巨大,在此過程中緩存的命中率急劇下降。

b.Consistent Hashing(一致性哈希)

首先求出memcached服務(wù)器節(jié)點(diǎn)的哈希值,并將其分配到一個0~2^32的圓上,我們稱該這個圓為值域,之后通過同樣的計(jì)算方式求出鍵的哈希值,并將值映射到圓上,然后從數(shù)據(jù)映射到的位置開始順時針尋找,并將數(shù)據(jù)存儲到找到的第一個服務(wù)器節(jié)點(diǎn)上,如果找到2^32仍然找不到就將數(shù)據(jù)存儲到第一臺memcached機(jī)器上。

當(dāng)添加一臺新機(jī)器時,通過同樣的hash算法將該機(jī)器映射到圓上,影響的僅僅是新機(jī)器的節(jié)點(diǎn)到它的上一個節(jié)點(diǎn)之間的數(shù)據(jù)。

當(dāng)刪除一臺機(jī)器時,同樣也僅僅影響映射到刪除的機(jī)器和它的上一臺機(jī)器之間的數(shù)據(jù),而不會造成大面積的緩存重組即rehash.

0x06 擴(kuò)展閱讀

memcached完全剖析

使用 libevent 和 libev 提高網(wǎng)絡(luò)應(yīng)用性能

高性能IO模型淺析

備注:資源和圖片等均來自網(wǎng)絡(luò)

原文作者:我才是二亮
原文鏈接:http://blog.2liang.me/2016/11/28/learn-memcached-principle/
轉(zhuǎn)載請?jiān)谡闹袠?biāo)注并保留原文鏈接、作者等信息。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/61700.html

相關(guān)文章

  • PHPer書單

    摘要:想提升自己,還得多看書多看書多看書下面是我收集到的一些程序員應(yīng)該看得書單及在線教程,自己也沒有全部看完。共勉吧當(dāng)然,如果你有好的書想分享給大家的或者覺得書單不合理,可以去通過進(jìn)行提交。講師溫銘,軟件基金會主席,最佳實(shí)踐作者。 想提升自己,還得多看書!多看書!多看書!下面是我收集到的一些PHP程序員應(yīng)該看得書單及在線教程,自己也沒有全部看完。共勉吧!當(dāng)然,如果你有好的書想分享給大家的或者...

    jimhs 評論0 收藏0
  • Docker學(xué)習(xí)筆記

    摘要:學(xué)習(xí)背景近些年,如果你是一名開發(fā),那么這個熱門的技術(shù)名詞你一定聽說過,我也不例外,但是因?yàn)槠綍r沒接觸過,所以一直都沒動力去了解使用。 學(xué)習(xí)背景 近些年,如果你是一名開發(fā),那么Docker這個熱門的技術(shù)名詞你一定聽說過,我也不例外,但是因?yàn)槠綍r沒接觸過,所以一直都沒動力去了解使用。最近在折騰自己維護(hù)在github上的項(xiàng)目的時候,發(fā)現(xiàn)項(xiàng)目所依賴的外部環(huán)境比較多,比如zookeeper、re...

    chadLi 評論0 收藏0
  • 面試中關(guān)于Redis的問題看這篇就夠了

    摘要:所以查閱官方文檔以及他人造好的輪子,總結(jié)了一些面試和學(xué)習(xí)中你必須掌握的問題。在微博應(yīng)用中,可以將一個用戶所有的關(guān)注人存在一個集合中,將其所有粉絲存在一個集合。 昨天寫了一篇自己搭建redis集群并在自己項(xiàng)目中使用的文章,今天早上看別人寫的面經(jīng)發(fā)現(xiàn)redis在面試中還是比較常問的(筆主主Java方向)。所以查閱官方文檔以及他人造好的輪子,總結(jié)了一些redis面試和學(xué)習(xí)中你必須掌握的問題。...

    yanbingyun1990 評論0 收藏0
  • 『九個月實(shí)現(xiàn)破億用戶的可擴(kuò)展架構(gòu)』學(xué)習(xí)筆記

    摘要:五技術(shù)棧整個看下來會發(fā)現(xiàn)美拍的架構(gòu)做的非常的穩(wěn),小軍也有提到,在項(xiàng)目初期高速發(fā)展階段做架構(gòu)時要克服對完美架構(gòu)的欲望克服對新技術(shù)的欲望,先讓系統(tǒng)跑起來。 昨晚把美拍架構(gòu)負(fù)責(zé)人洪小軍在Qcon上的『九個月實(shí)現(xiàn)破億用戶的可擴(kuò)展架構(gòu)』分享看了一遍(其實(shí)那場QCon我也在現(xiàn)場,但是當(dāng)時小軍這個會場實(shí)在太多人了,而且當(dāng)時北京還沒開空調(diào)又熱又悶,所以我就挑了個涼快的會場去聽了哈哈),感覺有不少值得學(xué)...

    TesterHome 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<