memcached企業面試題


面試題如下:

1、Memcached是什么,有什么作用?
Memcached是一個開源的,高性能的內存綬存軟件,從名稱上看Mem就是內存的意思,而Cache就是緩存的意思。

Memcached的作用:通過在事先規划好的內存空間中臨時綬存數據庫中的各類數據,以達到減少業務對數據庫的直接高並發訪問,從而達到提升數據庫的訪問性能,加速網站集群動態應用服務的能力。

 

2、Memcached服務在企業集群架構中應用場景

一、作為數據庫的前端緩存應用
a、完整緩存(易),靜態緩存
例如:商品分類(京東),以及商品信息,可事先放在內存里,然后再對外提供數據訪問,這種先放到內存,我們稱之為預熱,(先把數據存緩存中),用戶訪問時可以只讀取memcached緩存,不讀取數據庫了。
b、執點緩存(難)
需要前端web程序配合,只緩存熱點的數據,即緩存經常被訪問的數據。
先預熱數據庫里的基礎數據,然后在動態更新,選讀取緩存,如果緩存里沒有對應的數據,程序再去讀取數據庫,然后程序把讀取的新數據放入緩存存儲。

特殊說明 :

1、如果碰到電商秒殺等高並發的業務,一定要事先預熱,或者其它思想實現,例如:稱殺只是獲取資格,而不是瞬間秒殺到手商品。
那么什么是獲取資格?

就是在數據庫中,把0標成1.就有資格啦。再慢慢的去領取商品訂單。因為秒殺過程太長會占用服務器資源。

2、如果數據更新,同時觸發緩存更新,防止給用戶過期數據。

c、對於持久化緩存存儲系統,例如:redis,可以替代一部分數據庫的存儲,一些簡單的數據業務,投票,統計,好友關注,商品分類等。nosql= not only sql

二、作業集群的session會話共享存儲。
http://oldboy.blog.51cto.com/2561410/1331316
http://oldboy.blog.51cto.com/2561410/1323468

 

3、Memcached服務在不同企業業務應用場景中的工作流程
a、當web程序需要訪問后端數據庫獲取數據時會優先訪問Memcached內存緩存,如果緩存中有數據就直接獲取返回前端服務及用戶,如果沒有數據(沒有命中),在由程序請求后端的數據庫服務器,獲取到對應的數據后,除了返回給前端服務及用戶數據外,還會把數據放到Memcached內存中進行緩存,等待下次請求被訪問,Memcache內存始終是數據庫的擋箭牌,從而大大的減輕數據庫的訪問壓力,提高整個網站架構的響應速度,提升了用戶體驗。

b、當程序更新,修改或刪除數據庫中已有的數據時,會同時發送請求通知Memcached已經緩存的同一個ID內容的舊數據失效,從而保證Memcache中數據和數據庫中的數據一致。

如果在高並發場合,除了通知Memcached過程的緩存失效外,還會通過相關機制,使得在用戶訪問新數據前,通過程序預先把更新過的數據推送到memcache中緩存起來,這樣可以減少數據庫的訪問壓力,提升Memcached中緩存命中率。

c、數據庫插件可以再寫入更新數據庫后,自動拋給MC緩存起來,自身不Cache.

 

4、Memcached服務分布式集群如何實現?

特殊說明:Memcached集群和web服務集群是不一樣的,所有Memcached的數據總和才是數據庫的數據。每台Memcached都是部分數據。
(一台memcached的數據,就是一部分mysql數據庫的數據)

a、程序端實現
程序加載所有mc的ip列表,通過對key做hash (一致性哈希算法)
例如:web1 (key)===>對應A,B,C,D,E,F,G.....若干台服務器。(通過哈希算法實現)

b、負載均衡器
通過對key做hash (一致性哈希算法)

一致哈希算法的目的是不但保證每個對象只請求一個對應的服務器,而且當節點宕機,緩存服務器的更新重新分配比例降到最低。

Memcached資料:
http://blog.csdn.net/cutesource/article/details/5848253


5、Memcached服務特點及工作原理是什么?
a、完全基於內存緩存的
b、節點之間相互獨立
c、C/S模式架構,C語言編寫,總共2000行代碼。
d、異步I/O 模型,使用libevent作為事件通知機制。
e、被緩存的數據以key/value鍵值對形式存在的。
f、全部數據存放於內存中,無持久性存儲的設計,重啟服務器,內存里的數據會丟失。
g、當內存中緩存的數據容量達到啟動時設定的內存值時,就自動使用LRU算法刪除過期的緩存數據。
h、可以對存儲的數據設置過期時間,這樣過期后的數據自動被清除,服務本身不會監控過期,而是在訪問的時候查看key的時間戳,判斷是否過期。
j、memcache會對設定的內存進行分塊,再把塊分組,然后再提供服務。


