memcached

memcached介绍

是国外社区网站LiveJournal团队开发,通过缓存数据库查询结果,减少数据库访问次数,从而提高动态web站点性能。官方站点 http://memcached.org/

基于c/s架构,协议简单

基于libevent的事件处理

自主内存存储处理(slab allowcation)

数据过期方式:Lazy Expiration 和 LRU

memcached数据流

 

Slab allocation

Slab Allocation的原理——将分配的内存分割成各种尺寸的块(chunk), 并把尺寸相同的块分成组(chunk的集合),每个chunk集合被称为slab。

Memcached的内存分配以Page为单位,Page默认值为1M,可以在启动时通过-I参数来指定。

Slab是由多个Page组成的,Page按照指定大小切割成多个chunk。其结构如图

 

 

Growth factor

memcached在启动时通过-f选项可以指定 Growth Factor因子。该值控制chunk大小的差异。默认值为1.25。

通过memcached-tool查看指定memcached实例的不同slab状态,可以看到各Item所占大小(chunk大小)差距为1.25

命令:#memcached-tool 127.0.0.1:11211 display

 

Memcached数据过期方式

Lazy Expiration
memcached 内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。这种技术被称为lazy(惰性)expiration。因此,memcached不会在过期监视上耗费CPU时间。

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

 

 

 

 

 

 

memcached安装

 

192.168.205.188

 

1.yum install -y epel-release

2.yum install -y libevent  memcached libmemcached

3.启动 /etc/init.d/memcached start

4.ps aux |grep memcached

5.netstat -lnp|grep memcached

6.memcached -d -p 11211 -u memcached -m 64 -c 1024 -P /var/run/memcached/memcached.pid

7.以上相关的参数在/etc/init.d/memcached和/etc/sysconfig/memcached中定义

 

注意

/etc/init.d/memcached 中更改不生效

/etc/sysconfig/memcached  中更改生效

例:

vim /etc/sysconfig/memcached

修改CACHESIZE=”128″

/etc/init.d/memcached restart

[root@xclinux ~]# ps aux |grep memcached

498       1693  0.0  0.0  56280   896 ?        Ssl  14:03   0:00 memcached -d -p 11211 -u memcached -m 128 -c 1024 -P /var/run/memcached/memcached.pid

root      1701  0.0  0.0   5504   728 pts/0    S+   14:03   0:00 grep memcached

 

 

Memcached启动时参数

-d选项是启动一个守护进程

-m是分配给Memcache使用的内存数量,单位是MB,这里是128MB

-u是运行Memcache的用户,如果当前为 root 的话,需要使用此参数指定用户。

-l是监听的服务器IP地址

[root@xclinux ~]# vim /etc/sysconfig/memcached

增加OPTIONS=”-l 127.0.0.1″

/etc/init.d/memcached restart

[root@xclinux ~]# ps aux |grep memcached

498       1732  0.0  0.0  56276   820 ?        Ssl  14:09   0:00 memcached -d -p 11211 -u memcached -m 128 -c 1024 -P /var/run/memcached/memcached.pid -l 127.0.0.1

root      1740  0.0  0.0   5504   728 pts/0    S+   14:09   0:00 grep memcached

 

-p是设置Memcache监听的端口,默认是11211

-c选项是最大运行的并发连接数,默认是1024

-P是设置保存Memcache的pid文件

 

 

 

 

查看memcached运行状态

1.memcached-tool 127.0.0.1:11211  stats

或者

echo stats |nc 127.0.0.1 11211  需要安装nc工具  yum install -y nc

若安装libmemcached后,可以使用命令

memstat –servers=127.0.0.1:11211 查看memcached服务状态

 

可以上三种方式可以查看memcached

 

 

 

Memcached命令行

 

 

 

Memcached基本操作

 

Memcached命令行

实验环境需要安装telnett客户端、服务端,并启用。具体参照http://jingyan.baidu.com/article/3c48dd34709e70e10be35835.html

 

telnet  127.0.0.1 11211

set key1 0 300 2   key1 键名   0 标记tag   300 过期时间   2大小2字节
ab       这里的内容必须对应上面的字节数
STORED
get key1

VALUE key1 0 2    0 tag  2 大小

ab

END

quit  退出telnet

[root@xclinux ~]# memcached-tool 127.0.0.1:11211 display

#  Item_Size  Max_age   Pages   Count   Full?  Evicted Evict_Time OOM

1      80B      4447s       1       1      no        0        0    0

 

 

 

Memcached语法规则

<command name> <key> <flags> <exptime> <bytes>\r\n <data block>\r\n

注:\r\n在windows下是Enter键
a) <command name> 可以是”set”, “add”, “replace”。
“set”表示按照相应的<key>存储该数据,没有的时候增加,有的覆盖。
“add”表示按照相应的<key>添加该数据,但是如果该<key>已经存在则会操作失败。
“replace”表示按照相应的<key>替换数据,但是如果该<key>不存在则操作失败。

  1. b) <key> 客户端需要保存数据的key。
  2. c) <flags> 是一个16位的无符号的整数(以十进制的方式表示)。
    该标志将和需要存储的数据一起存储,并在客户端get数据时返回。
    客户可以将此标志用做特殊用途,此标志对服务器来说是不透明的。
  3. d) <exptime> 过期的时间。
    若为0表示存储的数据永远不过期(但可被服务器算法:LRU 等替换)。
    如果非0(unix时间或者距离此时的秒数),当过期后,服务器可以保证用户得不到该数据(以服务器时间为标准)。
  4. e) <bytes> 需要存储的字节数,当用户希望存储空数据时<bytes>可以为0
  5. f) <data block>需要存储的内容,输入完成后,最后客户端需要加上”\r\n”(直接点击Enter)作为”命令头”的结束标志。

 

 

