memcached

========================================================================== 

概述:

  • Memcached是一个自由开源的,高性能,分布式内存对象缓存系统。

  • Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric为首开发的一款软件。现在已成为mixi、hatena、Facebook、Vox、LiveJournal等众多服务中提高Web应用扩展性的重要因素。

  • Memcached是一种基于内存的key-value存储,用来存储小块的任意数据(字符串、对象)。这些数据可以是数据库调用、API调用或者是页面渲染的结果。

  • Memcached简洁而强大。它的简洁设计便于快速开发,减轻开发难度,解决了大数据量缓存的很多问题。它的API兼容大部分流行的开发语言。

  • 本质上,它是一个简洁的key-value存储系统。

  • 一般的使用目的:通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。

  • Memcached 官网:http://memcached.org/

web_6


==========================================================================

memcached

1.介绍

缓存服务器特性:

  • 缓存:cache,无持久存储功能;

  • bypass缓存

  • k/v cache,仅支持存储流式化数据;

Memcached的功用

  • Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度;

memcached特性:

k/v cache

  • 仅存储可序列化(流式化)数据;

  • 存储项:k/v;

  • 智能性一半依赖于客户端(调用memcached的API开发程序),一半依赖于服务端;

分布式缓存:

  • 互不通信的分布式集群;

  • 分布式系统请求路由方法:取模法,一致性哈希算法;

算法复杂度:O(1)

清理过期缓存项

  • 缓存耗尽:LRU 

  • 缓存项过期:惰性清理机制

附图:

wKiom1gZ9NPSrACLAAA81tJ3vc0424.png

 2.memcached的安装和配置

安装及监听端口

  • CentOS 7 由base仓库直接提供

  • 监听的端口:11211/tcp, 11211/udp 

安装文件内容如下:

[root@centos7 ~]# rpm -ql memcached
/etc/sysconfig/memcached                     # 环境配置文件定义启动memcached是的选项
/usr/bin/memcached                           # 主程序
/usr/bin/memcached-tool                      # 管理memcached应用的工具
/usr/lib/systemd/system/memcached.service    # Unit File文件依赖于第一条的环境配置文件
/usr/share/doc/memcached-1.4.15
/usr/share/doc/memcached-1.4.15/AUTHORS
/usr/share/doc/memcached-1.4.15/CONTRIBUTORS
/usr/share/doc/memcached-1.4.15/COPYING
/usr/share/doc/memcached-1.4.15/ChangeLog
/usr/share/doc/memcached-1.4.15/NEWS
/usr/share/doc/memcached-1.4.15/README.md
/usr/share/doc/memcached-1.4.15/protocol.txt  # 官方文档
/usr/share/doc/memcached-1.4.15/readme.txt
/usr/share/doc/memcached-1.4.15/threads.txt
/usr/share/man/man1/memcached-tool.1.gz
/usr/share/man/man1/memcached.1.gz

主程序:

  • /usr/bin/memcached

配置文件:

  • /etc/sysconfig/memcached

[root@centos7 ~]# cat /etc/sysconfig/memcached 
PORT="11211"       # 监听端口
USER="memcached"   # 指明运行的用户身份
MAXCONN="1024"     # 最大并发连接数
CACHESIZE="64"     # 使用多大的内存空间来缓存
OPTIONS=""
  • Unit File:memcached.service 

[root@centos7 ~]# cat /usr/lib/systemd/system/memcached.service 
[Unit]
Description=Memcached 
Before=httpd.service
After=network.target

[Service]
Type=simple
EnvironmentFile=-/etc/sysconfig/memcached
ExecStart=/usr/bin/memcached -u $USER -p $PORT -m $CACHESIZE -c $MAXCONN $OPTIONS

[Install]
WantedBy=multi-user.target

协议格式:memcached协议

  • 文本格式

  • 二进制格式(编码效率更高)

启动memcached并查看端口11211/tcp, 11211/udp 

[root@centos7 ~]# systemctl start memcached.service
[root@centos7 ~]# ss -tunl
Netid State      Recv-Q Send-Q                                    Local Address:Port                                                   Peer Address:Port              
udp   UNCONN     0      0                                                     *:68                                                                *:*                  
udp   UNCONN     0      0                                                     *:68                                                                *:*                  
udp   UNCONN     0      0                                                     *:27217                                                             *:*                  
udp   UNCONN     0      0                                             127.0.0.1:323                                                               *:*                  
udp   UNCONN     0      0                                                     *:30538                                                             *:*                  
udp   UNCONN     0      0                                                     *:11211                                                             *:*                  
udp   UNCONN     0      0                                                     *:514                                                               *:*                  
tcp   LISTEN     0      128                                                  :::11211                                                            :::*


 2.memcached的命令

memcached连接

我们可以通过 telnet 命令并指定主机ip和端口来连接 Memcached 服务。

语法:telnet HOST PORT

  • 命令中的 HOST 和 PORT 为运行 Memcached 服务的 IP 和 端口

命令分类:

统计类:

  • stats, stats items, stats slabs, stats sizes

存储类:

  • set, add, replace, append, prepend

wKioL1gbRIWg6_4gAABwXjzU8IM137.png

检索类:get, delete, incr/decr

清空:flush_all

示例:

wKiom1gbKdHCi0HYAAAU8oiUwEc982.png

命令演示:

  基于文本格式的协议连接:

[root@centos7 ~]# telnet localhost 11211 # 使用telnet连接
Trying ::1...
Connected to localhost.
Escape character is '^]'.
stats        # 统计状态
STAT pid 4710
STAT uptime 1051
STAT time 1478173984
STAT version 1.4.15
STAT libevent 2.0.21-stable
STAT pointer_size 64
STAT rusage_user 0.037827
STAT rusage_system 0.059442
STAT curr_connections 10
STAT total_connections 12
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 43
STAT bytes_written 1068
STAT limit_maxbytes 67108864
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
stats items   
END
stats slabs   # 内存分配
STAT active_slabs 0
STAT total_malloced 0
[root@centos7 ~]# telnet localhost 11211
Trying ::1...
Connected to localhost.
Escape character is '^]'.
set mykey 1 300 11  # 设定key为mykey,flags为1,过期时长为300s,大小为11字节,
hello world         # 回车之后给定的值
STORED
get mykey           # 检索key
VALUE mykey 1 11
hello world
END
append mykey 1 300 1 # 在后面追加一个字节
.
STORED
get mykey
VALUE mykey 1 12
hello world.
END
prepend mykey 1 300 9 # 在前面预设9个字节
welcome,              # 值为welcome
STORED
get mykey
VALUE mykey 1 21
welcome, hello world.
END
delete mykey          # 删除key
DELETED
get mykey
END
set counter 1 300 1
0
STORED
incr counter 1        # 增加一个字节,值为1
1
incr counter 1
2
incr counter 10
12
decr counter 1
11
get counter
VALUE counter 1 2
11
END

 3.memcached的常用选项

-m <num>:

  • Use <num> MB memory max to use for object storage; the default is 64 megabytes. 缓存空间大小,默认为64M

-c <num>:

  • Use <num> max simultaneous connections; the default is 1024. 最大并发连接数,默认1024;

-u <username>:

  • 以指定的用户身份来运行进程;

-l <ip_addr>:

  • 监听的IP地址,默认为本机所有地址;

-p <num>:

  • 监听的TCP端口, the default is port 11211.

-U <num>:

  • Listen on UDP port <num>, the default is port 11211, 0 is off.

-M:

  • 内存耗尽时,不执行LRU清理缓存,而是拒绝存入新的缓存项,直到有多余的空间可用时为止;

-f <factor>:

  • 增长因子;默认是1.25;

-t <threads>:

  • 启动的用于响应用户请求的线程数;默认为4个

演示:

[root@centos7 ~]# memcached -u memcached -vv -f 1.11  # 指定增长因子
slab class   1: chunk size        96 perslab   10922
slab class   2: chunk size       112 perslab    9362
slab class   3: chunk size       128 perslab    8192
slab class   4: chunk size       144 perslab    7281
slab class   5: chunk size       160 perslab    6553
slab class   6: chunk size       184 perslab    5698
slab class   7: chunk size       208 perslab    5041
slab class   8: chunk size       232 perslab    4519
slab class   9: chunk size       264 perslab    3971
slab class  10: chunk size       296 perslab    3542
slab class  11: chunk size       328 perslab    3196
slab class  12: chunk size       368 perslab    2849
slab class  13: chunk size       408 perslab    2570
slab class  14: chunk size       456 perslab    2299
slab class  15: chunk size       512 perslab    2048
slab class  16: chunk size       568 perslab    1846
slab class  17: chunk size       632 perslab    1659
slab class  18: chunk size       704 perslab    1489
slab class  19: chunk size       784 perslab    1337
slab class  20: chunk size       872 perslab    1202
slab class  21: chunk size       968 perslab    1083
slab class  22: chunk size      1080 perslab     970
slab class  23: chunk size      1200 perslab     873
slab class  24: chunk size      1336 perslab     784
slab class  25: chunk size      1488 perslab     704
slab class  26: chunk size      1656 perslab     633
slab class  27: chunk size      1840 perslab     569
slab class  28: chunk size      2048 perslab     512
slab class  29: chunk size      2280 perslab     459
slab class  30: chunk size      2536 perslab     413
slab class  31: chunk size      2816 perslab     372
slab class  32: chunk size      3128 perslab     335
slab class  33: chunk size      3472 perslab     302
slab class  34: chunk size      3856 perslab     271
slab class  35: chunk size      4280 perslab     244
slab class  36: chunk size      4752 perslab     220
slab class  37: chunk size      5280 perslab     198
slab class  38: chunk size      5864 perslab     178
slab class  39: chunk size      6512 perslab     161
slab class  40: chunk size      7232 perslab     144
slab class  41: chunk size      8032 perslab     130
slab class  42: chunk size      8920 perslab     117
slab class  43: chunk size      9904 perslab     105
slab class  44: chunk size     11000 perslab      95
slab class  45: chunk size     12216 perslab      85
slab class  46: chunk size     13560 perslab      77
slab class  47: chunk size     15056 perslab      69
slab class  48: chunk size     16712 perslab      62
slab class  49: chunk size     18552 perslab      56
slab class  50: chunk size     20592 perslab      50
slab class  51: chunk size     22864 perslab      45
slab class  52: chunk size     25384 perslab      41
slab class  53: chunk size     28176 perslab      37
slab class  54: chunk size     31280 perslab      33
slab class  55: chunk size     34720 perslab      30
slab class  56: chunk size     38544 perslab      27
slab class  57: chunk size     42784 perslab      24
slab class  58: chunk size     47496 perslab      22
slab class  59: chunk size     52720 perslab      19
slab class  60: chunk size     58520 perslab      17
slab class  61: chunk size     64960 perslab      16
slab class  62: chunk size     72112 perslab      14
slab class  63: chunk size     80048 perslab      13
slab class  64: chunk size     88856 perslab      11
slab class  65: chunk size     98632 perslab      10
slab class  66: chunk size    109488 perslab       9
slab class  67: chunk size    121536 perslab       8
slab class  68: chunk size    134904 perslab       7
slab class  69: chunk size    149744 perslab       7
slab class  70: chunk size    166216 perslab       6
slab class  71: chunk size    184504 perslab       5
slab class  72: chunk size    204800 perslab       5
slab class  73: chunk size    227328 perslab       4
slab class  74: chunk size    252336 perslab       4
slab class  75: chunk size    280096 perslab       3
slab class  76: chunk size    310912 perslab       3
slab class  77: chunk size    345112 perslab       3
slab class  78: chunk size    383080 perslab       2
slab class  79: chunk size    425224 perslab       2
slab class  80: chunk size    472000 perslab       2
slab class  81: chunk size    523920 perslab       2
slab class  82: chunk size    581552 perslab       1
slab class  83: chunk size    645528 perslab       1
slab class  84: chunk size    716536 perslab       1
slab class  85: chunk size    795360 perslab       1
slab class  86: chunk size    882856 perslab       1
slab class  87: chunk size   1048576 perslab       1
<26 server listening (auto-negotiate)
<27 server listening (auto-negotiate)
<28 send buffer was 212992, now 268435456
<29 send buffer was 212992, now 268435456
<28 server listening (udp)
<28 server listening (udp)
<29 server listening (udp)
<28 server listening (udp)
<28 server listening (udp)
<29 server listening (udp)
<29 server listening (udp)
<29 server listening (udp)

3.memcached的驱动模块及命令行工具

memcached默认没有认证机制,可借用于SASL进行认证;

  • SASL:Simple Authentication Secure Layer

API:其他程序连接memcached的驱动模块

  • php-pecl-memcache

  • php-pecl-memcached

  • python-memcached

  • libmemcached

  • libmemcached-devel

命令行工具:管理memcached服务

  • memcached-tool  SERVER:PORT  COMMAND

演示:

[root@centos7 ~]# memcached-tool 
Usage: memcached-tool <host[:port] | /path/to/socket> [mode]

       memcached-tool 10.0.0.5:11211 display    # shows slabs
       memcached-tool 10.0.0.5:11211            # same.  (default is display)
       memcached-tool 10.0.0.5:11211 stats      # shows general stats
       memcached-tool 10.0.0.5:11211 dump       # dumps keys and values

[root@centos7 ~]# memcached-tool 127.0.0.1:11211 stats 
#127.0.0.1:11211   Field       Value
         accepting_conns           1
               auth_cmds           0
             auth_errors           0
                   bytes           0
              bytes_read           7
           bytes_written           0
              cas_badval           0
                cas_hits           0
              cas_misses           0
               cmd_flush           0
                 cmd_get           0
                 cmd_set           0
               cmd_touch           0
             conn_yields           0
   connection_structures          11
        curr_connections          10
              curr_items           0
               decr_hits           0
             decr_misses           0
             delete_hits           0
           delete_misses           0
       evicted_unfetched           0
               evictions           0
       expired_unfetched           0
                get_hits           0
              get_misses           0
              hash_bytes      524288
       hash_is_expanding           0
        hash_power_level          16
               incr_hits           0
             incr_misses           0
                libevent 2.0.21-stable
          limit_maxbytes    67108864
     listen_disabled_num           0
                     pid        5346
            pointer_size          64
               reclaimed           0
            reserved_fds          20
           rusage_system    0.006145
             rusage_user    0.008193
                 threads           4
                    time  1478179802
       total_connections          11
             total_items           0
              touch_hits           0
            touch_misses           0
                  uptime          60
                 version      1.4.15

============================================================================

memcached向详细用法可以参考如下文档

http://www.runoob.com/memcached/memcached-tutorial.html