Memcache工作原理
Memcache是什么
Memcache是danga.com的一個項目,最早是為 LiveJournal 服務的,目前全世界不少人使用這個緩存項目來構建自己大負載的網站,來分擔數據庫的壓力。
它可以應對任意多個連接,使用非阻塞的網絡IO。由于它的工作機制是在內存中開辟一塊空間,然后建立一個HashTable,Memcached自管理這些HashTable。
為什么會有Memcache和memcached兩種名稱?
其實Memcache是這個項目的名稱,而memcached是它服務器端的主程序文件名,
Memcache官方網站: http://www.danga.com/memcached ,
首先 memcached 是以守護程序方式運行于一個或多個服務器中,隨時接受客戶端的連接操作,客戶端可以由各種語言編寫,目前已知的客戶端 API 包括 Perl/PHP/Python/Ruby/Java/C#/C 等等。客戶端在與 memcached 服務建立連接之后,接下來的事情就是存取對象了,每個被存取的對象都有一個唯一的標識符 key,存取操作均通過這個 key 進行,保存到 memcached 中的對象實際上是放置內存中的,并不是保存在 cache 文件中的,這也是為什么 memcached 能夠如此高效快速的原因。注意,這些對象并不是持久的,服務停止之后,里邊的數據就會丟失。
與許多 cache 工具類似,Memcached 的原理并不復雜。它采用了C/S的模式,在 server 端啟動服務進程,在啟動時可以指定監聽的 ip,自己的端口號,所使用的內存大小等幾個關鍵參數。一旦啟動,服務就一直處于可用狀態。Memcached 的目前版本是通過C實現,采用了單進程,單線程,異步I/O,基于事件 (event_based) 的服務方式.使用 libevent 作為事件通知實現。多個 Server 可以協同工作,但這些 Server 之間是沒有任何通訊聯系的,每個 Server 只是對自己的數據進行管理。Client 端通過指定 Server 端的 ip 地址(通過域名應該也可以)。需要緩存的對象或數據是以 key->value 對的形式保存在Server端。key 的值通過 hash 進行轉換,根據 hash 值把 value 傳遞到對應的具體的某個 Server 上。當需要獲取對象數據時,也根據 key 進行。首先對 key 進行 hash,通過獲得的值可以確定它被保存在了哪臺 Server 上,然后再向該 Server 發出請求。Client 端只需要知道保存 hash(key) 的值在哪臺服務器上就可以了。
其實說到底,memcache 的工作就是在專門的機器的內存里維護一張巨大的 hash 表,來存儲經常被讀寫的一些數組與文件,從而極大的提高網站的運行效率。
3 如何使用
建立Manager類
windows下memcache服務器啟動
將memcache服務器安裝包解壓到C:\memcached文件夾后,使用cmd命令窗口安裝。
1>開始>運行:CMD(確定)
2>cd C:\memcached(回車)
3>memcached -d install(回車 這步執行安裝)
4>memcached -d start(回車 這步執行啟動memcache服務器,默認分配64M內存,使用11211端口)
此時memcache服務器已經可以正常使用了。
memcache服務器安全:
Memcache服務器端都是直接通過客戶端連接后直接操作,沒有任何的驗證過程,這樣如果服務器是直接暴露在互聯網上的話是比較危險,輕則數據泄露被其他無關人員查看,重則服務器被入侵,況且里面可能存在一些我們未知的bug或者是緩沖區溢出的情況,這些都是我們未知的,所以危險性是可以預見的。為了安全起見,做兩點建議,能夠稍微的防止黑客的入侵或者數據的泄露。
現在就關于修改memcache服務器配置的問題說明如下:
1>用內網ip的方式提供web應用服務器調用,不允許直接通過外網調用,如將memcache服務器放在192.168.1.55的服務器上
2>修改端口,如改為11200
3>分配內存,如分配1024M(1G內存)
方法如下:
1>開始>運行:CMD(確定)
2>cd C:\memcached(回車)
3>memcached -m 1024 -p 11200 -l 192.168.1.55(回車)
注意,此時命令行不會回到C:\memcached>狀態,并且實際上memcache服務器悄悄變為stop狀態了。此窗口不可以關閉。新開一個cmd窗口
4>開始>運行:CMD(確定)
5>cd C:\memcached(回車)
6>memcached -d start(回車)可以關閉此cmd窗口。
此時可以使用新配置的memcache服務器了。
上述方法雖然解決了修改默認配置的問題,但是始終會有一個cmd窗口不可以關閉,否則就回到11211端口的默認配置。
更好的解決方案是通過修改服務的注冊表配置:
1>開始>運行:regedit(回車)
2>在注冊表中找到:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\memcached Server
3>默認的ImagePath鍵的值是:"c:\memcached\memcached.exe" -d runservice,改為:"c:\memcached\memcached.exe" -d runservice -m 512 -p 11200 -l 192.168.1.55(確定,關閉注冊表)
4>我的電腦(右鍵)>管理>服務 找到memcache的服務,重新啟動一次即可生效。
此時,同網段內的電腦仍然可以利用這臺 memcache服務器,我們限定指定的web應用服務器才能夠使用,通過防火墻的方式。如只允許 192.168.1.2這臺Web服務器對Memcache服務器的訪問,能夠有效的阻止一些非法訪問,相應的也可以增加一些其他的規則來加強安全性,這個可以根據自己的需要來做。
分析Memcached客戶端如何把緩存數據分布到多個服務器上
Memcached客戶端可以設多個memcached服務器,它是如何把數據分發到各個服務器上,而使各個服務器負載平衡的呢?
Memcache是danga.com的一個項目,最早是為 LiveJournal 服務的,目前全世界不少人使用這個緩存項目來構建自己大負載的網站,來分擔數據庫的壓力。
它可以應對任意多個連接,使用非阻塞的網絡IO。由于它的工作機制是在內存中開辟一塊空間,然后建立一個HashTable,Memcached自管理這些HashTable。
為什么會有Memcache和memcached兩種名稱?
其實Memcache是這個項目的名稱,而memcached是它服務器端的主程序文件名,
Memcache官方網站: http://www.danga.com/memcached ,
首先 memcached 是以守護程序方式運行于一個或多個服務器中,隨時接受客戶端的連接操作,客戶端可以由各種語言編寫,目前已知的客戶端 API 包括 Perl/PHP/Python/Ruby/Java/C#/C 等等。客戶端在與 memcached 服務建立連接之后,接下來的事情就是存取對象了,每個被存取的對象都有一個唯一的標識符 key,存取操作均通過這個 key 進行,保存到 memcached 中的對象實際上是放置內存中的,并不是保存在 cache 文件中的,這也是為什么 memcached 能夠如此高效快速的原因。注意,這些對象并不是持久的,服務停止之后,里邊的數據就會丟失。
與許多 cache 工具類似,Memcached 的原理并不復雜。它采用了C/S的模式,在 server 端啟動服務進程,在啟動時可以指定監聽的 ip,自己的端口號,所使用的內存大小等幾個關鍵參數。一旦啟動,服務就一直處于可用狀態。Memcached 的目前版本是通過C實現,采用了單進程,單線程,異步I/O,基于事件 (event_based) 的服務方式.使用 libevent 作為事件通知實現。多個 Server 可以協同工作,但這些 Server 之間是沒有任何通訊聯系的,每個 Server 只是對自己的數據進行管理。Client 端通過指定 Server 端的 ip 地址(通過域名應該也可以)。需要緩存的對象或數據是以 key->value 對的形式保存在Server端。key 的值通過 hash 進行轉換,根據 hash 值把 value 傳遞到對應的具體的某個 Server 上。當需要獲取對象數據時,也根據 key 進行。首先對 key 進行 hash,通過獲得的值可以確定它被保存在了哪臺 Server 上,然后再向該 Server 發出請求。Client 端只需要知道保存 hash(key) 的值在哪臺服務器上就可以了。
其實說到底,memcache 的工作就是在專門的機器的內存里維護一張巨大的 hash 表,來存儲經常被讀寫的一些數組與文件,從而極大的提高網站的運行效率。
3 如何使用
建立Manager類
package com.alisoft.sme.memcached; import java.util.Date; import com.danga.MemCached.MemCachedClient; import com.danga.MemCached.SockIOPool; public class MemCachedManager { // 創建全局的唯一實例 protected static MemCachedClient mcc = new MemCachedClient(); protected static MemCachedManager memCachedManager = new MemCachedManager(); // 設置與緩存服務器的連接池 static { // 服務器列表和其權重 String[] servers = { "127.0.0.1:11211" }; Integer[] weights = { 3 }; // 獲取socke連接池的實例對象 SockIOPool pool = SockIOPool.getInstance(); // 設置服務器信息 pool.setServers(servers); pool.setWeights(weights); // 設置初始連接數、最小和最大連接數以及最大處理時間 pool.setInitConn(5); pool.setMinConn(5); pool.setMaxConn(250); pool.setMaxIdle(1000 * 60 * 60 * 6); // 設置主線程的睡眠時間 pool.setMaintSleep(30); // 設置TCP的參數,連接超時等 pool.setNagle(false); pool.setSocketTO(3000); pool.setSocketConnectTO(0); // 初始化連接池 pool.initialize(); // 壓縮設置,超過指定大小(單位為K)的數據都會被壓縮 mcc.setCompressEnable(true); mcc.setCompressThreshold(64 * 1024); } /** * 保護型構造方法,不允許實例化! * */ protected MemCachedManager() { } /** * 獲取唯一實例. * * @return */ public static MemCachedManager getInstance() { return memCachedManager; } /** * 添加一個指定的值到緩存中. * * @param key * @param value * @return */ public boolean add(String key, Object value) { return mcc.add(key, value); } public boolean add(String key, Object value, Date expiry) { return mcc.add(key, value, expiry); } public boolean replace(String key, Object value) { return mcc.replace(key, value); } public boolean replace(String key, Object value, Date expiry) { return mcc.replace(key, value, expiry); } /** * 根據指定的關鍵字獲取對象. * * @param key * @return */ public Object get(String key) { return mcc.get(key); } public static void main(String[] args) { MemCachedManager cache = MemCachedManager.getInstance(); cache.add("hello", 234); System.out.print("get value : " + cache.get("hello")); } }
windows下memcache服務器啟動
將memcache服務器安裝包解壓到C:\memcached文件夾后,使用cmd命令窗口安裝。
1>開始>運行:CMD(確定)
2>cd C:\memcached(回車)
3>memcached -d install(回車 這步執行安裝)
4>memcached -d start(回車 這步執行啟動memcache服務器,默認分配64M內存,使用11211端口)
此時memcache服務器已經可以正常使用了。
memcache服務器安全:
Memcache服務器端都是直接通過客戶端連接后直接操作,沒有任何的驗證過程,這樣如果服務器是直接暴露在互聯網上的話是比較危險,輕則數據泄露被其他無關人員查看,重則服務器被入侵,況且里面可能存在一些我們未知的bug或者是緩沖區溢出的情況,這些都是我們未知的,所以危險性是可以預見的。為了安全起見,做兩點建議,能夠稍微的防止黑客的入侵或者數據的泄露。
現在就關于修改memcache服務器配置的問題說明如下:
1>用內網ip的方式提供web應用服務器調用,不允許直接通過外網調用,如將memcache服務器放在192.168.1.55的服務器上
2>修改端口,如改為11200
3>分配內存,如分配1024M(1G內存)
方法如下:
1>開始>運行:CMD(確定)
2>cd C:\memcached(回車)
3>memcached -m 1024 -p 11200 -l 192.168.1.55(回車)
注意,此時命令行不會回到C:\memcached>狀態,并且實際上memcache服務器悄悄變為stop狀態了。此窗口不可以關閉。新開一個cmd窗口
4>開始>運行:CMD(確定)
5>cd C:\memcached(回車)
6>memcached -d start(回車)可以關閉此cmd窗口。
此時可以使用新配置的memcache服務器了。
上述方法雖然解決了修改默認配置的問題,但是始終會有一個cmd窗口不可以關閉,否則就回到11211端口的默認配置。
更好的解決方案是通過修改服務的注冊表配置:
1>開始>運行:regedit(回車)
2>在注冊表中找到:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\memcached Server
3>默認的ImagePath鍵的值是:"c:\memcached\memcached.exe" -d runservice,改為:"c:\memcached\memcached.exe" -d runservice -m 512 -p 11200 -l 192.168.1.55(確定,關閉注冊表)
4>我的電腦(右鍵)>管理>服務 找到memcache的服務,重新啟動一次即可生效。
此時,同網段內的電腦仍然可以利用這臺 memcache服務器,我們限定指定的web應用服務器才能夠使用,通過防火墻的方式。如只允許 192.168.1.2這臺Web服務器對Memcache服務器的訪問,能夠有效的阻止一些非法訪問,相應的也可以增加一些其他的規則來加強安全性,這個可以根據自己的需要來做。
分析Memcached客戶端如何把緩存數據分布到多個服務器上
Memcached客戶端可以設多個memcached服務器,它是如何把數據分發到各個服務器上,而使各個服務器負載平衡的呢?
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!