memcached缓存数据库

来源:互联网 发布:53端口攻击 编辑:程序博客网 时间:2024/05/16 12:11

什么是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下载

官方站点:http://www.memcached.org


安装配置memcached

下载memcached源码包,这里以memcached-1.4.15为例

确保安装libevent

rpm -q libevent

解压缩

tar xf memcached-1.4.15.tar.gz

编译安装

cd memcached-1.4.15./configure --prefix=/usr/local/memcachedmake && make install

如果libevent没有用系统自带的需加上–with-libevent=安装位置

查看memcached的工作属性参数

/usr/local/memcached/bin/memcached -h

-l :指定进程监听的地址;
-d: 以服务模式运行;
-u :以指定的用户身份运行memcached进程;
-m :用于缓存数据的最大内存空间,单位为MB,默认为64MB;
-c :最大支持的并发连接数,默认为1024;
-p : 指定监听的TCP端口,默认为11211;
-U :指定监听的UDP端口,默认为11211,0表示关闭UDP端口;
-t :用于处理入站请求的最大线程数,仅在memcached编译时开启了支持线程才有效;
-f :设定Slab Allocator定义预先分配内存空间大小固定的块时使用的增长因子;
-M:当内存空间不够使用时返回错误信息,而不是按LRU算法利用空间;
-n: 指定最小的slab chunk大小;单位是字节;
-S: 启用sasl进行用户认证;(编译时需要指定)

启动memcached

/usr/local/memcached/bin/memcached  -d -m 128 -n 20 -f 1.25 -vv -u nobody不加-d选项可以显示内存块分配过程

不加-d选项可以显示内存块分配过程

查看端口是否启动

netstat -auntlp

是否启动tcp和udp的11211端口

连接memcached

yum install -y telnettelnet localhost 11211

当出现 <30 new auto-negotiating client connection 时链接成功
在链接界面可以输入stats来查看当前状态


memcached常用命令

add添加新键

格式:add keyname flag timeout datasize

add mykey 0 10 12hello world! //显示stored表示存储成功

get获取数据

格式:get keyname

get mykey //如果显示出mykey的值即hello,表示获取值成功。

注意,这里设置失效时间为10秒,即10秒之后mykey键值对数据即失效,不会反回数据。如果分配给memcached的内存区块还有位置,则不会从中清除,只是标记为失效。


服务启动脚本

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/memcachedchkconfig --add memcached

perl语言调用memcached需要使用模块cache::memcached作为库。
php调用memcached需要安装扩展memcache,memcached(都是客户端库,第二个比较先进)
c/c++使用libmemcached,并且提供了命令行工具

memcached基于web接口的管理界面:memadmin,图形化界面分析命中率,管理缓存等。


php使用memcached

安装php的memcached扩展

tar xf memcache-2.2.6.tar.gzcd memcache-2.2.6/usr/local/php/bin/phpize./configure --with-php-configure=/usr/local/php/bin/php/bin/php-config \                    --enable-memcachemake && make install

注意安装好后提供的路径

mkdir /etc/php.d/vim /etc/php.d/memcache.ini            extension=安装好后提示的路径/memcache.soservice php-fpm restart

对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.test.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.ini文件,确保如下两个参数的值分别如下所示:

session.save_handler = memcachesession.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

<?phpsession_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:

<?phpsession_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 exitsSetCookie ( "SessionId", $session );}?><HTML><HEAD><TITLE>Session Test</TITLE></HEAD><BODY> <br> 16 Current session id: <?php echo $session ?></BODY></HTML>

memadmin图形管理工具安装

unzip memadmin-master.zipmv memadmin-master 网页主目录/mmastercd 网页主目录/mmastervim config.php//在此指定用户名,密码,这里暂时保持默认 

浏览器输入 ip/mmaster ,用户名,密码默认都是admin,进去之后左侧是服务器连接列表,右侧添加连接,名字随意,host写memcached服务器ip,左侧选中,点击开始管理进入管理界面。

0 0