天天看点

memcached缓存数据库

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

解压缩

编译安装

cd memcached
./configure --prefix=/usr/local/memcached
make && make install
           
如果libevent没有用系统自带的需加上–with-libevent=安装位置

查看memcached的工作属性参数

-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  -n  -f  -vv -u nobody
不加-d选项可以显示内存块分配过程
           
不加-d选项可以显示内存块分配过程

查看端口是否启动

是否启动tcp和udp的11211端口

连接memcached

yum install -y telnet
telnet localhost 
           

当出现 <30 new auto-negotiating client connection 时链接成功

在链接界面可以输入stats来查看当前状态

memcached常用命令

add添加新键

格式:add keyname flag timeout datasize
add mykey   
hello 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=
            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  ] && touch $lockfile
                    return $RETVAL
            }

            stop() {
                    echo -n $"Shutting down $desc (memcached): "
                    killproc $prog
                    RETVAL=$?
                    echo
                    [ $RETVAL -eq  ] && 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=
            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

安装php的memcached扩展

tar xf memcache-.tar.gz
cd memcache-
/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
           

对memcached功能进行测试

在网站目录中建立测试页面test.php,添加如下内容
<?php
        $mem = new Memcache;
        $mem->connect("127.0.0.1", )  or die("Could not connect");

        $version = $mem->getVersion();
        echo "Server's version: ".$version."<br/>\n";

        $mem->set('testkey', 'Hello World', , ) 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       ;
        server_name  www.test.com;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
                set $memcached_key $uri;
                memcached_pass     ;
                default_type       text/html;
                error_page          @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 = memcache
session.save_path = "tcp://172.16.200.11:11211?persistent=1&weight=1&timeout=1&retry_interval=15"
    persistent=  //持久连接
    weight=    //权重
    timeout=    //超时时间1秒
    retry_interval=    //每隔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', );
$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>  Current session id: <?php echo $session ?>
</BODY></HTML>
           

memadmin图形管理工具安装

unzip memadmin-master.zip
mv memadmin-master 网页主目录/mmaster
cd 网页主目录/mmaster
vim config.php
//在此指定用户名,密码,这里暂时保持默认 
           
浏览器输入 ip/mmaster ,用户名,密码默认都是admin,进去之后左侧是服务器连接列表,右侧添加连接,名字随意,host写memcached服务器ip,左侧选中,点击开始管理进入管理界面。