Memcached数据示例

set key3 1 100 4
abcd
STORED

get key3
VALUE key3 1 4
abcd
END

 

replace key3 1 200 5
abcdx
STORED

get key3
VALUE key3 1 5
abcdx
END

 

delete key3
DELETED

get key3
END

 

php连接memcached

 

 

1.先安装php的memcache扩展

# wget  http://www.lishiming.net/data/attachment/forum/memcache-2.2.3.tgz
# tar zxf memcache-2.2.3.tgz
# cd memcache-2.2.3
# /usr/local/php/bin/phpize   这一步是为了生成./configure文件
# ./configure –with-php-config=/usr/local/php/bin/php-config
# make && make install

2.安装完后会有类似这样的提示:
Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/

把这个记住,然后修改php.ini,把 extension_dir = “./” 修改为
extension_dir = “/usr/local/servers/php5/lib/php/extensions/no-debug-non-zts-20090626/”

并添加一行
extension=”memcache.so”

 

注意:

更正关于第2点中的,extension_dir = “./”默认即为/usr/local/servers/php5/lib/php/extensions/no-debug-non-zts-20090626/,故可以不做修改。但是要修改为其他目录时,必须更改此处。例如当存放memcache.so的文件为/usr/local/doc时,需要修改为extension_dir = “/usr/local/doc ”

 

 

PHP连接Memcached 检验

/usr/local/php/bin/php -m |grep memcache

下载测试php脚本

cd /usr/local/apache2/htdocs/

curl www.apelearn.com/study_v2/.memcache.txt > 1.php 2>/dev/null

 

1.php是编写的一个测试php的memcache模块的脚本,以下可以看到脚本成功执行。可以去php.ini中注释掉memcache.so模块,会发现脚本无法成功执行。

[root@xclinux htdocs]# /usr/local/php/bin/php 1.php

Get key1 value: This is first value<br>Get key1 value: This is replace value<br>Get key2 value: Array

(

[0] => aaa

[1] => bbb

[2] => ccc

[3] => ddd

)

 

 

Memcached 实现session共享

本实例一下三种情况分别是在lamp/lnmp环境下实现(lamp、lnmp通用)、apache、nginx。我这里实验采用第一种配置。

[root@xclinux htdocs]# vim /usr/local/php/etc/php.ini

;session.save_handler = files  将此行注释

编辑php.ini添加两行

session.save_handler = memcache
session.save_path = “tcp://127.0.0.1:11211”

或者httpd.conf中对应的虚拟主机中添加

php_value session.save_handler “memcache”
php_value session.save_path “tcp:// 127.0.0.1:11211″

或者php-fpm.conf对应的pool中添加

php_value[session.save_handler] = memcache

php_value[session.save_path] = ” tcp:// 127.0.0.1:11211 ”

 

注意:

这里的127.0.0.1是在本地测试,如果memcache服务器在远程,只需要输入远程IP即可。

 

 

Memcached session测试

1.wget http://study.lishiming.net/.mem_se.txt

2.mv .mem_se.txt  /usr/local/apache2/htdocs/session.php

3.curl localhost/session.php

1472894398<br><br>1472894398<br><br>1n06tpf95h1861vv50pvf8v7l2

4.[root@xclinux htdocs]# !telnet

telnet 127.0.0.1 11211

  1. get 1n06tpf95h1861vv50pvf8v7l2

VALUE 1n06tpf95h1861vv50pvf8v7l2 0 37

TEST|i:1472894398;TEST3|i:1472894398;

END

 

可以看到4中的和5中的绿色数字相同,说明memcache session测试成功。

 

注意:

在进行memcached session测试之前必须重启apache

 

 

也可以使用phpinfo打印memcache的session测试实验是否成功。

[root@xclinux htdocs]# vim info.php

<?php

phpinfo();

?>

[root@xclinux htdocs]# curl localhost/info.php

[root@xclinux htdocs]# curl localhost/info.php|grep memcache

% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current

Dload  Upload   Total   Spent    Left  Speed

100 16194    0 16194    0     0  10.5M      0 –:–:– –:–:– –:–:– 10.5M<h2><a name=”module_memcache”>memcache</a></h2>

<tr class=”h”><th>memcache support</th><th>enabled</th></tr>

<tr><td class=”e”>memcache.allow_failover</td><td class=”v”>1</td><td class=”v”>1</td></tr>

<tr><td class=”e”>memcache.chunk_size</td><td class=”v”>8192</td><td class=”v”>8192</td></tr>

<tr><td class=”e”>memcache.default_port</td><td class=”v”>11211</td><td class=”v”>11211</td></tr>

<tr><td class=”e”>memcache.hash_function</td><td class=”v”>crc32</td><td class=”v”>crc32</td></tr>

<tr><td class=”e”>memcache.hash_strategy</td><td class=”v”>standard</td><td class=”v”>standard</td></tr>

<tr><td class=”e”>memcache.max_failover_attempts</td><td class=”v”>20</td><td class=”v”>20</td></tr>

<tr><td class=”e”>Registered save handlers </td><td class=”v”>files user sqlite memcache  </td></tr>

<tr><td class=”e”>session.save_handler</td><td class=”v”>memcache</td><td class=”v”>memcache</td></tr>

100 54643    0 54643    0     0  31.5M      0 –:–:– –:–:– –:–:– 36.6M

 

 

未经允许不得转载: » memcached
微信公众号:这是个测试
关注我们,每天分享更多有趣的事儿,有趣有料!
12000人已关注
分享到:
赞(0) 打赏

评论抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