• memcached


    nginx+memcached

    nginx的memcached_module模块可以直接从memcached服务器中读取内容后输出,后续的请求不再经过应用程序处理,如php-fpm、django,大大的提升动态页面的速度。nginx只负责从memcached服务器中读取数据,要往memcached写入数据还得需要后台的应用程序来完成,主动的将要缓存的页面缓存到memcached中,可以通过404重定向到后端去处理的。

    整个请求的用户通过上图可得做,nginx可以先从memcached缓存先获取数据,,但缓存没有命中的时候rewrite到去请求去获取资源并缓存到memcached。

    memcached

    在memcached内存分配之前,先说下linux内存管理管理中用到的两种避免内存碎片的机制。

    • Buddy system
      伙伴系统避免内存外的碎片,linux内核分配内存的方式是按照页框(默认4k大小)进行的,由于页框大小是4k,而很多信息打开需要用到几个页框,外碎片就是指内核想找一个大页框来存储某些信息时都无法找到,而buddy system就是会自动将相邻的页框合并成连续的大空间的一种机制。

    • Slab allocator
      slab分配器避免内存内的碎片,linux内核分配内存的方式是按照页框(默认4k大小)进行的,由于页框大小是4k,而在linux系统中很多信息打开时都不需要用到一个页框,如inode的描述信息,slab allocator的基本原理是按照预先固定的大小,将页框分配成特定结构存储大小数据而不销毁页框而是重复使用,随时申请随时使用,解决内存内的碎片问题。

    memcached内存分配机制

    memcached默认采用slab allocator的机制分配、管理内存。memcached解决的最大的一个问题就是内存多次读取时内存碎片问题,memcached启动进程的时候就按照预先设定好的大小(默认64m),在内存开辟出一段连续的内存空间,之后再将这段内存分成不同的片段。就是预先将memcached分配的内存划分成一系列slab,每个slab只负责一定范围内的数据存储,其实就是在slab这个空间内把内存分成尺寸相同的chunk,如下图:

    memcached分配内存是在总大小64M(默认)中分成一组组的slab,每一个slab有特定的大小的chunk存储单元。比如上图第一个slab内存存放的都是88字节的存储单元,第二个是112字节,从此类推,一直把64M内存分配完。memcached默认情况下下一个slab的最大值是前一个的1.25倍(增长因子),但是每个slab之间的增长因子是管理员在启动memcached时可以设定的。

    由上可知,memcached中的chunk是用来真正的存储数据的,而slab是用来管理一组特定大小的chunk的组,对于chunk来说,最小可以到48字节,最大默认1m,那么memcached是如何存储数据的,每个slab只储存只储存大于其上一个slab chunk的大小其上一个slab chunk的大小并小于或者等于自己最大的chunk的数据。比如chunk size是144byte,而储存的数据只有120byte,剩下的24byte就被浪费了。

    memcached会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不足的情况, 此时就要使用名为Least Recently Used(LRU)机制来分配空间。 顾名思义,这是删除“最近最少使用”的记录的机制。 因此,当memcached的内存空间不足时(无法从slab class 获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配给新的记录。 从缓存的实用角度来看,该模型十分理想。不过,有些情况下LRU机制反倒会造成麻烦。memcached启动时通过“-M”参数可以禁止LRU。

    memcached常用的选项

    • -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 [factor]: 设定slab allocator定义预先分配内存空间大小固定的块时使用的增长因子
    • -n 指定最小的slab chunk大小,单位字节
    • -M; 当内存空间不够时返回错误信息,而不是按LRU算法利用空间
    • -S:启用sasl
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ~]# memcached -u nobody -d -m 1024 -vv
    slab class 1: chunk size 96 perslab 10922
    slab class 3: chunk size 152 perslab 6898
    slab class 4: chunk size 192 perslab 5461
    slab class 5: chunk size 240 perslab 4369
    slab class 6: chunk size 304 perslab 3449
    slab class 7: chunk size 384 perslab 2730
    slab class 8: chunk size 480 perslab 2184
    slab class 9: chunk size 600 perslab 1747
    slab class 10: chunk size 752 perslab 1394
    slab class 11: chunk size 944 perslab 1110
    slab class 12: chunk size 1184 perslab 885
    ...

    memcached常用的命令:

    • 统计类
      stats;stats items
    • 存储类命令
      set;add;replace;append;prepend
      set key flag timeout datasize
    • 获取数据类
      get;delete;incr;decr
    • 清空
      flush_all
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38大专栏  memcachediv>
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    ~]# telnet 127.0.0.1 11211
    stats
    STAT pid 27323
    STAT uptime 153
    STAT time 1495641161
    STAT version 1.4.15
    STAT libevent 2.0.21-stable
    STAT pointer_size 64
    STAT rusage_user 0.000000
    STAT rusage_system 0.013679
    STAT curr_connections 10
    STAT total_connections 11
    STAT connection_structures 11
    STAT reserved_fds 20
    STAT cmd_get 0
    STAT cmd_set 0
    STAT cmd_flush 0
    STAT cmd_touch 0
    STAT get_hits 0
    STAT get_misses 0
    STAT delete_misses 0
    STAT delete_hits 0
    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 touch_hits 0
    STAT touch_misses 0
    STAT auth_cmds 0
    STAT auth_errors 0
    STAT bytes_read 9
    STAT bytes_written 7
    STAT limit_maxbytes 1073741824
    STAT accepting_conns 1
    STAT listen_disabled_num 0
    STAT threads 4
    STAT conn_yields 0
    STAT hash_power_level 16
    STAT hash_bytes 524288
    STAT hash_is_expanding 0
    STAT bytes 0
    STAT curr_items 0
    STAT total_items 0
    STAT expired_unfetched 0
    STAT evicted_unfetched 0
    STAT evictions 0
    STAT reclaimed 0
    END
    set first 0 30 11
    hello world
    STORED
    get first
    VALUE first 0 11
    hello world
    END
    add a 0 300 1
    1
    STORED
    incr a 10
    11
    stats items
    STAT items:1:number 2
    STAT items:1:age 319
    STAT items:1:evicted 0
    STAT items:1:evicted_nonzero 0
    STAT items:1:evicted_time 0
    STAT items:1:outofmemory 0
    STAT items:1:tailrepairs 0
    STAT items:1:reclaimed 1
    STAT items:1:expired_unfetched 0
    STAT items:1:evicted_unfetched 0
    END

    nginx+memcached

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    server {
    listen 8080;
    server_name cache.jusene.me;
    index index.html index.html index.php;
    root /data/www/public;
    location / {
    set $memcached_key $uri;
    add_header X-mem-key $memcached_key;
    memcached_pass 127.0.0.1:11211;
    default_type text/html;
    error_page 404 502 504 = @fallback;
    }
    location @fallback {
    proxy_pass 127.0.0.1:80;
    }
    }

    php共享会话

    一、配置php将会话保存至memcached中

    编辑php.ini文件,确保如下两个参数的值分别如下所示:
    session.save_handler = memcached
    session.save_path = “tcp://127.0.0.1:11211?persistent=1&weight=1&timeout=1&retry_interval=15”

    二、测试

    新建php页面setsess.php,为客户端设置启用session:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    session_start();
    if (!isset($_SESSION['www.jusene.com'])) {
    $_SESSION['www.jusene.com'] = time();
    }
    print $_SESSION['www.jusene.com'];
    print "<br><br>";
    print "Session ID: " . session_id();
    ?>

    新建php页面showsess.php,获取当前用户的会话ID:

    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    session_start();
    $memcache_obj = new Memcache;
    $memcache_obj->connect('127.0.0.1', 11211);
    $mysess=session_id();
    var_dump($memcache_obj->get($mysess));
    $memcache_obj->close();
    ?>

  • 相关阅读:
    课堂作业1
    懒人创造了方法
    四则运算
    动手动脑与原码反码补码
    java测试感受
    暑假进度报告四
    暑假进度报告三
    暑假进度报告二
    暑假进度报告一
    《大道至简》读后感
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12227200.html
Copyright © 2020-2023  润新知