目錄前端
高性能的內存的緩存系統。
經過在實現規劃好的內存空間中臨時緩存數據庫中的各項數據,來達到減小直接對數據庫的直接高併發訪問,從而達到提高數據庫的訪問性能,加網站集羣動態應用服務的能力。
簡單說就是經過緩存數據庫查詢結果,減小數據庫訪問次數,以提升動態web應用的速度和擴展性。git
a/ 完整緩存,靜態緩存
商品信息,事前放到內存裏,而後在對外提供訪問。預熱。用戶訪問時只讀取memched緩存,就不用讀數據庫。
b/ 熱點緩存
需前端web程序配合,只緩存熱點數據,即緩存常常被訪問的數據。
先預熱數據庫裏的基礎數據,而後動態更新。所謂動態更新,程序先讀取緩存,若是緩存裏面沒有對應數據,再去讀取數據庫,而後程序把讀到的數據放入緩存。
一、 電商秒殺,雙十一等高併發業務。例如,小米秒殺只獲取資格,而不是瞬間秒殺到手商品。只更改用戶狀態,節省服務器資源。
二、若是數據更新,同時出發緩存更新,避免給客戶過時數據。
c/ 對於持久化存儲系統。好比redis,能夠替代一部分數據庫的存儲,一些簡單的數據業務,投票,統計,好友統計等github
a 當web程序須要訪問後盾數據庫獲取數據時,會優先訪問memcached內存緩存。若是緩存中有對應數據就直接放回給前端及用戶;若是沒有數據,也就是沒有命中,再由程序請求數據庫,獲取到數據後除了返回給客戶,還會把數據放入到memcaced中,以便下次請求被訪問。memcached始終是數據庫的擋箭牌,從而減輕數據庫的壓力,提升整個網站的相應速度。
b 當程序更新、修改、殺出等操做時,會同時發送請求通知memcached已經緩存的數據失效,從而保證緩存的數據和數據庫中的一致。
若是是在高併發場合,除了通知過時緩存失效外,還會經過相關機制,使用戶訪問新數據前,經過程序預先把更新過的數據推送到memcached中緩存起來。這樣能夠減小數據庫的訪問壓力,提高命中率。
web
memcached集羣和普通集羣的區別:全部memcached的數據綜合纔是數據庫的綜合。
a 程序實現
程序加載全部memcached的ip列表,經過對key作一致性哈希
一致性hash,目的是不但保證每一個對象只請求一個對應的服務器,並且當節點宕機緩存服務器的更新從新分配比例降到最低。
b 負載均衡器/代理,如magnetredis
一、安裝
wget http://memagent.googlecode.com/files/magent-0.5.tar.gz
tar zxvf magent-0.5.tar.gz
/sbin/ldconfig
sed -i "s#LIBS = -levent#LIBS = -levent -lm#g" Makefile
make
cp magent /usr/bin/magent 算法
二、命令詳解數據庫
-h this message -u uid -g gid -p port, default is 11211. (0 to disable tcp support) -s ip:port, set memcached server ip and port -b ip:port, set backup memcached server ip and port -l ip, local bind ip address, default is 0.0.0.0 -n number, set max connections, default is 4096 -D do not go to background -k use ketama key allocation algorithm -f file, unix socket path to listen on. default is off -i number, max keep alive connections for one memcached server, default is 20 -v verbose
三、啓動
magent -u root -n 51200 -l 192.168.1.2 -p 12000 -s 192.168.1.4:11211 -s192.168.1.5:11211
192.168.1.5:11211
cache機制是LRU(最近最少用)算法,加上item過時失效。若是內存不夠用了,過時的會最早被替換,接着是lru算法算出來的。
-m能夠指定不被刪除緩存
一、下載
wget http://memcached.googlecode.com/files/memcached-1.4.15.tar.gz
wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
二、安裝
# tar zxvf libevent-*.tar.gz
# cd libevent-2.0.21
# ./configure –prefix=/usr/local/libevent
# make
# make install
#測試是否安裝成功
# ls -al /usr/lib | grep libevent
# tar zxvf memcached-1.4.15.tar.gz
# cd memcached-1.4.15
#這裏安裝的時候須要制定libevent的安裝路徑
# ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent/
# make
# make install
#檢查是否安裝成功
# ls -al /usr/local/bin/mem*
三、啓動
/usr/local/memcached/bin/memcached -d -m 256 -u root -p 11211 -c 1024 –P /tmp/memcached.pid
啓動參數說明:
-d 選項是啓動一個守護進程。
-u root 表示啓動memcached的用戶爲root。
-m 是分配給Memcache使用的內存數量,單位是MB,默認64MB。
-M return error on memory exhausted (rather than removing items)。
-u 是運行Memcache的用戶,若是當前爲root 的話,須要使用此參數指定用戶。
-p 是設置Memcache的TCP監聽的端口,最好是1024以上的端口。
-c 選項是最大運行的併發鏈接數,默認是1024。
-P 是設置保存Memcache的pid文件。
四、測試
[root@localhost /]# telnet 192.168.141.64 12000
Trying 192.168.141.64...
Connected to 192.168.141.64 (192.168.141.64).
Escape character is '^]'.
set key1 0 60 4
zhou
STORED
get key1
VALUE key1 0 4
zhou
END
備註:
參數詳細說明
memcached 1.4.2
-p 監聽的TCP端口(默認: 11211)
-U 監聽的UDP端口(默認: 11211, 0表示不監聽)
-s 用於監聽的UNIX套接字路徑(禁用網絡支持)
-a UNIX套接字訪問掩碼,八進制數字(默認:0700)
-l 監聽的IP地址。(默認:INADDR_ANY,全部地址)
-d 做爲守護進程來運行。
-r 最大核心文件限制。
-u 設定進程所屬用戶。(只有root用戶可使用這個參數)
-m 單個數據項的最大可用內存,以MB爲單位。(默認:64MB)
-M 內存用光時報錯。(不會刪除數據)
-c 最大併發鏈接數。(默認:1024)
-k 鎖定全部內存頁。注意你能夠鎖定的內存上限。
試圖分配更多內存會失敗的,因此留意啓動守護進程時所用的用戶可分配的內存上限。
(不是前面的 -u 參數;在sh下,使用命令"ulimit -S -l NUM_KB"來設置。)
-v 提示信息(在事件循環中打印錯誤/警告信息。)
-vv 詳細信息(還打印客戶端命令/響應)
-vvv 超詳細信息(還打印內部狀態的變化)
-h 打印這個幫助信息並退出。
-i 打印memcached和libevent的許可。
-P 保存進程ID到指定文件,只有在使用 -d 選項的時候纔有意義。
-f 塊大小增加因子。(默認:1.25)
-n 分配給key+value+flags的最小空間(默認:48)
-L 嘗試使用大內存頁(若是可用的話)。提升內存頁尺寸能夠減小"頁表緩衝(TLB)"丟失次數,提升運行效率。
爲了從操做系統得到大內存頁,memcached會把所有數據項分配到一個大區塊。
-D 使用 做爲前綴和ID的分隔符。
這個用於按前綴得到狀態報告。默認是":"(冒號)。
若是指定了這個參數,則狀態收集會自動開啓;若是沒指定,則須要用命令"stats detail on"來開啓。
-t 使用的線程數(默認:4)
-R 每一個鏈接可處理的最大請求數。
-C 禁用CAS。
-b 設置後臺日誌隊列的長度(默認:1024)
-B 綁定協議 - 可能值:ascii,binary,auto(默認)
-I 重寫每一個數據頁尺寸。調整數據項最大尺寸。
服務器