陈德馨

Linux系统下快速安装部署memcached的方法

989人参与 |分类: 运维时间|时间:2016年11月18日 21:25

Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。很多大型网站都使用了Memcached做缓存,下面陈德馨将给大家介绍下如何在linux下安装部署Memcached服务。

一、安装memcached

Memcached的安装依赖Libevent,首先安装Libevent:

sean@sean:~$ tar -xzf libevent-1.4.14b-stable.tar.gz   

sean@sean:~$ cd libevent-1.4.14b-stable/  

sean@sean:~/libevent-1.4.14b-stable$ sudo ./configure -prefix /usr  

sean@sean:~/libevent-1.4.14b-stable$ sudo make  

sean@sean:~/libevent-1.4.14b-stable$ sudo make install  

sean@sean:~/libevent-1.4.14b-stable$ sudo make clean  

Libevent将会被安装至/usr/lib下:

sean@sean:/usr/lib$ cd /usr/lib/  

sean@sean:/usr/lib$ ll | grep libevent*  

Binary file libevent-1.4.so.2.2.0 matches  

libevent.la:dlname='libevent-1.4.so.2'  

libevent.la:library_names='libevent-1.4.so.2.2.0 libevent-1.4.so.2 libevent.so'  

Binary file libevent.so matches

然后安装Memcached:

sean@sean:~$ tar -xzf memcached-1.4.25.tar.tar  

sean@sean:~$ cd memcached-1.4.25/  

sean@sean:~/memcached-1.4.25$ sudo ./configure -with-libevent=/usr  

sean@sean:~/memcached-1.4.25$ sudo make  

sean@sean:~/memcached-1.4.25$ sudo make install  

sean@sean:~/memcached-1.4.25$ sudo make clean

Memcached将会被安装至/usr/local/bin下:

sean@sean:/usr/local/bin$ ll  

total 544  

drwxr-xr-x  2 root root   4096  4月 21 21:32 ./  

drwxr-xr-x 10 root root   4096  2月 18 07:12 ../  

-rwxr-xr-x  1 root root 545998  4月 21 21:32 memcached* 

二、启动memcached服务

-m:分配给memcached的最大内存,以M为单位

-p:服务监听的TCP端口,默认值是11211

-d:服务当做守护进程启动

-vv:打印详细信息

-f:增长因子,默认值是1.25,指定的值必须比1大

sean@sean:/usr/local/bin$ ./memcached -m 64 -p 9999 -d -vv  

sean@sean:/usr/local/bin$ slab class   1: chunk size        96 perslab   10922  

slab class   2: chunk size       120 perslab    8738  

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  

slab class  13: chunk size      1480 perslab     708  

slab class  14: chunk size      1856 perslab     564  

slab class  15: chunk size      2320 perslab     451  

slab class  16: chunk size      2904 perslab     361  

slab class  17: chunk size      3632 perslab     288  

slab class  18: chunk size      4544 perslab     230  

slab class  19: chunk size      5680 perslab     184  

slab class  20: chunk size      7104 perslab     147  

slab class  21: chunk size      8880 perslab     118  

slab class  22: chunk size     11104 perslab      94  

slab class  23: chunk size     13880 perslab      75  

slab class  24: chunk size     17352 perslab      60  

slab class  25: chunk size     21696 perslab      48  

slab class  26: chunk size     27120 perslab      38  

slab class  27: chunk size     33904 perslab      30  

slab class  28: chunk size     42384 perslab      24  

slab class  29: chunk size     52984 perslab      19  

slab class  30: chunk size     66232 perslab      15  

slab class  31: chunk size     82792 perslab      12  

slab class  32: chunk size    103496 perslab      10  

slab class  33: chunk size    129376 perslab       8  

slab class  34: chunk size    161720 perslab       6  

slab class  35: chunk size    202152 perslab       5  

slab class  36: chunk size    252696 perslab       4  

slab class  37: chunk size    315872 perslab       3  

slab class  38: chunk size    394840 perslab       2  

slab class  39: chunk size    493552 perslab       2  

slab class  40: chunk size    616944 perslab       1  

slab class  41: chunk size    771184 perslab       1  

slab class  42: chunk size   1048576 perslab       1  

<26 server listening (auto-negotiate)  

<27 server listening (auto-negotiate)  

<28 send buffer was 212992, now 268435456  

