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:
    官方站点: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值