6、簡述Memcached內存管理機制原理?
  malloc的全稱是memory allocation ,中文叫運態內存分配,當無法知道內存具體位置的時候,想要綁定真正的內存空間,就需要用到動態的分配內存。

  早期的Memcached內存管理方式是通過malloc的分配的內存,使用完后通過free來回收內存,這種方式容易產生內存碎片,並降低操作系統對內存的管理效率。加重操作系統內存管理器的負擔,最壞的情況下,會導致操作系統比memcached進程本身還慢,為了解決這個問題,Slab Allocation內存分配機制就延生了。
  現在Memcached利用Slab Allocation機制來分配和管理內存。
  Slab Allocation機制原理是按照預先規定的大小,將分配給memcached的內存分割成特定長度的內存塊(chunk),再把尺寸相同的內存塊,分成組
(chunks slab class),這些內存塊不會釋放,可以重復利用。

圖1 Slab Allocation的構造圖

 

而且,slab allocator還有重復使用已分配的內存的目的。 也就是說,分配到的內存不會釋放,而是重復利用。

Slab Allocation的主要術語

Page

分配給Slab的內存空間,默認是1MB。分配給Slab之后根據slab的大小切分成chunk。

Chunk

用於緩存記錄的內存空間。

Slab Class

特定大小的chunk的組。

在Slab中緩存記錄的原理

下面說明memcached如何針對客戶端發送的數據選擇slab並緩存到chunk中。

memcached根據收到的數據的大小,選擇最適合數據大小的slab(圖2)。 memcached中保存着slab內空閑chunk的列表,根據該列表選擇chunk, 然后將數據緩存於其中。

memcached-0002-02.png

圖2 選擇存儲記錄的組的方法

 

實際上,Slab Allocator也是有利也有弊。下面介紹一下它的缺點。

Slab Allocator的缺點

Slab Allocator解決了當初的內存碎片問題,但新的機制也給memcached帶來了新的問題。

這個問題就是,由於分配的是特定長度的內存,因此無法有效利用分配的內存。 例如,將100字節的數據緩存到128字節的chunk中,剩余的28字節就浪費了(圖3)。

memcached-0002-03.png

圖3 chunk空間的使用

對於該問題目前還沒有完美的解決方案,但在文檔中記載了比較有效的解決方案。

The most efficient way to reduce the waste is to use a list of size classes that closely matches (if that’s at all possible) common sizes of objects that the clients of this particular installation of memcached are likely to store.

就是說,如果預先知道客戶端發送的數據的公用大小,或者僅緩存大小相同的數據的情況下, 只要使用適合數據大小的組的列表,就可以減少浪費。

但是很遺憾,現在還不能進行任何調優,只能期待以后的版本了。 但是,我們可以調節slab class的大小的差別。

 

  Memcached服務器端保存着一個空閑的內存塊列表,當有數據存入時根據接收到的數據大小,分配一個能存下這個數據的最小內存塊。這種方式有時會造成內存浪費。

  例如:將一個200字節的數據存入一個300字節的內存塊中,會有100字節內存被浪費掉,不能使用。避免浪費內存的辦法是,預先計算出應用存入的數據大小,或把同一業務類型的數據存入一個Memcached服務器中,確保存入的數據大小相對均勻,這樣就可以減少對內存的浪費。還有一種辦法是,在啟動時指定“-f”參數,能在某種程度上控制內存組之間的大小差異。在應用中使用Memcached時,通常可以不重新設置這個參數,使用默認值1.25進行部署。如果想優化Memcached對內存的使用,可以考慮重新計算數據的預期平均長度,調整這個參數來獲得合適的設置值。

 

使用Growth Factor對Slab Allocator內存管理機制進行調優

  memcached在啟動時指定 Growth Factor因子(通過-f選項), 就可以在某種程度上控制slab之間的差異。默認值為1.25。 但是,在該選項出現之前,這個因子曾經固定為2,稱為“powers of 2”策略。

讓我們用以前的設置,以verbose模式啟動memcached試試看:

$ memcached -f 2 -vv

下面是啟動后的verbose輸出:

slab class   1: chunk size    128 perslab  8192
slab class   2: chunk size    256 perslab  4096
slab class   3: chunk size    512 perslab  2048
slab class   4: chunk size   1024 perslab  1024
slab class   5: chunk size   2048 perslab   512
slab class   6: chunk size   4096 perslab   256
slab class   7: chunk size   8192 perslab   128
slab class   8: chunk size  16384 perslab    64
slab class   9: chunk size  32768 perslab    32
slab class  10: chunk size  65536 perslab    16
slab class  11: chunk size 131072 perslab     8
slab class  12: chunk size 262144 perslab     4
slab class  13: chunk size 524288 perslab     2

可見,從128字節的組開始,組的大小依次增大為原來的2倍。 這樣設置的問題是,slab之間的差別比較大,有些情況下就相當浪費內存。 因此,為盡量減少內存浪費,兩年前追加了growth factor這個選項。

來看看現在的默認設置(f=1.25)時的輸出(篇幅所限,這里只寫到第10組):

