『壹』 linux下Memcached的安裝步驟是什麼呢
一、檢查libevent
首先檢查系統中是否安裝了libevent
Shell代碼
rpm -qa|grep libevent
如果安裝了則查看libevent的閉納安裝路徑,後續安裝時需要用到
Shell代碼
rpm -ql libevent
如果沒有安裝,則先安裝libevent
安裝libevent:
1.首先下載libevent安裝包
Shell代碼
wget http://www.monkey.org/~provos/libevent-1.4.12-stable.tar.gz
2.解壓縮安裝包
Shell代碼
tar zxvf libevent-1.4.12-stable.tar.gz -C /usr/local/
3.進入解壓後的目錄
Shell代碼
cd libevent-1.4.12-stable/
4.配置編譯、安裝
Shell代碼
./configure -prefix=/usr/libevent
make
make install
安裝完libevent之後為了讓動態鏈接庫為系統所共享,需要執行以下動態鏈接庫的管理命令ldconfig
不過在執行ldconfig命令之前需要注意以下libevent的安裝目錄。具體參見:http://chenzhou123520.iteye.com/blog/1925196
安裝完libevent後正式開始安裝memcached
1.首先是下載memcached的安裝包
Shell代碼
wget http://memcached.googlecode.com/files/memcached-1.4.15.tar.gz
2.修改安裝包的執行操作許可權
Shell代碼
chmod 777 memcached-1.4.15.tar.gz
3.解壓安裝包到指定目錄
Shell代碼
tar zxvf memcached-1.4.15.tar.gz -C /usr/local
4.進入解壓後的目錄
Shell代碼
cd /usr/local/memcached-1.4.15/
5.配置、編譯、安裝
註:configure時需要指定libevent的安裝路徑
Shell代碼
./configure -with-libevent=/usr/libevent/ -prefix=/usr/local/memcached
make
make install
6.安裝成功後啟動一下看安裝是否成功
Shell代碼
/usr/local/memcached/bin/memcached -d -m 10m -p 11211 -u root
啟動參數介紹如下:和上面的命令不對應
-d選項是啟動一個守護進程,
-m是分配給Memcache使用的內存數量,單位是MB,這里是10MB,
-u是運行Memcache的用戶,這里是root,
-l是監聽的伺服器IP地址,如果有轎灶沒多個辯蔽地址的話,這里指定了伺服器的IP地址192.168.0.200,
-p是設置Memcache監聽的埠,這里設置了12000,最好是1024以上的埠,
-c選項是最大運行的並發連接數,默認是1024,這里設置了256,按照伺服器的負載量來設定,
-P是設置保存Memcache的pid文件,我這里是保存在 /tmp/memcached.pid,也可以啟動多個守護進程,不過埠不能重復。
如果要給memcached上配置日誌,參見:http://chenzhou123520.iteye.com/blog/1925209
PS:附上一個memcached啟動的shell腳本
Shell代碼
#!/bin/sh
echo "Start to start memcached server $(date)..."
MEMCACHED=/usr/local/memcached/bin/memcached
usage()
{
echo "usage: `basename $0` port"
}
if [ -n "$1" ]
then
{
pid=`ps aux|grep memcached|grep "$1" |grep -v grep|awk '{print $2}'`
if [ -n "$pid" ]
then
{
sleep 2
echo "kill memcached which port is $1 begin"
echo "pid:$pid"
kill -9 $pid
echo "kill memcached which port is $1 end"
sleep 2
}
fi
echo "begin to start memcached in port $1"
LOG_FILE=/var/log/memcached/memcached_$1.log
rm -f $LOG_FILE
$MEMCACHED -d -m 2048 -p $1 -u root -vv >> $LOG_FILE 2>&1
echo "start memcached end"
tail -f $LOG_FILE
}
else
{
usage
exit 1
}
fi
把該腳本命名為startup.sh
執行:./startup.sh 11211
其中11211為memcached的啟動埠,也可以通過自定義的埠來啟動
查看是否啟動:ps aux|grep memcached
查看版本 :
cd /etc/init.d/
memcached -h
或者:
[nihaoya@SHANGH-39-DX-APP ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
stats
『貳』 linux 怎樣 查看memcached是否安裝成功
一、使用memcache top腳本
memcache-top 是一個用 Perl 編寫的命令行小工具,用來實時的獲取 memcached 緩存伺服器的詳細信息,例如緩存命中率等。到官網下載腳本,放到用戶目錄,直接運行即可。
/home/nihaoya/memcache-top
INSTANCE USAGE HIT % CONN TIME EVICT/s READ/s WRITE/s
10.50.11.5:11211 88.8% 69.6% 1123 1.9ms 0.3 13.1K 36.2K
10.50.11.5:11212 88.7% 69.6% 1175 0.6ms 0.3 12.4K 28.1K
10.50.11.5:11213 88.8% 69.4% 1148 0.7ms 0.0 16.6K 32.1K
10.50.12.5:11211 89.3% 81.5% 1460 0.7ms 0.3 17.7K 204.0K
10.50.12.5:11212 89.4% 69.3% 1174 0.6ms 1.0 28.9K 63.5K
10.50.12.5:11213 89.3% 69.4% 1158 0.7ms 0.7 166.3K 194.4K
10.50.15.5:11211 89.3% 71.8% 1472 0.8ms 0.0 37.3K 59.2K
10.50.15.5:11212 89.4% 69.3% 1143 0.7ms 0.7 44.9K 35.4K
10.50.15.5:11213 89.3% 84.5% 1371 0.7ms 0.7 49.0K 187.2K
10.50.9.90:11211 30.2% 76.3% 259 0.7ms 0.0 243 999
10.50.9.90:11212 19.2% 60.3% 261 0.7ms 0.0 40 801
10.50.9.90:11213 17.5% 16.9% 235 0.6ms 0.0 70 600
AVERAGE: 72.4% 67.3% 998 0.8ms 0.3 32.2K 70.2K
TOTAL: 23.4GB 11.7K 9.2ms 4.0 386.4K 842.3K
二、使用telnet方式,只能查看某個節點的
[nihaoya@SHANGH-39-DX-APP ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
stats
STAT pid 22362 //memcache伺服器的進程ID www.2cto.com
STAT uptime 1469315 //伺服器已經運行的秒數
STAT time 1339671194 //伺服器當前的unix時間戳
STAT version 1.4.9 //memcache版本
STAT libevent 1.4.9-stable //libevent版本
STAT pointer_size 64 //當前操作系統的指針大小(32位系統一般是32bit,64就是64位操作系統)
STAT rusage_user 3695.485200 //進程的累計用戶時間
STAT rusage_system 14751.273465 //進程的累計系統時間
STAT curr_connections 69 //伺服器當前存儲的items數量
STAT total_connections 855430 //從伺服器啟動以後存儲的items總數量
STAT connection_structures 74 //伺服器分配的連接構造數
STAT reserved_fds 20 //
STAT cmd_get 328806688 //get命令(獲取)總請求次數
STAT cmd_set 75441133 //set命令(保存)總請求次數 www.2cto.com
STAT cmd_flush 34 //flush命令請求次數
STAT cmd_touch 0 //touch命令請求次數
STAT get_hits 253547177 //總命中次數
STAT get_misses 75259511 //總未命中次數
STAT delete_misses 4 //delete命令未命中次數
STAT delete_hits 565730 //delete命令命中次數
STAT incr_misses 0 //incr命令未命中次數
STAT incr_hits 0 //incr命令命中次數
STAT decr_misses 0 //decr命令未命中次數
STAT decr_hits 0 //decr命令命中次數
STAT cas_misses 0 //cas命令未命中次數
STAT cas_hits 0 //cas命令命中次數
STAT cas_badval 0 //使用擦拭次數
STAT touch_hits 0 //touch命令未命中次數
STAT touch_misses 0 //touch命令命中次數
STAT auth_cmds 0 //認證命令處理的次數
STAT auth_errors 0 //認證失敗數目
STAT bytes_read 545701515844 //總讀取位元組數(請求位元組數)
STAT bytes_written 1649639749866 //總發送位元組數(結果位元組數)
STAT limit_maxbytes 2147483648 //分配給memcache的內存大小(位元組)
STAT accepting_conns 1 //伺服器是否達到過最大連接(0/1)
STAT listen_disabled_num 0 //失效的監聽數
STAT threads 4 //當前線程數
STAT conn_yields 14 //連接操作主動放棄數目
STAT hash_power_level 16 //
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT expired_unfetched 30705763
STAT evicted_unfetched 0
STAT bytes 61380700 //當前存儲佔用的位元組數
STAT curr_items 28786 //當前存儲的數據總數
STAT total_items 75441133 //啟動以來存儲的數據總數
STAT evictions 0 //為獲取空閑內存而刪除的items數(分配給memcache的空間用滿後需要刪除舊的items來得到空間分配給新的items)
STAT reclaimed 39957976 //已過期的數據條目來存儲新數據的數目
END
退出:quit或者ctrl + ] 然後在按q就行了。
安裝telenet方法
1、yum install telnet-server 服務端
2、yum install telnet 客戶端
3、vi /etc/xinetd.d/telnet
service telnet
{
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.telnetd
log_on_failure += USERID
disable = yes
}
將disable項由yes改成no。
4、/etc/init.d/xinetd restart
其他方式:
前項目中,linux下memcached的啟動/結束的方式
默認情況下memcached安裝到/usr/local/bin下。
進入安裝目錄,啟動memcached:/usr/local/memcached/bin/memcached -d -c 10240 -m 1024 -u root
獲取運行狀態:echo stats | nc localhost 11211(可以查看出pid) 或使用ps -ef|grep memcached
停止memcached:kill -9 pid (-9表示強制殺死,pid 為進程的進程標識符)
-d 選項是啟動一個守護進程,
-m 是分配給Memcache使用的內存數量,單位是MB,這里是1024MB,默認是64MB
-u 是運行Memcache的用戶,這里是root
-l 是監聽的伺服器IP地址,默認應該是本機
-p 是設置Memcache監聽的埠,默認是11211,最好是1024以上的埠
-c 選項是最大運行的並發連接數,默認是1024,這里設置了10240,按照你伺服器的負載量來設定
-P 是設置保存Memcache的pid文件位置
-h 列印幫助信息
-v 輸出警告和錯誤信息
-vv 列印客戶端的請求和返回信息
ps -ef|grep memcached(命令說明)
grep:功能說明:查找文件里符合條件的字元串。
|:管道命令操作符
ps(process status):功能說明:報告程序狀況。
連接到 memcached:
telnet ip 埠,如telnet 192.168.100.11 11211
stats查看狀態,flush_all:清楚緩存
查看memcached狀態的基本命令,通過這個命令可以看到如下信息:
STAT pid 22459 進程ID
STAT uptime 1027046 伺服器運行秒數
STAT time 1273043062 伺服器當前unix時間戳
STAT version 1.4.4 伺服器版本
STAT pointer_size 64 操作系統字大小(這台伺服器是64位的)
STAT rusage_user 0.040000 進程累計用戶時間
STAT rusage_system 0.260000 進程累計系統時間
STAT curr_connections 10 當前打開連接數
STAT total_connections 82 曾打開的連接總數
STAT connection_structures 13 伺服器分配的連接結構數
STAT cmd_get 54 執行get命令總數
STAT cmd_set 34 執行set命令總數
STAT cmd_flush 3 指向flush_all命令總數
STAT get_hits 9 get命中次數
STAT get_misses 45 get未命中次數
STAT delete_misses 5 delete未命中次數
STAT delete_hits 1 delete命中次數
STAT incr_misses 0 incr未命中次數
STAT incr_hits 0 incr命中次數
STAT decr_misses 0 decr未命中次數
STAT decr_hits 0 decr命中次數
STAT cas_misses 0 cas未命中次數
STAT cas_hits 0 cas命中次數
STAT cas_badval 0 使用擦拭次數
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 15785 讀取位元組總數
STAT bytes_written 15222 寫入位元組總數
STAT limit_maxbytes 1048576 分配的內存數(位元組)
STAT accepting_conns 1 目前接受的鏈接數
STAT listen_disabled_num 0
STAT threads 4 線程數
STAT conn_yields 0
STAT bytes 0 存儲item位元組數
STAT curr_items 0 item個數
STAT total_items 34 item總數
STAT evictions 0 為獲取空間刪除item的總數
另外一個例子:
啟動/結束
memcached -d -m 10 -u root -l 192.168.0.122 -p 11200 -c 256 -P /tmp/memcached.pid
-d 選項是啟動一個守護進程,
-m 是分配給Memcache使用的內存數量,單位是MB,這里是10MB
-u 是運行Memcache的用戶,這里是root
-l 是監聽的伺服器IP地址,如果有多個地址的話,這里指定了伺服器的IP地址192.168.0.122
-p 是設置Memcache監聽的埠,這里設置了12000,最好是1024以上的埠
-c 選項是最大運行的並發連接數,默認是1024,這里設置了256,按照你伺服器的負載量來設定
-P 是設置保存Memcache的pid文件
kill `cat /tmp/memcached.pid`
獲取運行狀態
echo stats | nc 192.168.1.123 11200
watch "echo stats | nc 192.168.1.123 11200" (實時狀態)
『叄』 Linux系統,memcached 服務啟動,報錯
這樣可以?
/usr/local/bin/memcached –d –m 100 –l 192.168.150.129 –p 12000 –c 256 –P /tmp/memcached.pid
這樣?
/usr/local/bin/memcached –d -u nobody –m 100 –l 192.168.150.129 –p 12000 –c 256 –P /tmp/memcached.pid
這樣?
/usr/local/bin/memcached –d –m 100 –u root –l 192.168.150.129 –p 12000 –c 256 –P /tmp/memcached/pid
『肆』 如何修改memcache內存大小
將memcache伺服器安裝包解壓到C:\memcached文件夾後,使用cmd命令窗口安裝。
1>開始>運行:CMD(確定)
2>cd C:\memcached(回車)
3>memcached -d install(回車 這步執行安裝)
4>memcached -d start(回車 這步執行啟動memcache伺服器,默認分配64M內存,使用11211埠)
此時memcache伺服器已經可以正常使用了。
由於32位系統只能處理4G內存的定址,所以在大於4G內存使用PAE的32位伺服器上可以運行2-3個進程,並在不同埠進行監聽。
又如:memcached -d -m 10 -u root -l 192.168.105.73 -p 12000 -c 256 -P /tmp/memcached.pid
[plain] view plain
-d選項是啟動一個守護進程,
-m是分配給Memcache使用的內存數量,單位是MB,我這里是10MB,
-u是運行Memcache的用戶,我這里是root,
-l是監聽的伺服器IP地址,如果有多個地址的話,我這里指定了伺服器的IP地址192.168.105.73 ,
-p是設置Memcache監聽的埠,我這里設置了12000,最好是1024以上的埠,
-c選項是最大運行的並發連接數,默認是1024,我這里設置了256,按照你伺服器的負載量來設定,
-P是設置保存Memcache的pid文件,我這里是保存在 /tmp/memcached.pid
memcache伺服器安全:
Memcache伺服器端都是直接通過客戶端連接後直接操作,沒有任何的驗證過程,這樣如果伺服器是直接暴露在互聯網上的話是比較危險,輕則數據泄露被其他無關人員查看,重則伺服器被入侵,況且裡面可能存在一些我們未知的bug或者是緩沖區溢出的情況,這些都是我們未知的,所以危險性是可以預見的。為了安全起見,做兩點建議,能夠稍微的防止黑客的入侵或者數據的泄露。
現在就關於修改memcache伺服器配置的問題說明如下:
1>用內網ip的方式提供web應用伺服器調用,不允許直接通過外網調用,如將memcache伺服器放在192.168.1.55的伺服器上
2>修改埠,如改為11200
3>分配內存,如分配1024M(1G內存)
方法如下:
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的服務,重新啟動一次即可生效。
可以使用PHP寫的 MemAdmin 來監控memcahce運行狀態
原文地址:http://blog.csdn.NET/leiyonglin/article/details/694
『伍』 Memcache 連接超時 什麼原因
Memcached存儲單個item最大數據是在1MB內,如果數據超過1M,存取set和get是都是返回false,而且引起性能的問題。
我們之前對排行榜的數據進行緩存,由於排行榜在我們所有sql select查詢裡面佔了30%,而且我們排行榜每小時更新一次,所以必須對數據做緩存。為了清除緩存方便,把所有的用戶的數據放在同一key中,由於memcached:set的時候沒有壓縮數據。在測試服測試的時候,沒發現問題,當上線的時候,結果發現,在線人數剛剛490人的時候,伺服器load average飄到7.9。然後我們去掉緩存,一下子就下降到0.59。
所以Memcahce不適合緩存大數據,超過1MB的數據,可以考慮在客戶端壓縮或拆分到多個key中。大的數據在進行load和uppack到內存的時候需要花很長時間,從而降低伺服器的性能。
Memcached支持最大的存儲對象為1M。這個值由其內存分配機制決定的。
memcached默認情況下採用了名為Slab Allocator的機制分配、管理內存。在該機制出現以前,內存的分配是通過對所有記錄簡單地進行malloc和free來進行的。但是,這種方式會導致內存碎片,加重操作系統內存管理器的負擔,最壞的情況下,會導致操作系統比memcached進程本身還慢。Slab Allocator就是為解決該問題而誕生的。Slab Allocator的基本原理是按照預先規定的大小,將分配的內存分割成特定長度的塊,以完全解決內存碎片問題.
今天(2012-03-16)我們重新測試了memcached ::set的數據大小。可能是我們用php的memcached擴展是最新版,set數據的時候是默認壓縮的。set 數據:
$ac = new memcahed();
$data = str_repeat('a', 1024* 1024); //1M的數據
$r = $ac->set('key', $data, 9999);
//或者
$data = str_repeat('a', 1024* 1024*100);//100M的數據
$r = $ac->set('key', $data, 9999);
不論是1M的數據還是100M的數據,都能set成功。後來我發現,memcachedset數據的時候是默認壓縮的。由於這個這個是重復的字元串,壓縮率高達1000倍。因此100M的數據壓縮後實際也就100k而已。
當我設置:
$ac->setOption(memcahed::OPT_COMPRESSION,0); //不壓縮存儲數據。
$data = str_repeat('a', 1024* 1024); //1M數據
$r = $ac->set('key', $data, 9999);//1M的數據set不成功。
也就是說memcached server不能存儲超過1M的數據,但是經過客戶端壓縮數據後,只要小於1M的數據都能存儲成功。
memcached相關知識:
1、memcached的基本設置
1)啟動Memcache的伺服器端
# /usr/local/bin/memcached -d -m 10 -u root -l 192.168.0.200 -p 12000 -c 256 -P /tmp/memcached.pid
-d選項是啟動一個守護進程,
-m是分配給Memcache使用的內存數量,單位是MB,我這里是10MB,
-u是運行Memcache的用戶,我這里是root,
-l是監聽的伺服器IP地址,如果有多個地址的話,我這里指定了伺服器的IP地址192.168.0.200,
-p是設置Memcache監聽的埠,我這里設置了12000,最好是1024以上的埠,
-c選項是最大運行的並發連接數,默認是1024,我這里設置了256,按照你伺服器的負載量來設定,
-P是設置保存Memcache的pid文件,我這里是保存在 /tmp/memcached.pid,
2)如果要結束Memcache進程,執行:
# kill `cat /tmp/memcached.pid`
哈希演算法將任意長度的二進制值映射為固定長度的較小二進制值,這個小的二進制值稱為哈希值。哈希值是一段數據唯一且極其緊湊的數值表示形式。如果散列一段明文而且哪怕只更改該
段落的一個字母,隨後的哈希都將產生不同的值。要找到散列為同一個值的兩個不同的輸入,在計算上是不可能的。
2、適用memcached的業務場景?
1)如果網站包含了訪問量很大的動態網頁,因而資料庫的負載將會很高。由於大部分資料庫請求都是讀操作,那麼memcached可以顯著地減小資料庫負載。
2)如果資料庫服務
『陸』 如何配置Memcached伺服器
Windows下的Memcache安裝
1. 下載memcache的windows穩定版,解壓放某個盤下面,比如在c:\memcached
2. 在終端(也即cmd命令界面)下輸入 c:\memcached\memcached.exe -d install --安裝memcached成為服務,這樣才能正常運行,否則運行失敗!
3. 再輸入: c:\memcached\memcached.exe -d start --啟動memcached的。
以後memcached將作為windows的一個服務每次開機時自動啟動。這樣伺服器端已經安裝完畢了。
Linux下的安裝:
1.下載memcached和libevent,放到 /tmp 目錄下
# cd /tmp
# wget http://www.danga.com/memcached/dist/memcached-1.2.0.tar.gz
# wget http://www.monkey.org/~provos/libevent-1.2.tar.gz
2.先安裝libevent:
# tar zxvf libevent-1.2.tar.gz
# cd libevent-1.2
# ./configure –prefix=/usr
# make
# make install
3.測試libevent是否安裝成功:
# ls -al /usr/lib | grep libevent
lrwxrwxrwx 1 root root 21 11?? 12 17:38 libevent-1.2.so.1 -> libevent-1.2.so.1.0.3
-rwxr-xr-x 1 root root 263546 11?? 12 17:38 libevent-1.2.so.1.0.3
-rw-r–r– 1 root root 454156 11?? 12 17:38 libevent.a
-rwxr-xr-x 1 root root 811 11?? 12 17:38 libevent.la
lrwxrwxrwx 1 root root 21 11?? 12 17:38 libevent.so -> libevent-1.2.so.1.0.3
4.安裝memcached,同時需要安裝中指定libevent的安裝位置:
# cd /tmp
# tar zxvf memcached-1.2.0.tar.gz
# cd memcached-1.2.0
# ./configure –with-libevent=/usr
# make
# make install
如果中間出現報錯,請仔細檢查錯誤信息,按照錯誤信息來配置或者增加相應的庫或者路徑。
安裝完成後會把memcached放到 /usr/local/bin/memcached ,
5.測試是否成功安裝memcached:
# ls -al /usr/local/bin/mem*
-rwxr-xr-x 1 root root 137986 11?? 12 17:39 /usr/local/bin/memcached
-rwxr-xr-x 1 root root 140179 11?? 12 17:39 /usr/local/bin/memcached-debug
memcached的基本設置:
1.啟動Memcache的伺服器端:
# /usr/local/bin/memcached -d -m 10 -u root -l 192.168.0.200 -p 12000 -c 256 -P /tmp/memcached.pid
-d選項是啟動一個守護進程,
-m是分配給Memcache使用的內存數量,單位是MB,這里是10MB,
-u是運行Memcache的用戶,這里是root,
-l是監聽的伺服器IP地址,如果有多個地址的話,這里指定了伺服器的IP地址192.168.0.200,
-p是設置Memcache監聽的埠,這里設置了12000,最好是1024以上的埠,
-c選項是最大運行的並發連接數,默認是1024,這里設置了256,按照你伺服器的負載量來設定,
-P是設置保存Memcache的pid文件,這里是保存在 /tmp/memcached.pid,
2.如果要結束Memcache進程,執行:
# kill `cat /tmp/memcached.pid`
也可以啟動多個守護進程,不過埠不能重復。
3.重啟apache,service httpd restart
java的客戶端連接程序:
將java_memcached-release_1.6.zip解壓後的目錄中的java_memcached-release_2.0.jar文件復制到java項目的lib目錄下。
package utils.cache;
import java.util.Date;
import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool;
/**
* 使用memcached的緩存實用類.
*/
public class MemCached
{
// 創建全局的唯一實例
protected static MemCachedClient mcc = new MemCachedClient();
protected static MemCached memCached = new MemCached();
// 設置與緩存伺服器的連接池
static {
// 伺服器列表和其權重
String[] servers = {"127.0.0.1:11211"};
Integer[] weights = {3};
// 獲取socke連接池的實例對象
SockIOPool sockIOPool = SockIOPool.getInstance();
// 設置伺服器信息
sockIOPool.setServers( servers );
sockIOPool.setWeights( weights );
// 設置初始連接數、最小和最大連接數以及最大處理時間
sockIOPool.setInitConn( 5 );
sockIOPool.setMinConn( 5 );
sockIOPool.setMaxConn( 250 );
sockIOPool.setMaxIdle( 1000 * 60 * 60 * 6 );
// 設置主線程的睡眠時間
sockIOPool.setMaintSleep( 30 );
// 設置TCP的參數,連接超時等
sockIOPool.setNagle( false );
sockIOPool.setSocketTO( 3000 );
sockIOPool.setSocketConnectTO( 0 );
//sockIOPool.setFailover(bFailover);
//sockIOPool.setAliveCheck(bAliveCheck);
// 初始化連接池
sockIOPool.initialize();
// 壓縮設置,超過指定大小(單位為K)的數據都會被壓縮
if (memCachedClient == null)
{
mcc = new MemCachedClient(sPoolName);
mcc.setCompressEnable(true);
mcc.setCompressThreshold(4096);
mcc.setPrimitiveAsString(true);
}
}
/*
<h3>基於Spring的配置,如下:</h3>
<pre>
<bean id="memCachedService" class="com.ms.memcached.MemCachedServiceImpl">
<constructor-arg index="0" value="${memcached.pool.name}" />
<constructor-arg index="1" value="${memcached.pool.servers}" />
<constructor-arg index="2" value="${memcached.pool.initConn}" />
<constructor-arg index="3" value="${memcached.pool.maxConn}" />
<constructor-arg index="4" value="${memcached.pool.minConn}" />
<constructor-arg index="5" value="${memcached.pool.socketTO}" />
<constructor-arg index="6" value="${memcached.pool.maintSleep}" />
<constructor-arg index="7" value="${memcached.pool.nagle}" />
<constructor-arg index="8" value="${memcached.pool.failover}" />
<constructor-arg index="9" value="${memcached.pool.aliveCheck}" />
</bean>
</pre>
<h3>利用com.MS.cache.properties來設置參數,如下:</h3>
<pre>
memcached.pool.name = MS
memcached.pool.servers = 192.168.9.132:12000,192.168.9.133:12000
memcached.pool.initConn = 128
memcached.pool.maxConn = 1024
memcached.pool.minConn = 20
memcached.pool.socketTO = 3000
memcached.pool.maintSleep = 30
memcached.pool.nagle = false
memcached.pool.failover = true
memcached.pool.aliveCheck = true
</pre>
*/
/**
* 保護型構造方法,不允許實例化!
*/
protected MemCached()
{
}
/**
* 獲取唯一實例.
*/
public static MemCached getInstance()
{
return memCached;
}
/**
* 添加一個指定的值到緩存中.
* @param key
* @param value
*/
//新增指定key的緩存內容,但不覆蓋已存在的內容。
public boolean add(String key, Object value)
{
return mcc.add(key, value);
}
//expiry過期時間
public boolean add(String key, Object value, Date expiry)
{
return mcc.add(key, value, expiry);
}
//新增或覆蓋指定Key的緩存內容
public boolean set(String key, Object value)
{
return mcc.set(key, value);
}
//lExpiry過期時間
public boolean set(String key, Object value, long lExpiry)
{
return mcc.set(key, value, new Date(lExpiry));
}
//根據指定的Key獲取緩存內容
public boolean get(String key)
{
return mcc.get(key);
}
//根據指定Key更新緩存內容
public boolean replace(String key, Object value)
{
return mcc.replace(key, value);
}
//lExpiry 指定的時間
public boolean replace(String key, Object value, long lExpiry)
{
return mcc.replace(key, value, new Date(lExpiry));
}
//根據指定Key刪除緩存內容
public boolean delete(String key, Object value)
{
return mcc.delete(key, value);
}
//根據指定Key在指定時間後刪除緩存內容
public boolean delete(String key, Object value, long lExpiry)
{
return mcc.delete(key, value, new Date(lExpiry));
}
//檢測Cache中當前Key是否存在
public boolean exists(String key)
{
return mcc.exists(key);
}
//根據指定一批Key批量獲取緩存內容。
/*
* @param sKeys 指定的一批Key。
* @return Object[oValue]
*/
public Object[] getMultiArray(String[] sKeys) throws ServiceException
{
return memCachedClient.getMultiArray(sKeys);
}
/**
* 根據指定一批Key批量獲取緩存內容。
*
* @param sKeys 指定的一批Key。
* @return Map<sKey, oValue>
*/
public Map<String, Object> getMulti(String[] sKeys) throws ServiceException
{
return memCachedClient.getMulti(sKeys);
}
public static void main(String[] args)
{
MemCached memCached= MemCached.getInstance();
memCached.add("hello", 234);
System.out.print("get value : " + memCached.get("hello"));
}
}
那麼我們就可以通過簡單的像main方法中操作的一樣存入一個變數,然後再取出進行查看,我們可以看到先調用了add,然後再進行get,我們運行一次 後,234這個值已經被我們存入了memcached的緩存中的了,我們將main方法中紅色的那一行注釋掉後,我們再運行還是可以看到get到的 value也是234,即緩存中我們已經存在了數據了。
對基本的數據我們可以操作,對於普通的POJO而言,如果要進行存儲的話,那麼比如讓其實現java.io.Serializable介面,因為 memcached是一個分布式的緩存伺服器,多台伺服器間進行數據共享需要將對象序列化的,所以必須實現該介面,否則會報錯的。
Entity
/**
* 獲取當前實體的緩存Id
*
* @return
*/
public String getCacheId()
{
return getCacheId(this.getClass(), sBreedId);
}
get
public Breed getBreedById(String sBreedId) throws ServiceException
{
Breed breed = (Breed)memCachedService.get(getCacheId(Breed.class, sBreedId));
if(breed == null)
{
breed = service.get("breed.getBreedById", sBreedId);
if(breed != null)
{
memCachedService.set(breed.getBreedId(), breed);
}
}
return breed;
}
save
memCachedService.set(spider.getCacheId(), breed);
update
memCachedService.replace(spider.getCacheId(), breed);
remove
memCachedService.delete(getCacheId(Spider.class, IbreedId));
或
memCachedService.delete(breed.getCacheId());
listAll
public List listAll() throws ServiceException
{
List breeds = new ArrayList ();
List breedIds = (List)memCachedService.get(getKeyByMap("Breed", null));
if(ObjectUtils.isEmpty(breedIds))
{
breeds = service.list("breed.getAllBreed", null);
if (!ObjectUtils.isEmpty(breeds))
{
breedIds = new ArrayList();
for (Breed breed : breeds)
{
breedIds.add(breed.getBreedId());
}
memCachedService.set(getKeyByMap("Breed", null), breedIds);
}
}
else
{
for (String sBreedId : breedIds)
{
Breed breed = getBreedById(sBreedId);
if (breed != null)
{
breeds.add(breed);
}
}
}
return breeds;
}
『柒』 linux 查看memcache服務 是否運行『
1、檢查進程
ps -ef|grep memcached
2、檢查埠
默認使用11211埠
netstat -na|grep 11211
『捌』 在linux中啟動memcached出問題!
MemCache是高性能分布式內存對象緩存系統(將數據調用到內存中,然後在內存中讀取,從而大大提高讀取速度)
Memcached安裝與啟動:
安裝memcached需要先安裝libevent
Shell>tar zxvf libevent-1.4.14b-stable.tar.gz
Shell>cd libevent-1.4.14b-stable
Shell>./configure
Shell>make && make install
安裝memcached
Shell>tar zxvf memcached-1.2.5.tar.tar
Shell>cd memcached-1.2.5
Shell>./configure –prefix=/usr/local/memcached
Shell>make && make install
啟動memcached
Shell>/usr/local/memcached/bin/memcached –p 11211 –d –u root –P /tmp/memcached.pid
-P是表示使用TCP,默認埠為11211
-d表示後台啟動一個守護進程(daemon)
-u表示指定root用戶啟動,默認不能用root用戶啟動
-P表示進程的pid存放地點,此處「p」為大寫「P」
-l,後面跟IP地址,手工指定監聽IP地址,默認所有IP都在監聽
-m後面跟分配內存大小,以MB為單位,默認為64M
-c最大運行並發連接數,默認為1024
-f 塊大小增長因子,默認是1.25
-M 內存耗盡時返回錯誤,而不是刪除項,即不用LRU演算法
『玖』 如何查看Memcached運行狀態
如何通過命令行查看memcache當前運
命令行下查看memcache的運行狀態的命令主要是stats命好伏令,步驟如下:
(1)首先通過telnet命令連接上memcache,命令:telnet 127.0.0.1 11211
(2)直接輸入stats 就可以得到當前memcache的狀態。
對於memcache的狀態各英文的意思做如下解釋:
pid memcache伺服器的進程ID
uptime 伺服器已經運行的秒數
time 伺服器當前的unix時間戳
version memcache版本
pointer_size 當前操作系統的指針前纖大小(32位系統一般是32bit)
rusage_user 進程的累計用戶時間
rusage_system 進程的累計系統時間
curr_items 伺服器當前存儲的items數量
total_items 從伺服器啟動以後存儲的items總數量
bytes 當前伺服器存儲items佔用的位元組數
curr_connections 當前打開著的連接數
total_connections 從伺服器啟動以後曾經打開過的連接數
connection_structures 伺服器分配的連接構造數
cmd_get get命令(獲取)總請求次數
cmd_set set命令(保友悔攜存)總請求次數
get_hits 總命中次數
get_misses 總未命中次數
evictions 為獲取空閑內存而刪除的items數(分配給memcache的空間用滿後需要刪除舊的items來得到空間分配給新的items)
bytes_read 總讀取位元組數(請求位元組數)
bytes_written 總發送位元組數(結果位元組數)
limit_maxbytes 分配給memcache的內存大小(位元組)
threads 當前線程數
『拾』 Memcached
Memcached報錯:CLIENT_ERROR bad data chunk
這是因為存儲的位元組長度與指定的長度不匹配造成的,如:
set username 0 0 2
你是打算存儲兩個位元組,但如喚螞櫻果你輸入不等於2個位元組就會報
CLIENT_ERROR bad data chunk
錯誤,注意必須是2個,多於或少於2個位元組都會報這個錯誤。
Ubuntu
sudo apt-get install memcached
sudo service memcached status/stop/和叢start/restart
Linux下設置memcached訪問IP
vim /物褲etc/memcached.conf
注釋掉-l 127.0.0.1
sudo service memcached restart
一、安裝gcc
由於memcached和libevent是由C編寫的,所以首先確保你的系統安裝了gcc,如果沒有安裝,使用yum安裝即可
$ yum -y install gcc
$ yum -y install gcc-c++
$ gcc --version
二、安裝libevent
wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
$ tar -xzf libevent-2.0.21-stable.tar.gz
$ cd libevent-2.0.21-stable
$ ./configure --prefix=/usr
$ make
$ make install
安裝完後可以查看下/usr/lib是否有libevent等文件(ls -al /usr/lib | grep libevent)
#如果時間不對,需要修改系統時間
三、安裝memcached
wget http://memcached.org/files/memcached-1.4.21.tar.gz
$ tar xzvf memcached-1.4.15.tar.gz
$ cd memcached-1.4.15
$ ./configure --with-libevent=/usr
$ make
$ make install
安裝結果(ls -al /usr/local/bin/memcached)
四、啟動memcached
memcached -d -m 512 -p 11211 -u root -c 256 -P /var/run/memcached.pid
五、關閉防火牆11211埠
$ vi /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 11211 -j ACCEPT
$ service iptables restart
六、telnet訪問
然後就可以使用telnet,來測試memcache的連接狀態,如果沒有安裝telnet服務,可以執行
$ yum install telnet-server #安裝服務
$ yum install telnet #安裝命令
然後編輯vi /etc/xinetd.d/telnet文件,激活telnet,默認是禁用的,默認為yes,需要改成no
disable = no
然後重啟服務,執行命令
$ service xinetd restart
然後就可以測試memcached的連接,執行命令
$ telnet 127.0.0.1 11211
輸入stats,會輸出memcache的一些連接信息,包括PID
如果需要退出,則執行quit命令即可