什么是memcached:
简单来说,就是一个key:value的缓存服务器,可以存储众多的键值对数据。但本身无法
决定缓存任何数据。依赖于服务端和客户端。服务端提供了存储,检索的能力,客户端决定
缓存什么内容。关机内容消失。
memcached客户端决定存什么内容,怎么存,客户端指定缓存的时间。
例如:将http网页的缓存数据存入memcached,那么网页的URL就相当于key,页面数据就相当于value
memcached早期使用文本格式,现在即支持文本格式,又支持二进制格式。
memcached将所有内容缓存在内存中,最小不小于48bytes,最大不大于1M。
memcached使用增长因子growth factor来管理内存中空间的分配。memcached在内存中事先划分好
各种大小的内存区块,例如先划分48bytes,增长因子为2,那么接下来就划分96bytes的,如果要存80bytes
的数据,就存入划分大小为96bytes的区块中,这样便于内存管理。
当需要缓存的数据量太大时,可以使用分布式多个memcached来进行缓存,但是这些memcached之间并不相互通信。
那么如何让服务知道缓存在哪个memcached上呢?是使用key的校验码除以memcached总数取余得到的。
缺陷是当添加或删除一台时导致大量缓存失效。
一致性hash算法:
找一个环,其中有n个散列点分布在换上,范围1-2^32,然后将memcached服务器对应放在还上任意位置,
在缓存数据时,校验码对2^32取余,结果会分布在环上任意位置,按照顺时针找一个最近的服务器存储。
当一个服务器挂掉或添加时只影响部分数据。(逆时针到上一个服务器的范围受影响)
安装配置memcached:
官方站点:memcached.org
1.确保安装libevent
rpm -q libevent
2.下载memcached源码包,这里以memcached-1.4.15为例
3.解压缩:
tar xf memcached-1.4.15.tar.gz
4.编译安装:
cd memcached-1.4.15
./configure --prefix=/usr/local/memcached
##如果libevent没有用系统自带的需加上--with-libevent=安装位置
make && make install
5.查看memcached的工作属性参数:
/usr/local/memcached/bin/memcached -h
-l <ip_addr>:指定进程监听的地址;
-d: 以服务模式运行;
-u <username>:以指定的用户身份运行memcached进程;
-m <num>:用于缓存数据的最大内存空间,单位为MB,默认为64MB;
-c <num>:最大支持的并发连接数,默认为1024;
-p <num>: 指定监听的TCP端口,默认为11211;
-U <num>:指定监听的UDP端口,默认为11211,0表示关闭UDP端口;
-t <threads>:用于处理入站请求的最大线程数,仅在memcached编译时开启了支持线程才有效;
-f <num>:设定Slab Allocator定义预先分配内存空间大小固定的块时使用的增长因子;
-M:当内存空间不够使用时返回错误信息,而不是按LRU算法利用空间;
-n: 指定最小的slab chunk大小;单位是字节;
-S: 启用sasl进行用户认证;(编译时需要指定)
6.启动memcached:
/usr/local/memcached/bin/memcached -d -m 128 -n 20 -f 1.25 -vv -u nobody
##不加-d选项可以显示内存块分配过程
7.查看端口是否启动:
netstat -auntlp
##是否启动tcp和udp的11211端口
8.连接memcached:
yum install -y telnet
telnet localhost 11211
##当出现 <30 new auto-negotiating client connection 时链接成功
在链接界面可以输入stats来查看当前状态
9.memcached常用命令:
add添加新键:
格式:add keyname flag timeout datasize
add mykey 0 10 12
hello world!
##显示stored表示存储成功
get获取数据:
格式:get keyname
get mykey
##如果显示出mykey的值即hello,表示获取值成功。
##注意,这里设置失效时间为10秒,即10秒之后mykey键值对数据即失效,不会反回数据。如果分配给memcached的内存区块
还有位置,则不会从中清除,只是标记为失效。
10.服务启动脚本:
vim /etc/init.d/memcached
#!/bin/bash
# description: Distributed memory caching daemon
# processname: memcached
# config: /etc/sysconfig/memcached
. /etc/init.d/functions
## Default variables
PORT="11211"
USER="nobody"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS=""
[ -f /etc/sysconfig/memcached ] && . /etc/sysconfig/memcached
RETVAL=0
prog="/usr/local/memcached/bin/memcached"
desc="Distributed memory caching"
lockfile="/var/lock/subsys/memcached"
start() {
echo -n $"Starting $desc (memcached): "
daemon $prog -d -p $PORT -u $USER -c $MAXCONN -m $CACHESIZE $OPTIONS
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch $lockfile
return $RETVAL
}
stop() {
echo -n $"Shutting down $desc (memcached): "
killproc $prog
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f $lockfile
return $RETVAL
}
restart() {
stop
start
}
reload() {
echo -n $"Reloading $desc ($prog): "
killproc $prog -HUP
RETVAL=$?
echo
return $RETVAL
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
condrestart)
[ -e $lockfile ] && restart
RETVAL=$?
;;
reload)
reload
;;
status)
status $prog
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|condrestart|status}"
RETVAL=1
esac
exit $RETVAL
后期更改参数比较麻烦,所以这里建立memcached的配置文件,在这里更改方便。
vim /etc/sysconfig/memcached
PORT="11211"
USER="nobody"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS=""
chmod +x /etc/init.d/memcached
chkconfig --add memcached
perl语言调用memcached需要使用模块cache::memcached作为库。
php调用memcached需要安装扩展memcache,memcached(都是客户端库,第二个比较先进)
c/c++使用libmemcached,并且提供了命令行工具
memcached基于web接口的管理界面:memadmin,图形化界面分析命中率,管理缓存等。
php使用memcached:
1.安装php的memcached扩展
tar xf memcache-2.2.6.tar.gz
cd memcache-2.2.6
/usr/local/php/bin/phpize
./configure --with-php-configure=/usr/local/php/bin/php/bin/php-config \
--enable-memcache
make && make install
##注意安装好后提供的路径
mkdir /etc/php.d/
vim /etc/php.d/memcache.ini
extension=安装好后提示的路径/memcache.so
service php-fpm restart
2.对memcached功能进行测试:
在网站目录中建立测试页面test.php,添加如下内容:
<?php
$mem = new Memcache;
$mem->connect("127.0.0.1", 11211) or die("Could not connect");
$version = $mem->getVersion();
echo "Server's version: ".$version."<br/>\n";
$mem->set('testkey', 'Hello World', 0, 600) or die("Failed to save data at the memcached server");
echo "Store data in the cache (data will expire in 600 seconds)<br/>\n";
$get_result = $mem->get('testkey');
echo "$get_result is from memcached server.";
?>
##如果有输出“Hello World is from memcached.”等信息,则表明memcache已经能够正常工作。
nginx整合memcached:
直接将nginx中的数据缓存到memcached。
server {
listen 80;
server_name www.magedu.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
set $memcached_key $uri;
memcached_pass 127.0.0.1:11211;
default_type text/html;
error_page 404 @fallback ;
}
location @fallback {
proxy_pass http://172.16.0.1;
}
}
将php的session信息保存在memcached中:
前提:
1、配置各php支持使用memcache;
2、安装配置好memcached服务器,这里假设其地址为172.16.200.11,端口为11211
一、配置php将会话保存至memcached中
编辑php.ini文件,确保如下两个参数的值分别如下所示:
session.save_handler = memcache
session.save_path = "tcp://172.16.200.11:11211?persistent=1&weight=1&timeout=1&retry_interval=15"
persistent=1 持久连接
weight=1 权重
timeout=1 超时时间1秒
retry_interval=15 每隔15秒重试一次
service php-fpm restart
二、测试
新建php页面setsess.php,为客户端设置启用session:
<?php
session_start();
if (!isset($_SESSION['www.MageEdu.com'])) {
$_SESSION['www.MageEdu.com'] = time();
}
print $_SESSION['www.MageEdu.com'];
print "<br><br>";
print "Session ID: " . session_id();
?>
新建php页面showsess.php,获取当前用户的会话ID:
<?php
session_start();
$memcache_obj = new Memcache;
$memcache_obj->connect('172.16.200.11', 11211);
$mysess=session_id();
var_dump($memcache_obj->get($mysess));
$memcache_obj->close();
?>
<?php
// Generating cookies must take place before any HTML.
// Check for existing "SessionId" cookie
$session = $HTTP_COOKIE_VARS["SessionId"];
if ( $session == "" ) {
// Generate time-based unique id.
// Use user's IP address to make more unique.
$session = uniqid ( getenv ( "REMOTE_ADDR" ) );
// Send session id - expires when browser exits
SetCookie ( "SessionId", $session );
}
?>
<HTML>
<HEAD><TITLE>Session Test</TITLE></HEAD>
<BODY> <br> 16 Current session id: <?php echo $session ?>
</BODY></HTML>
memadmin图形管理工具安装:
1.unzip memadmin-master.zip
2.mv memadmin-master 网页主目录/mmaster
3.cd 网页主目录/mmaster
vim config.php
##在此指定用户名,密码,这里暂时保持默认
4.浏览器输入 ip/mmaster ,用户名,密码默认都是admin,进去之后左侧是服务器连接列表,
右侧添加连接,名字随意,host写memcached服务器ip,左侧选中,点击开始管理进入管理界面。
转载于:https://my.oschina.net/yongzheli/blog/665932