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存储 

  • 相关阅读:
    java基础部分的一些有意思的东西。
    antdvue按需加载插件babelpluginimport报错
    阿超的烦恼 javaScript篇
    .NET E F(Entity Framework)框架 DataBase First 和 Code First 简单用法。
    JQuery获得input ID相同但是type不同的方法
    gridview的删除,修改,数据绑定处理
    jgGrid数据格式
    Cannot read configuration file due to insufficient permissions
    Invoke action which type of result is JsonResult on controller from view using Ajax or geJSon
    Entity model数据库连接
  • 原文地址:https://www.cnblogs.com/chadiandianwenrou/p/6024895.html
Copyright © 2011-2022 走看看