slab class   1: chunk size     88 perslab 11915
slab class   2: chunk size    112 perslab  9362
slab class   3: chunk size    144 perslab  7281
slab class   4: chunk size    184 perslab  5698
slab class   5: chunk size    232 perslab  4519
slab class   6: chunk size    296 perslab  3542
slab class   7: chunk size    376 perslab  2788
slab class   8: chunk size    472 perslab  2221
slab class   9: chunk size    592 perslab  1771
slab class  10: chunk size    744 perslab  1409

可見,組間差距比因子為2時小得多,更適合緩存幾百字節的記錄。 從上面的輸出結果來看,可能會覺得有些計算誤差, 這些誤差是為了保持字節數的對齊而故意設置的。

將memcached引入產品,或是直接使用默認值進行部署時, 最好是重新計算一下數據的預期平均長度,調整growth factor, 以獲得最恰當的設置。內存是珍貴的資源,浪費就太可惜了。

接下來介紹一下如何使用memcached的stats命令查看slabs的利用率等各種各樣的信息。

查看memcached的內部狀態

memcached有個名為stats的命令,使用它可以獲得各種各樣的信息。 執行命令的方法很多,用telnet最為簡單:

$ telnet 主機名 端口號

連接到memcached之后,輸入stats再按回車,即可獲得包括資源利用率在內的各種信息。 此外,輸入”stats slabs”或”stats items”還可以獲得關於緩存記錄的信息。 結束程序請輸入quit。

這些命令的詳細信息可以參考memcached軟件包內的protocol.txt文檔。

$ telnet localhost 11211
Trying ::1...
Connected to localhost.
Escape character is '^]'.
stats
STAT pid 481
STAT uptime 16574
STAT time 1213687612
STAT version 1.2.5
STAT pointer_size 32
STAT rusage_user 0.102297
STAT rusage_system 0.214317
STAT curr_items 0
STAT total_items 0
STAT bytes 0
STAT curr_connections 6
STAT total_connections 8
STAT connection_structures 7
STAT cmd_get 0
STAT cmd_set 0
STAT get_hits 0
STAT get_misses 0
STAT evictions 0
STAT bytes_read 20
STAT bytes_written 465
STAT limit_maxbytes 67108864
STAT threads 4
END
quit

另外,如果安裝了libmemcached這個面向C/C++語言的客戶端庫,就會安裝 memstat 這個命令。 使用方法很簡單,可以用更少的步驟獲得與telnet相同的信息,還能一次性從多台服務器獲得信息。

$ memstat --servers=server1,server2,server3,...

libmemcached可以從下面的地址獲得:

  • http://tangent.org/552/libmemcached.html

查看slabs的使用狀況

使用memcached的創造者Brad寫的名為memcached-tool的Perl腳本,可以方便地獲得slab的使用情況 (它將memcached的返回值整理成容易閱讀的格式)。可以從下面的地址獲得腳本:

  • http://code.sixapart.com/svn/memcached/trunk/server/scripts/memcached-tool

使用方法也極其簡單:

$ memcached-tool 主機名:端口 選項

查看slabs使用狀況時無需指定選項,因此用下面的命令即可:

$ memcached-tool 主機名:端口

獲得的信息如下所示:

 #  Item_Size   Max_age  1MB_pages Count   Full?
 1     104 B  1394292 s    1215 12249628    yes
 2     136 B  1456795 s      52  400919     yes
 3     176 B  1339587 s      33  196567     yes
 4     224 B  1360926 s     109  510221     yes
 5     280 B  1570071 s      49  183452     yes
 6     352 B  1592051 s      77  229197     yes
 7     440 B  1517732 s      66  157183     yes
 8     552 B  1460821 s      62  117697     yes
 9     696 B  1521917 s     143  215308     yes
10     872 B  1695035 s     205  246162     yes
11     1.1 kB 1681650 s     233  221968     yes
12     1.3 kB 1603363 s     241  183621     yes
13     1.7 kB 1634218 s      94   57197     yes
14     2.1 kB 1695038 s      75   36488     yes
15     2.6 kB 1747075 s      65   25203     yes
16     3.3 kB 1760661 s      78   24167     yes

各列的含義為:

含義
# slab class編號
Item_Size Chunk大小
Max_age LRU內最舊的記錄的生存時間
1MB_pages 分配給Slab的頁數
Count Slab內的記錄數
Full? Slab內是否含有空閑chunk

從這個腳本獲得的信息對於調優非常方便,強烈推薦使用。

 

7、Memcached的刪除原理與刪除機制?

 

 

8、Memcached服務端與客戶端的安裝部署與使用測試

 

 

9、如何實現集群中的session共享存儲?

 

 

10、如何獲取MEMCACHED服務的狀態信息,例如:命中率

 

 

11、通過Nagios監控Memcached需要監控哪些指標

 

 

12、redis是什么,有什么作用?

 

 

13、memcached與redis的區別?

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM