高性能內(nèi)存對(duì)象緩存 Memcached
Memcached 概述
-
一套開源的高性能分布式內(nèi)存對(duì)象緩存系統(tǒng)
-
所有的數(shù)據(jù)都存儲(chǔ)在內(nèi)存中
-
支持任意存儲(chǔ)類型的數(shù)據(jù)
-
提高網(wǎng)站的訪問速度
Memcached 是典型的 C/S 架構(gòu),因此需要安裝 Memcached 服務(wù)端與 Memcached API 客戶端。
數(shù)據(jù)存儲(chǔ)方式與數(shù)據(jù)過期方式
①數(shù)據(jù)存儲(chǔ)方式: Slab Allocation
-
按組分配內(nèi)存,每次先分配一個(gè)Slab,相當(dāng)于一個(gè)大小為 1M 的頁,然后在 1M 的空間里根據(jù)數(shù)據(jù)劃分大小相同的 Chunk
-
能夠有效解決內(nèi)存碎片問題,但是對(duì)內(nèi)存空間會(huì)有所浪費(fèi)
②數(shù)據(jù)過期方式
-
LRU: 數(shù)據(jù)空間不足時(shí),會(huì)根據(jù) LRU 的情況淘汰最近最少使用的記錄
-
Laxzy Expiration: 情性過期,是指使用 get 時(shí)查看記錄時(shí)間,從而檢查記錄是否已經(jīng)過期
Memcached緩存機(jī)制
當(dāng)程序?qū)懭刖彺鏀?shù)據(jù)請(qǐng)求時(shí),Memcached 的 API 接口將 Key 輸入路由算法模塊路由到集群中一臺(tái)服務(wù),之后由 API 接口與服務(wù)器進(jìn)行通信,完成一次分布式緩存寫入
Memcached分布式
要依賴于 Memcached 的客戶端來實(shí)現(xiàn)
多個(gè) Memcached 服務(wù)器是獨(dú)立的
分布式數(shù)據(jù)如何存儲(chǔ)是由路由算法所決定
當(dāng)數(shù)據(jù)到達(dá)客戶端程序庫時(shí),客戶端的算法就依據(jù)路由算法來決定保存的 Memcached 服務(wù)器。
讀取數(shù)據(jù)時(shí),客戶端依據(jù)保存數(shù)據(jù)時(shí)的路由算法選中和存儲(chǔ)數(shù)據(jù)時(shí)相同的服務(wù)器來讀取數(shù)據(jù)。
Memcached 路由算法
①求余數(shù) hash 算法
-
先用 key 做 hash 運(yùn)算得到一個(gè)整數(shù),再做hash算法,根據(jù)余數(shù)進(jìn)行路由·
-
適合大多數(shù)據(jù)需求,但是不適合用在動(dòng)態(tài)變化的環(huán)境
②一致性 hash 算法
- 按照 hash 算法把對(duì)應(yīng)的 key 通過一定的 hash 算法處理后映射形成一個(gè)首尾相接閉合循環(huán),然后通過使用與對(duì)象存儲(chǔ)一樣的 hash 算法將機(jī)器也映射到環(huán)中,順時(shí)針方向計(jì)算將所有對(duì)象存儲(chǔ)到里自己最近的機(jī)器中
- 適合在動(dòng)態(tài)變化的環(huán)境中使用
安裝 Memcached 服務(wù)器
1 源碼安裝 Libevent
Libevent 是一款跨平臺(tái)的時(shí)間處理接口的封裝,可以兼容多個(gè)操作系統(tǒng)的事件訪問。
Memcached 的安裝依賴于 Libevent ,因此需要先安裝 Libevent 。
# 源碼包
libevent-2.1.8-stable.tar.gz
tar -zxvf libevent-2.1.8-stable.tar.gz
cd libevent-2.1.8-stable/
./configure --prefix=/usr/local/libevent
make
make install
2 源碼安裝 Memcached
# 源碼包
memcached-1.5.1.tar.gz
tar zxf memcached-1.5.1.tar.gz
cd memcached-1.5.1/
./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent
make
make install
3 Memcached 服務(wù)優(yōu)化
路徑優(yōu)化
ln -s /usr/local/memcached/bin/* /usr/local/bin/
服務(wù)啟動(dòng)命令
memcached -d -m 128 -u root -l 127.0.0.1 -p 11211 -c 1024 -P /usr/local/memcached/memcached.pid
-p <num> 要監(jiān)聽的TCP端口號(hào)(默認(rèn)值:11211)
-U <num> 要監(jiān)聽的UDP端口號(hào)(默認(rèn)值:11211,0關(guān)閉)
-s <file> 要監(jiān)聽的unix套接字路徑(禁用網(wǎng)絡(luò)支持)
-P <file> PID 文件路徑
-l <ip_addr> 要監(jiān)聽的接口,默認(rèn)為環(huán)境變量 INDRR_ANY 的值
-d 作為守護(hù)進(jìn)程運(yùn)行
-r 最大化核心文件限制
-u <username> 假設(shè) username 的身份(僅當(dāng)以root身份運(yùn)行時(shí))
-m <num> 用于項(xiàng)目的最大內(nèi)存(兆字節(jié)),默認(rèn)為64 MB
-M 內(nèi)存耗盡時(shí)返回錯(cuò)誤(而不是刪除項(xiàng)目)
-c <num> 最大同時(shí)連接數(shù),默認(rèn)值為1024
-k 鎖定所有分頁的內(nèi)存。請(qǐng)注意,有一個(gè)限制您可以鎖定的內(nèi)存量。正在嘗試分配更多的資源會(huì)失敗,所以一定要為您啟動(dòng) 的用戶正確設(shè)置限制帶有(不適用于-u <username> 用戶;
確定服務(wù)是否啟動(dòng)
netstat -anpt | grep 11211
拓展:建立 Memcached 服務(wù)啟動(dòng)腳本
vim /etc/init.d/memcached
#!/bin/bash
#description: Memcached Service Daemon
#processname: Memcached
#chkconfig: 2345 90 50
#Source function library.
. /etc/rc.d/init.d/functions
. /etc/sysconfig/network
memcached_exec="/usr/local/bin/memcached"
memcached_pid="/var/run/memcached.pid"
lockfile="/var/lock/subsys/memcached"
prog="memcached"
memcached_host="127.0.0.1"
memcached_port=11211
memcached_memory="1024"
start() {
if [ $UID -ne 0 ]; then
echo "User has insufficient privilege."
exit 4
fi
[ -x $memcached_exec ] || exit 5
echo -n $"starting $prog: "
daemon $memcached_exec -u daemon -d -m $memcached_memory -l $memcached_host -p $memcached_port -c 256 -P $memcached_pid
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
}
stop() {
if [ $UID -ne 0 ]; then
echo "User has insufficient privilege."
exit 4
fi
echo -n $"Stopping $prog: "
if [ -n "`pidfileofproc $memcached_exec`" ]; then
killproc $memcached_exec
else
failure $"stopping $prog"
fi
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
}
status() {
# run checks to determine if the service is running or use generic status
status $prog
}
case "$1" in
"start")
start
;;
"stop")
stop
;;
"restart")
stop
sleep 3
start
;;
"status")
status
;;
*)
echo $"Usage: $0 {start|stop|status|restart}"
exit 1
;;
esac
exit $?
# 添加執(zhí)行權(quán)限
chmod +x /etc/init.d/memcached
# 查看memcached服務(wù)是否在chkconfig管理列表:
chkconfig --list memcached
# 將其加入chkconfig管理:
chkconfig --add memcached
# 在執(zhí)行等級(jí)2,3,5開啟memcached系統(tǒng)服務(wù)
# linux系統(tǒng)執(zhí)行等級(jí)為0-6級(jí)。0代表關(guān)機(jī),1是單用戶模式,2是多用戶狀態(tài),3是完整的多用戶模式(有NFS),4是暫時(shí)沒有啟用的保留等級(jí),5是圖形工作模式,6是系統(tǒng)正常關(guān)閉并重啟。
chkconfig --level 235 memcached on
# memcached服務(wù)啟動(dòng)
chkconfig --list | grep memcached
service memcached start
service memcached stop
service memcached restart
Memcached 數(shù)據(jù)庫操作與管理
Memcached 協(xié)議簡(jiǎn)單,可直接使用 telnet 連接 Memcached 的 11211 端口。
# telnet默認(rèn)沒有安裝,需要自行安裝
yum -y install telnet
[root@localhost ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
// 輸入操作指令
查看版本
version
操作命令格式
<command name><key><flags><exptime><bytes><data block>
常見操作指令
1 添加一條鍵值數(shù)據(jù) add
add username 0 0 7
1234567
STORED
——————————————
其中add username 0 0 7
username 鍵值名
第一個(gè)0 表示自定義信息為0
第二個(gè)0 表示過期時(shí)間為0;0表示永不過期,單位秒
7 表示字計(jì)數(shù)
1234567 是鍵值,注意輸入長(zhǎng)度為7字節(jié),與設(shè)定值相符合
2 查詢鍵值數(shù)據(jù) get
get username
VALUE username 0 7
1234567
END
如果需要檢查最近是否更新,可以使用命令 gets ,最后一位顯示的是更新因子,每更新一次更新因子數(shù)加1.
gets username
VALUE username 0 7 1
1234567
END
3 更新一條鍵值數(shù)據(jù) set
set 后跟需要更新的鍵值名、標(biāo)記位、過期時(shí)間、字節(jié)數(shù)。
如果鍵值名不存在, set 相當(dāng)于 add
set username 0 0 5
12345
STORED
get username
VALUE username 0 5
12345
END
如果僅是單純地更新,使用 replace ;此時(shí)更新的鍵值名必須存在,如果不存在,則會(huì)報(bào)錯(cuò) NOT_STORED
replace username 0 0 6
123456
STORED
replace abc 0 0 3
123
NOT_STORED
4 清除一條緩存數(shù)據(jù) delete
delete username
DELETED
get username
END
使用 delete 刪除一條鍵值為 username 的緩存數(shù)據(jù),使用 get 產(chǎn)看發(fā)現(xiàn)沒有內(nèi)容存在
5 檢查后更新 cas
如果 cas 的最后一個(gè)更新因子數(shù)與 gets 返回的更新因子數(shù)相等,則更新;否則返回 EXISTS。
add username 0 0 7 // 新增一條鍵值
1234567
STORED
gets username // 查詢 usernaem 鍵值
VALUE username 0 7 4 // 更新因子數(shù):4
1234567
END
cas username 0 0 7 1 // 輸入一個(gè)與 gets 查詢的更新因子不同的更新因子數(shù)
abcdefg
EXISTS // 報(bào)錯(cuò)
cas username 0 0 7 4 // 輸入更新因子數(shù)4
abcdefg
STORED // 檢查并更新成功
get username // 查詢
VALUE username 0 7
abcdefg // 鍵值已經(jīng)改變
END
6 追加數(shù)據(jù) append/prepend
append username 0 0 5 // 向后追加 5 字節(jié)
12345
STORED
get username
VALUE username 0 12
abcdefg12345
END
prepend username 0 0 2 // 向前追加 2 字節(jié)
AB
STORED
get username
VALUE username 0 14
ABabcdefg12345
END
7 清除所有緩存數(shù)據(jù) flush_all
flush_all
OK
get username
END
8 查看服務(wù)器統(tǒng)計(jì)數(shù)據(jù) stats
stats
stats items //返回所有鍵值對(duì)統(tǒng)計(jì)信息
stats cachedump 1 0 //返回指定存儲(chǔ)空間的鍵值對(duì)
stats slabs //顯示各個(gè) slab 的信息,包括 chunk 的大小、數(shù)目、使用情況等
stats sizes //輸出所有 item 的大小和個(gè)數(shù)
stats reset //清空統(tǒng)計(jì)數(shù)據(jù)
安裝配置基于PHP的 Memcached API 客戶端
Memcache支持多客戶端,如perl,php,python,c/c++等等,這里主要基于php配置
我這里的搭建是基于已經(jīng)源碼安裝完成 nginx 和 php;建議使用 LNMP 環(huán)境
① 安裝 Libmemcached 庫
Libmemcached 庫提供的 API 與 Memcached 服務(wù)端進(jìn)行交互
memcached 在1.2.4版本(含)以上增加了 CAS(Check and Set) 協(xié)議,即對(duì)同一 key 的多進(jìn)程的并發(fā)處理問題
類比數(shù)據(jù)庫,如果同時(shí)有多個(gè)進(jìn)程對(duì)同一張表的同一數(shù)據(jù)進(jìn)行更新,數(shù)據(jù)庫可以鎖定整張表,也可以鎖定表內(nèi)某一行數(shù)據(jù),memcached 的 CAS 功能與此相似;
但 php-memcache 擴(kuò)展不支持 CAS,需要先安裝 php-memcached 擴(kuò)展(注意與php-memcache擴(kuò)展的區(qū)別),php-memcached 擴(kuò)展基于 libmemcached,所以要先安裝 libmemcached,即php-memcached的庫。
# libmemcached版本:1.0.18
libmemcached-1.0.18.tar.gz
# 下載
wget https://launchpadlibrarian.net/165454254/libmemcached-1.0.18.tar.gz
# 編譯安裝,生成Makefile文件時(shí),切記“--with-memcached”參數(shù)
[root@localhost ~]# tar xf libmemcached-1.0.18.tar.gz
[root@localhost ~]# cd libmemcached-1.0.18
[root@localhost libmemcached-1.0.18]# ./configure --prefix=/usr/local/libmemcached --with-memcached
[root@localhost libmemcached-1.0.18]# make && make install
②安裝php-memcached,即 Memcached 擴(kuò)展
編譯安裝 PHP 的 Memcached 拓展組件
# 安裝包
# php-memcached版本:2.2.0(3.0.0及以上版本針對(duì)php7.0及以上版本)
memcached-2.2.0.tgz
# 下載
wget http://pecl.php.net/get/memcached-2.2.0.tgz
需要注意的是,在配置 Memcached API 時(shí),memcached-2.2.0.tgz 源碼包中默認(rèn)沒有 configure 配置腳本,需要使用 PHP 的 phpize 腳本生成配置腳本 configure
phpize: 用于擴(kuò)展 php 模塊,通過 phpize 可以建立 php 的外掛模塊;位于 php 安裝目錄下 bin 目錄下面
[root@localhost ~]# tar xf memcached-2.2.0.tgz
[root@localhost ~]# cd memcached-2.2.0
[root@localhost memcached-2.2.0]# /usr/local/php5/bin/phpize
Configuring for:
PHP Api Version: 20121113
Zend Module Api No: 20121212
Zend Extension Api No: 220121212
[root@localhost memcached-2.2.0]# ./configure --enable-memcached --with-php-config=/usr/local/php5/bin/php-config --with-libmemcached-dir=/usr/local/libmemcached --disable-memcached-sasl # --disable-memcached-sasl 關(guān)閉 Memcahced 的 SASL 認(rèn)證功能,否則報(bào)錯(cuò)
[root@localhost memcached-2.2.0]# make && makeinstall
Installing shared extensions: /usr/local/php5/lib/php/extensions/no-debug-non-zts-20121212/ # 安裝完成后,會(huì)提示一個(gè)共享組件的位置
③安裝 php-memcache
# php-memcached版本:2.2.7(stable version)
memcache-2.2.7.tgz
# 下載php-memcache
wget http://pecl.php.net/get/memcache-2.2.7.tgz
[root@localhost ~]# tar xf memcache-2.2.7.tgz
[root@localhost ~]# cd memcache-2.2.7
[root@localhost memcache-2.2.7]# ./configure --enable-memcache --with-php-config=/usr/local/php5/bin/php-config
[root@localhost memcache-2.2.7]# make && make install
Installing shared extensions: /usr/local/php5/lib/php/extensions/no-debug-non-zts-20121212/
④安裝 php-intl (原生擴(kuò)展樣例,非必須項(xiàng))
# php-intl版本:3.0.0
# 下載
wget http://pecl.php.net/get/intl-3.0.0.tgz
# 通過查看 php 源碼解壓包下的“ext/”目錄,php-intl 屬于原生擴(kuò)展,理論上可以不用下載,直接在“ext/”下相應(yīng)擴(kuò)展目錄下編譯安裝即可;
php-intl 是 php 國(guó)際化擴(kuò)展,是 ICU 庫的一個(gè)包裝器,安裝 php-intl 擴(kuò)展前要先安裝 ICU 庫
[root@localhost ~]# yum install -y icu libicu libicu-devel
[root@localhost ~]# cd /usr/local/php-5.5.24/ext/intl
// 進(jìn)入到php源碼解壓包 intl 所在目錄
[root@localhost intl]# /usr/local/php5/bin/phpize
[root@localhost intl]# ./configure --enable-intl --with-php-config=/usr/local/php5/bin/php-config
[root@localhost intl]# make && make install
Installing shared extensions: /usr/local/php5/lib/php/extensions/no-debug-non-zts-20121212/
⑤配置 PHP,啟動(dòng)拓展
php啟用擴(kuò)展有2種方式(本文介紹方式1):
(1)直接在php.ini文件中添加擴(kuò)展如“extension = xxx.so”;
(2)單獨(dú)創(chuàng)建ini文件,然后php.ini調(diào)用這些創(chuàng)建的文件即可(可通過php5enmod工具支持或者手工配置)。
這里采用第一種:編輯 PHP 配置文件vim /usr/local/php5/php.ini
[Intl]
extension = intl.so # 相對(duì)路徑
[Memcached]
extension = memcached.so
extension_dir = "/usr/local/php5/lib/php/extensions/no-debug-non-zts-20121212/"
[Memcache]
extension = "/usr/local/php5/lib/php/extensions/no-debug-non-zts-20121212/memcache.so"
# 絕對(duì)路徑
⑥驗(yàn)證拓展是否安裝成功
# 重啟 nginx
systemctl restart nginx
# 重啟 php-fpm
pkill php-fpm
/usr/local/php5/sbin/php-fpm
查看拓展模塊
[root@localhost ~]# /usr/local/php5/bin/php -m | grep -E 'memcache|intl'
intl
memcache
memcached
phpinfo() 方式,利用前面已經(jīng)生成的 index.php 文件即可
⑦ 測(cè)試 Memcached API 功能
通過編寫簡(jiǎn)單的 PHP 測(cè)試代碼調(diào)用 Memcache 程序接口,來測(cè)試是否與 Memcached 服務(wù)器協(xié)同工作
<?php
$memcache = new Memcache; #創(chuàng)建一個(gè)memcache對(duì)象
$memcache->connect('192.168.153.132', 11211) or die ("Could not connect");
#連接 memcached1 服務(wù)器
$memcache->set('key', 'memcache-test'); #設(shè)置1個(gè)變量到內(nèi)存中,key=key, value=memcache-test
$get_value = $memcache->get('key'); #從內(nèi)存取出key的value
echo $get_value; #回顯
?>
Keepalived+Memcached實(shí)現(xiàn)主主復(fù)制和高可用
Memcached 主主復(fù)制是指在任意一臺(tái) Memcached 服務(wù)器修改數(shù)據(jù)都會(huì)被同步到另外一臺(tái),但是 Memcached API客戶端是無法判斷連接到哪一臺(tái) Memcached 服務(wù)器的,所以需要設(shè)置 VIP 地址,提供給 Memcached API客戶端進(jìn)行連接??梢允褂胟eepalived 產(chǎn)生的 VIP 地址連接主 Memcached 服務(wù)器,并且提供高可用架構(gòu)。
案例環(huán)境
Memcached 主主復(fù)制架構(gòu)
Memcached 的復(fù)制功能支持多個(gè) Memcached 之間進(jìn)行相互復(fù)制(雙向復(fù)制,主備都是可讀可寫的),可以解決 Memcached 的容災(zāi)問題。
要使用 Memcached 復(fù)制架構(gòu),需要重新下載支持復(fù)制功能的 Memcached 安裝包。
官網(wǎng)地址:http://downloads.sourceforge.net/repcached/memcached-1.2.8-repcached-2.2.tar.gz
①安裝帶有復(fù)制功能的 Memcached
安裝與之前的 Memcached 方法相同,同樣在安裝完成 Libevent 之后
# 安裝包
memcached-1.2.8-repcached-2.2.1.tar.gz
[root@localhost ~]# tar xf memcached-1.2.8-repcached-2.2.1.tar.gz
[root@localhost ~]# cd memcached-1.2.8-repcached-2.2.1/
[root@localhost memcached-1.2.8-repcached-2.2.1]# ./configure --prefix=/usr/local/memcached_replication --with-libevent=/usr/local/libevent --enable-replication
[root@localhost memcached-1.2.8-repcached-2.2.1]# make && make install
make時(shí)報(bào)錯(cuò):memcached.c:697:30: 錯(cuò)誤:‘IOV_MAX’未聲明(在此函數(shù)內(nèi)第一次使用) if (m->msg_iovlen == IOV_MAX ||
提示需要修改memcached.c
文件
/* FreeBSD 4.x doesn't have IOV_MAX exposed. */
#ifndef IOV_MAX
#if defined(__FreeBSD__) || defined(__APPLE__)
# define IOV_MAX 1024
#endif
#endif
改成:
/* FreeBSD 4.x doesn't have IOV_MAX exposed. */
#ifndef IOV_MAX
# define IOV_MAX 1024
#endif
②啟動(dòng) Memcached 服務(wù)
支持復(fù)制功能的 Memcached 安裝完成之后,需要將編譯安裝的 libevent-2.1.so.6.0.2 模塊復(fù)制到 /usr/lib64 目錄下,否則在啟動(dòng)帶有復(fù)制功能的 Memcached 服務(wù)時(shí)可能不成功
ln -s /usr/local/libevent/lib/libevent-2.1.so.6.0.2 /usr/lib64/libevent-2.1.so.6
啟動(dòng)服務(wù)時(shí),使用 -x 選項(xiàng)指向?qū)Χ?/p>
/usr/local/memcached_replication/bin/memcached -d -u root -m 128 -x 192.168.153.133
# 另一臺(tái)服務(wù)器
/usr/local/memcached_replication/bin/memcached -d -u root -m 128 -x 192.168.153.132
查看服務(wù)是否啟動(dòng)
[root@localhost ~]# netstat -anpt | grep memcached
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 9502/memcached
tcp 0 0 0.0.0.0:11212 0.0.0.0:* LISTEN 9502/memcached
tcp6 0 0 :::11211 :::* LISTEN 9502/memcached
③ 使用 telnet 簡(jiǎn)單驗(yàn)證復(fù)制功能
在其中一臺(tái) Memcached 上插入一條數(shù)據(jù),在另一臺(tái)服務(wù)器中可以查看到剛剛插入的數(shù)據(jù)。反之亦然。
Memcached 主主復(fù)制 + Keepalived 高可用架構(gòu)
①安裝 keepalived
yum -y install keepalived
②配置主 keepalived
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_instance VI_mem {
state MASTER
interface ens34
virtual_router_id 51
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { // 定義VIP地址
192.168.153.200
}
}
③配置備 keepalived
global_defs {
router_id LVS_DEVEL_2 // 與主機(jī)區(qū)分
}
vrrp_instance VI_mem {
state BACKUP // 備 keepalived
interface ens34
virtual_router_id 51
priority 99 // 優(yōu)先級(jí)低于 MASTER
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.153.200
}
}
④測(cè)試驗(yàn)證
分別啟動(dòng)主從 keepalived 服務(wù)
systemctl start keepalived
使用命令ip a
驗(yàn)證主 keepalived 獲取 VIP 地址
關(guān)閉 Memcached1 服務(wù)器的 Memcached 服務(wù),使用命令ip a
在 Memcached2 服務(wù)器上查看地址信息,驗(yàn)證高可用
Memcached 與 MySQL 數(shù)據(jù)同步
采用MySQL Memcached UDF(User Defined Functions)方法
mysql memcached UDF 其實(shí)就是通過 libmemcached 來使用 memcache 的一系列函數(shù),通過這些函數(shù),你能對(duì) memcache 進(jìn)行g(shù)et, set, cas, append, prepend, delete, increment, decrement objects操作,如果我們通過 mysql trigger 來使用這些函數(shù),那么就能通過 mysql 更好的、更自動(dòng)的管理 memcache !
①libmemcached-0.34與memcached_functions_mysql-1.1配對(duì)進(jìn)行安裝
# 源碼包
libmemcached-0.34.tar.gz
——————————————————————————————————————————————
[root@localhost ~]# tar xf libmemcached-0.34.tar.gz
[root@localhost ~]# cd libmemcached-0.34/
[root@localhost libmemcached-0.34]# ./configure --prefix=/usr/local/libmemcached --with-memcached
[root@localhost libmemcached-0.34]# make && make install
# 源碼包
memcached_functions_mysql-1.1.tar.gz
——————————————————————————————————————————————
[root@localhost ~]# tar xf memcached_functions_mysql-1.1.tar.gz
[root@localhost ~]# cd memcached_functions_mysql-1.1/
[root@localhost memcached_functions_mysql-1.1]# ./configure --with-mysql=/usr/local/mysql/bin/mysql_config --with-libmemcached=/usr/local/libmemcached/
[root@localhost memcached_functions_mysql-1.1]# make && make install
②拷貝 lib 文件到 mysql 的 plugin 下面
cp /usr/local/lib/libmemcached_functions_mysql.* /usr/local/mysql/lib/plugin/
cp /usr/local/lib/libmemcached_functions_mysql.* /usr/lib64/mysql/plugin/
③往 MySQL 添加 memcache UDF 函數(shù)
一共有兩種方法:
1、在MySQL里執(zhí)行 source install_functions.sql
source /home/username/(memcached_functions_mysql-1.1源碼路徑)/sql/ install_functions.sql
————————————————————————————————————————
mysql> source /root/memcached_functions_mysql-1.1/sql/install_functions.sql
2、在linux主機(jī)執(zhí)行mysql <sql/install_functions.sql
# /usr/local/mysql/bin/mysql < /home/username/(memcached_functions_mysql-1.1源碼路徑)/sql/ install_functions.sql
————————————————————————————————————————
[root@localhost ~]# mysql -u root -p123456 < /root/memcached_functions_mysql-1.1/sql/install_functions.sql
查看函數(shù)是否添加成功:在 MySQL 中使用select * from mysql.func;
查看
④測(cè)試 MySQL 與 memcached 能否建立連接
在建立數(shù)據(jù)庫觸發(fā)器之前,需要先測(cè)試 MySQL 與 memcached 能否建立連接
mysql> select memc_servers_set('192.168.153.200:11211'); // 使用 VIP 地址
mysql> select memc_server_count();
mysql> select memc_set('test','1234567');
mysql> select memc_get('test');
連接到 memcached 查看數(shù)據(jù),因?yàn)橛兄髦鲝?fù)制,隨意連接一個(gè)
[root@localhost ~]# telnet 192.168.153.133 11211
Trying 192.168.153.133...
Connected to 192.168.153.133.
Escape character is '^]'.
get test
VALUE test 0 7
1234567
END
⑤創(chuàng)建數(shù)據(jù)庫觸發(fā)器
要先創(chuàng)建數(shù)據(jù)庫,在數(shù)據(jù)庫中創(chuàng)建觸發(fā)器
1)新建一個(gè)數(shù)據(jù)庫 test123 以及表 tab1
mysql> create database test123;
Query OK, 1 row affected (0.00 sec)
mysql> use test123;
Database changed
mysql> create table tab1(id int not null, name varchar(32) not null, primary key (id));
Query OK, 0 rows affected (0.04 sec)
2)在 test123 創(chuàng)建觸發(fā)器
mysql> delimiter $
mysql> create trigger tab1_insert_memc // 插入數(shù)據(jù)
-> before insert on tab1
-> for each row begin
-> set @m=memc_set(NEW.id,NEW.name);
-> end$
Query OK, 0 rows affected (0.01 sec)
mysql> create trigger tab1_update_memc // 更新數(shù)據(jù)
-> before update on tab1
-> for each row begin
-> set @m=memc_replace(OLD.id,NEW.name);
-> end$
Query OK, 0 rows affected (0.00 sec)
mysql> create trigger tab1_delete_memc // 刪除數(shù)據(jù)
-> before delete on tab1
-> for each row begin
-> set @m=memc_delete(OLD.id);
-> end$
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
3)測(cè)試觸發(fā)器
連接 memcached 服務(wù)器進(jìn)行數(shù)據(jù)測(cè)試
mysql> select memc_servers_set('192.168.153.200:11211');
+-------------------------------------------+
| memc_servers_set('192.168.153.200:11211') |
+-------------------------------------------+
| 0 |
+-------------------------------------------+
1 row in set (0.00 sec)
向 tab1 插入數(shù)據(jù),并查看結(jié)果
mysql> insert into tab1 value('1','1111aaaaff');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> insert into tab1 value('2','lisa');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> select * from tab1;
+----+------------+
| id | name |
+----+------------+
| 1 | 1111aaaaff |
| 2 | lisa |
+----+------------+
2 rows in set (0.00 sec)
連接 Memcached 查看數(shù)據(jù)
[root@localhost ~]# telnet 192.168.153.133 11211
Trying 192.168.153.133...
Connected to 192.168.153.133.
Escape character is '^]'.
get 1
VALUE 1 0 10
1111aaaaff
END
get 2
VALUE 2 0 4
lisa
END
更新 tab1 表的數(shù)據(jù)
mysql> update tab1 set name='tom' where id=1;
Query OK, 1 row affected, 1 warning (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 1
mysql> select * from tab1;
+----+------+
| id | name |
+----+------+
| 1 | tom |
| 2 | lisa |
+----+------+
2 rows in set (0.00 sec)
連接 Memcached 查看數(shù)據(jù)
get 1
VALUE 1 0 3
tom
END
get 2
VALUE 2 0 4
lisa
END
刪除 tab1 表中的數(shù)據(jù)文章來源:http://www.zghlxwxcb.cn/news/detail-555679.html
mysql> delete from tab1 where id = 1;
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> select * from tab1;
+----+------+
| id | name |
+----+------+
| 2 | lisa |
+----+------+
1 row in set (0.00 sec)
連接 Memcached 查看數(shù)據(jù)文章來源地址http://www.zghlxwxcb.cn/news/detail-555679.html
get 1
END
get 2
VALUE 2 0 4
lisa
END
in set (0.00 sec)
連接 Memcached 查看數(shù)據(jù)
```bash
[root@localhost ~]# telnet 192.168.153.133 11211
Trying 192.168.153.133...
Connected to 192.168.153.133.
Escape character is '^]'.
get 1
VALUE 1 0 10
1111aaaaff
END
get 2
VALUE 2 0 4
lisa
END
更新 tab1 表的數(shù)據(jù)
mysql> update tab1 set name='tom' where id=1;
Query OK, 1 row affected, 1 warning (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 1
mysql> select * from tab1;
+----+------+
| id | name |
+----+------+
| 1 | tom |
| 2 | lisa |
+----+------+
2 rows in set (0.00 sec)
連接 Memcached 查看數(shù)據(jù)
get 1
VALUE 1 0 3
tom
END
get 2
VALUE 2 0 4
lisa
END
刪除 tab1 表中的數(shù)據(jù)
mysql> delete from tab1 where id = 1;
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> select * from tab1;
+----+------+
| id | name |
+----+------+
| 2 | lisa |
+----+------+
1 row in set (0.00 sec)
連接 Memcached 查看數(shù)據(jù)
get 1
END
get 2
VALUE 2 0 4
lisa
END
到了這里,關(guān)于高性能內(nèi)存對(duì)象緩存 Memcached的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!