<32 send buffer was 212992, now 268435456  

<31 server listening (udp)  

<35 server listening (udp)  

<30 server listening (udp)  

<34 server listening (udp)  

<29 server listening (udp)  

<33 server listening (udp)  

<28 server listening (udp)  

<32 server listening (udp)  

从日志信息中,我们可以了解到很多东西。首先就是memcached的内存管理机制,memcached会将内存分为数个大小相等的slab,每个slab又按固定大小分成数个chunk,随着slab编号的增加,slab中chunk的大小按一定比率增长。

从日志中可以看到,memcached将内存分为了42个大小均为1M的slab,而每个slab又分为大小相同的数个chunk,比如slab1中每个chunk的大小为120B,slab1中总共有8738个这样的chunk,而slab42中每个chunk的大小为1M,所以slab42中只能有一个chunk,随着slab编号的增加,slab中chunk的大小按1.25的比率增长(slab1:120,slab2:150,150/120=1.25,正好是-f指定的增长因子的默认值)

slab5中每个chunk的大小为240B,当我要存放200B的数据时,则会选择slab5中的一个chunk存放数据,如果slab5中的chunk都被使用了怎么办?没关系,找到一个最近最少使用(LRU:least recently used)的chunk,将新数据存入其中,即使slab6中有空闲的chunk,因此当memcached中保存数据的大小基本一致时,增长因子过大将导致memcahed的内存使用率并不是很高。

查看进程发现服务启动成功:

sean@sean:/usr/local/bin$ ps -ef|grep memcached

sean      17944   8981  0 21:28 ?        00:00:00 ./memcached -m 64 -p 9999 -u root -d -vvv

sean      17951  14900  0 21:28 pts/15   00:00:00 grep --color=auto memcached

三、基本memcached命令

由于memcached服务监听9999端口,我们可以通过telnet的方式连接至memcached:

sean@sean:~$ telnet 127.0.0.1 9999  

Trying 127.0.0.1...  

Connected to 127.0.0.1.  

Escape character is '^]'.  

之后可以通过输入相应的命令进行操作。

新增:add key flag expire length

add name 1 0 4  

sean  

STORED

flag必须为一个正整数,将对象、数组序列化后存入缓存,当需要取出时,还需反序列化,这时可根据flag的值进行相应的反序列化,比如flag的值是1,不需要反序列化,值为2,反序列化对象,值为3,反序列化数组

length为缓存的字节长度

查询:get key

get name  

VALUE name 1 4  

sean  

END

删除:delete key

delete name  

DELETED

替换(key必须存在才能替换):replace key flag expire length

设置(key不存在执行新增,key存在执行替换):set key flag expire length

查看状态:查看状态:stat

stats 

STAT pid 18178  

STAT uptime 1160  

STAT time 1463495507  

STAT version 1.4.25  

STAT libevent 1.4.14b-stable  

STAT pointer_size 64  

STAT rusage_user 0.000000  

STAT rusage_system 0.040000  

STAT curr_connections 10  

STAT total_connections 11  

STAT connection_structures 11  

STAT reserved_fds 20  

STAT cmd_get 6  

STAT cmd_set 7  

STAT cmd_flush 0  

STAT cmd_touch 0  

STAT get_hits 4  

STAT get_misses 2  

STAT delete_misses 0  

STAT delete_hits 2  

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 264  

STAT bytes_written 203  

STAT limit_maxbytes 67108864  

STAT accepting_conns 1  

STAT listen_disabled_num 0  

STAT time_in_listen_disabled_us 0  

STAT threads 4  

STAT conn_yields 0  

STAT hash_power_level 16  

STAT hash_bytes 524288  

STAT hash_is_expanding 0  

STAT malloc_fails 0  

STAT bytes 73  

STAT curr_items 1  

STAT total_items 6  

STAT expired_unfetched 0  

STAT evicted_unfetched 0  

STAT evictions 0  

STAT reclaimed 0  

STAT crawler_reclaimed 0  

STAT crawler_items_checked 0  

STAT lrutail_reflocked 0  

END  

通过get_hits/(get_hits + get_misses)能够计算出缓存命中率。

来源:陈德馨博客(微信/QQ号:35435164),转载请保留出处和链接!

地址:

必填

选填

选填

◎已有 0 人评论,请发表您的观点。