zoukankan      html  css  js  c++  java
  • Linux学习系列之memcached

    memcached简介

    一、memcached是什么

    • memcached是一个开源的、支持高性能、高并发的分布式内存缓存系统
    • mem+cache+daemon:分布式内存缓存守护进程
    • memcached是C/S架构,memcached是服务端,memcache是客户端

    二、memcached的作用

    2.1传统网站的问题

    传统场景,多数web应用都将数据保存在数据库中,web服务器从中读取数据并在浏览器显示.但随着数据流的增大、访问的集中,数据库的负担就会出现加重、响应缓慢,导致网站打开延迟等问题

    2.2memcached应用场景

    2.2.1使用memcached的主要作用就是缓存数据库查询结果,减少数据库访问次数,以提高动态web应用的速度,提高可扩展性

    2.2.2使用memcached缓存session

    三、memcached作为数据库前端缓存读数据流程

    Web程序先读memcached,如果memcached有数据则直接返回给Web程序,如果没有数据再读数据库,数据库把数据返回给Web程序之后,Web程序先将数据存到memcached一份,再返回给用户,下一次直接读memcached

    四、memcached更新数据流程

    应用服务器先更新数据库,再通知memcached更新对应的数据

    五、memcached的特性

    1.协议简单

    memcached协议实现简单,采用基于文本行的协议,能通过Telnet/nc等命令直接操作memcached 

    2.使用libevent作为事件处理通知机制

    libevent将linux系统的epoll模型等事件处理功能封装成一个接口,确保服务器端的连接数增加也能发挥很好的性能 

    3.key/value键值数据类型

    被缓存的数据以key/value键值对的形式存在.如:oldboy:123,key=oldboy、value=123

    六、memcached内存管理机制

    memcached抛弃了通过malloc分配内存用完通过free回收内存的机制,这种方式容易产生内存碎片

    memcached现在使用slab内存管理机制

    slab class:在memcached中,对元素的管理是以slab为单元进行管理的,每个slab对应一个或多个chunk,参考图一

    chunk:存放元素的最小单元.用户数据item(key/value等)最终会保存在chunk中

    page:大下固定为1MB

    1.如图一图二所示,slab分配算法把每1MB大小的内存称为一个slab页,每次向系统申请一个slab页,然后再通过分割算法把这个slab页分割成若干了大小相同的chunk,再把这些chunk分配给用户使用

    2.如图一所示,每个slab class的chunk大小是按照1.25倍增加的,即下一个slab class中chunk的大小是上一个的1.25倍,也可以自己通过-f设置

    3.如图三所示,当用户发来存储请求时(key/value),memcached会计算该key/value的大小,看看属于哪个slab,确定slab后看看里面是否有空闲chunk放该key/value,如果有就直接存进去;如果没有就再向系统申请一个page(如果此时已经达到启动memcached时-m设置的内存使用上限,如果启动时设置了-M就报错,否则就按照LRU规则删除元素),申请后将该page分配各slab class,切割成若干个相同大小的chunk,然后分配一个用来存.

    4.如图四所示,memcached的slab分配算法也有弊端,假如要存储的key/value是100bytes,如果被分到图四中128bytes的chunk中的时候就造成了28bytes的浪费 

    七、memcached的懒惰删除对象机制 

    当删除item对象时,一般不释放内存空间,而是标记删除.memcached再分配空间时会优先使用已经过期的key/value空间

    八、元素什么时候被踢出

    如果元素还没有失效,但是已经达到启动memcached时-m指定的内存使用上限,如果启动memcached时指定了-M参数就报错,否则就按照LRU规则将元素踢出

    九、LRU算法规则是什么

    如果已经达到启动memcached时-m指定的内存使用上限,如果启动memcached时指定了-M参数就报错,否则就按照LRU规则将元素踢出

    LRU算法就是:memcached会查找LRU列表中尾部(最近最少使用)的一些元素,看它们是否已经失效,如果存在已经失效的元素,则将此元素占用的空间重用.如果找不到失效的元素,那么就踢出尾部还没有失效的元素

    十、memcached启动参数

    十一、各类缓存软件对比

    十二、memcached支持的语言

    许多语言都实现了连接memcached的客户端
    Perl
    PHP
    Python
    Ruby
    C#
    C/C++
    Lua

    memcached服务管理

    一、安装memcached

    安装memcached依赖包
        [root@cache01 ~]# yum -y install libevent libevent-devel nc telnet 
    安装memcached
        [root@cache01 ~]# yum -y install memcached 

    二、启动memcached

    [root@cache01 ~]# memcached -m 16m -p 11211 -d -u root  -c 8192

    三、通过Telnet操作memcached

    [root@MySQL ~]# telnet 127.0.0.1 11211   #连接memcached
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'.
    set key 0 0 10              #添加key
    oldboy                      #添加value
    
    
    STORED                      #添加完成
            
    get key                     #通过key获取的value
    VALUE key 0 10
    oldboy                      #这就是通过上边的key获取的value 
    END                         #获取完成
            
    delete key                  #通过key删除value
    DELETED                     #删除成功
            
    get key                     #获取value                  
    END            
            
    stats                       #查看memcached内部的状态
    STAT pid 2686
    STAT uptime 532
    STAT time 1478130192
    STAT version 1.4.4
    STAT pointer_size 64
    STAT rusage_user 0.118981
    STAT rusage_system 0.177972
    STAT curr_connections 10
    STAT total_connections 13
    STAT connection_structures 11
    STAT cmd_get 2                   #获取了几次
    STAT cmd_set 1                   #添加了几次
    STAT cmd_flush 0
    STAT get_hits 1                   #命中了几次
    STAT get_misses 1                 #未命中几次
    STAT delete_misses 0
    STAT delete_hits 1
    STAT incr_misses 0
    STAT incr_hits 0
    STAT decr_misses 0
    STAT decr_hits 0
    STAT cas_misses 0
    STAT cas_hits 0
    STAT cas_badval 0
    STAT auth_cmds 0
    STAT auth_errors 0
    STAT bytes_read 1104
    STAT bytes_written 69
    STAT limit_maxbytes 16777216
    STAT accepting_conns 1
    STAT listen_disabled_num 0
    STAT threads 4
    STAT conn_yields 0
    STAT bytes 0
    STAT curr_items 0        
    STAT total_items 1              #几个数据
    STAT evictions 0

    四、配置memcached作为LNMP环境session会话存储

    4.1测试php连接memcached

    4.1.1环境说明

    lnmp 192.168.0.93 lnmp
    memcached 192.168.0.95 memcached

    4.1.2环境准备:

    • LNMP环境搭建好,这里省略
    • 必须能访问phpinfo界面

    4.1.3memcached服务器端

    启动memcached
        [root@memcached ~]# memcached -m 16m -p 11211 -d -u root -c 8192

    4.1.4LNMP端

    安装memcache客户端
        [root@lnmp02 tools]# tar -zxvf memcache-2.2.7
        [root@lnmp02 ~]# cd memcache-2.2.7
        [root@lnmp02 memcache-2.2.7]#  /application/php/bin/phpize 
         [root@lnmp02 memcache-2.2.7]# ./configure --enable-memcache --with-php-config=/application/php/bin/php-config --with-zlib-dir 
         [root@lnmp02 memcache-2.2.7]#make 
         [root@lnmp02 memcache-2.2.7]#make install 
    在php.ini配置memcache
        [root@lnmp02 memcache-2.2.7]#vim /application/php/lib/php.ini  #编辑配置文件添加以下两行 
            extension_dir= "/application/php/lib/php/extensions/no-debug-non-zts-20090626/"
            extension= memcache.so
    重启nginx和php-fpm
        [root@lnmp02 memcache-2.2.7]#/application/nginx/sbin/nginx  -s reload 
        [root@lnmp02 memcache-2.2.7]#pkill php-fpm 
        [root@lnmp02 memcache-2.2.7]#ps -ef|grep php-fpm
        [root@lnmp02 memcache-2.2.7]#/application/php/sbin/php-fpm 
    测试php是否安装memcached
        windows端访问blog.etiantian.org/test.php(phpinfo界面)是否有memcache选项
    编写php连接memcache访问程序
        [root@lnmp02 blog]# cd /application/nginx/conf/extra/blog.conf 
        [root@lnmp02 blog]# vim memcache.php 
        <?php
        $mem = new Memcache;
        $mem->connect("192.168.0.95", 11211);
    
        $mem->set('key1', 'This is first value', 0, 3600);
        $val = $mem->get('key1');
        echo "Get key1 value: " . $val ."<br />";
    
        $arr = array('aaa', 'bbb', 'ccc', 'ddd');
        $mem->set('key2', $arr, 0, 60);
        $val2 = $mem->get('key2');
        echo "Get key2 value: ";
        print_r($val2);
        echo "<br />";
    
        $mem->delete('key1');
        $val = $mem->get('key1');
        echo "Get key1 value: " . $val . "<br />";
    
        $mem->flush();
        $val2 = $mem->get('key2');
        echo "Get key2 value: ";
        print_r($val2);
        echo "<br />";
    
        $mem->close();
        ?>
    测试php是否能连接memcached
        [root@lnmp02 memcache-2.2.7]#curl blog.etiantian.org/memcache.php
        Get key1 value: This is first value
        Get key2 value: Array ( [0] => aaa [1] => bbb [2] => ccc [3] => ddd ) 
        Get key1 value: 
        Get key2 value: 

    4.2配置memcached为session共享

    4.2.1LNMP端

    修改php.ini配置文件为memcache存储session会话
        [root@lnmp ~]# vim /application/php/lib/php.ini            #修改以下内容
            session.save_handler = memcache
            session.save_path = "tcp://192.168.0.95:11211"
    重启php-fpm
        pkill php-fpm
        [root@lnmp ~]# /application/php/sbin/php-fpm 

    4.2.2测试

    用客户端浏览器打开http://blog.etiantian.org/test.php(phpinfo界面)

    4.2.3所有web服务端想实现session共享怎么办

    在所有web服务器的php.ini加上memcache存储 

  • 相关阅读:
    你所选择的栏目与当前模型不相符请选择白色的选
    DEDECMS首页调用图片集里的多张图片
    dedecms内容页调用图片集文档的图集图片
    Sublime Text 使用介绍、全套快捷键及插件推荐
    基于Nutch+Hadoop+Hbase+ElasticSearch的网络爬虫及搜索引擎
    nutch
    ant安装
    selenium经过WebDriverWait实现ajax测试
    查看当前android设备已安装的第三方包
    批处理学习总结之常用符号
  • 原文地址:https://www.cnblogs.com/chadiandianwenrou/p/6024895.html
Copyright © 2011-2022 走看看