##Memcached 官网地址(http://memcached.org)
介绍:
1、一个开源的、支持高性能、高并发的分布式内存缓存系统,由C语言编写,总共2000多行代码
2、Memcached分为服务器端和客户端两部分,其中服务器端软件的名字形如Memcached-1.4.24.tar.gz,客户端软件名字形如Memcache-2.25.tar.gz
3、全部的数据都存放于Memcached服务实现分配好的内存中,无持久化存储的设计,和系统的物理内存一样,当重启系统或Memcached服务时,Memcached内存中的数据就会丢失,如果希望重启后,数据仍然能后保存,name就可以采用Redis这样的持久化内存缓存系统
##Memcached的作用:
传统场景中,多数web应用都将数据保存到关系型数据库中(例如:Mysql),Web服务器从中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中,关系型数据库的负担就会加重,出现响应缓慢,导致网站打开延迟等问题,影响用户体验
这时候就需要Memcached软件出马了,使用Memcached的主要目的是,通过自身内存中缓存关系型数据库的查询结果,减少数据库被访问的次数,以提高动态Web应用的响应速度,提高网站架构的并发能力和可扩展性。
内存管理机制:
采用slab内存分配机制
采用LRU对象清除机制
采用hash机制快速检索item
多线程管理机制:
多线程处理时采用的是pthread(POSIX)线程模式
若要激活多线程,可在编译时指定:./configure --enable-threads
删除机制:
当删除item对象时,一般不释放内存空间,而是做删除标记,将指针放入slot回收插槽,下次分配的时候直接使用
当内存空间满的时候,将会根据LRU算法把最近最少使用的item对象删除
数据存入可以设定过期时间,但是数据过期后不会被立即被删除,而是在get时检查item对象是否过期以及是否应该删除
##Memcached预热理念及集群节点的正确重启方法
1、Memcached 预热理念
当需要大面积重启Memcached时,首先要在前端控制网站入口的访问流量,然后,重启Memcached集群并进行数据预热,所有数据都预热完毕之后,在逐步放开前端网站入口的流量
2、如何正确的开启网站集群服务器
如果由于机房断电或者搬迁服务器集群到新机房,那么启动集群服务器时,一定要从服务集群的后端依次往前端开启,特别是开启Memcached缓存服务器时要提前预热
##Memcached服务安装
yum -y install libevent libevent-devel nc yum -y install memecached
启动Memcached:
memcached -m 16m -p 11211 -d -u root -c 8192
#也可以启动多个实例
memcached -m 16m -p 11212 -d -u root -c 8192
##Memcached启动命令相关参数:
memcached -h
命令参数 | 说明 |
-d | 以守护进程(daemon)方式运行 |
-u | 指定运行Memcached的用户,如果当前用户为root,需要使用此参数指定用户 |
-l | 指定Memcached进程监听的服务器IP地址,可以不设置此参数 |
-p(小写) | 指定Memcached服务监听的TCP端口号,默认为11211 |
-P(大写) | 设置保存Memcached的pid文件($$),保存pid到指定文件 |
-m | 指定Memcached服务可以缓存数据的最大内存,默认为64M |
-M | Memcached服务内存不够用时禁止LRU,如果内存满了会报错 |
-n | 为key+value+flags分配的最小内存空间,默认为48字节 |
-f | chunk size增长因子,默认为1.25 |
-L | 启用大内存页,可以降低内存浪费,改进性能 |
-c | 最大的并发连接数,默认1024 |
-t | 线程数,默认4,由于Memcached采用的是NIO,所以太多线程作用不大 |
-R | 每个event最大请求数,默认20 |
-C | 禁用CAS(可以禁止版本计数,减少开销) |
-v | 打开较少的errors/warnings |
-vv | 打印非常多的调试信息和错误输出到控制台,也打印客户端命令及响应 |
-vvv | 打印极多的调试信息和错误输出,也打印内部状态转变 |
命令 | 说明 |
Command name |
set 无论如何都进行写入数据,会覆盖老数据 add 只有对应数据不存在时才添加数据 replace 只有数据存在时进行替换数据 append 往后追加:append <key> datablock <status> prepend 往前追加 prepend <key> datablock <status> cas 按版本号更改 |
key | 普通字符串,要求小于250个字符,不包含空格和控制字符 |
flags | 客户端用来标识数据格式的数值,如json,xml,压缩等 |
exptime | 存活时间s,0为永远,小于30天,60*60*24*30为秒数,大于30天为unixtime |
bytes | byte字节数,不包含 ,根据长度截取存/取得字符串,可以是0,即存空值 |
datablock | w文本行,以 结尾,当然可以包含 或 |
status |
STORED/NOT_STORED/EXISTS/NOT_FOUND ERROR/CLIENT_ERROR/SERVER_ERROR服务器端会关闭连接以修复 |
##关闭memcached
killall memecached 或 pkill memecached
##企业场景的如何配置Memcached
一般是开发人员踢出需求,运维人员接到这个不确定的需求后,需要和开发人员沟通,指定内存为多大或者开发人员商量如何根据具体业务来制定内存缓存的大小。
此外,还要确定业务的重要性,进而决定是否采用负载均衡,分布式缓存等集群架构,最后确定使用多大的连接数
PHP安装memcached插件(Memcached分为客户端和服务端)
##PHP的Memcached扩展插件下载地址 为: http://pecl.php.net/package/memcache
[root@localhost ~]# cd /usr/local/src/ [root@localhost src]# wget -q http://pecl.php.net/get/memcache-2.2.7.tgz [root@localhost src]# tar xf memcache-2.2.7.tgz [root@localhost src]# cd memcache-2.2.7
[root@localhost memcache-2.2.7]# find / -name phpize
/usr/local/php/bin/phpize
[root@localhost memcache-2.2.7]# /usr/local/php/bin/phpize
Configuring for:
PHP Api Version: 20121113
Zend Module Api No: 20121212
Zend Extension Api No: 220121212
[root@localhost memcache-2.2.7]# ./configure --enable-memcache --with-php-config=/usr/local/php/bin/php-config
[root@localhost memcache-2.2.7]# make
[root@localhost memcache-2.2.7]# make install
Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/
修改php.ini
echo "extension = memcache.so" >> /etc/php.ini (要根据你PHP读取的php.ini文件)
最后重启php-fpm
/etc/init.d/php-fpm restart
如果是apacehe :
/usr/local/apache2/bin/apachectl restart
安装成功会输出:memcache。
或者通过浏览器访问 phpinfo() 函数来查看,如下图:
PHP连接Memcached测试脚本:
<?php $memcache = new Memcache; //创建一个memcache对象 $memcache->connect('localhost', 11211) or die ("Could not connect"); //连接Memcached服务器 $memcache->set('key', 'test'); //设置一个变量到内存中,名称是key 值是test $get_value = $memcache->get('key'); //从内存中取出key的值 echo $get_value; ?>
[root@localhost html]# curl 127.0.0.1/test.php test #如果返回test说明成功