关于memcache与memcached,首先服务器上安装的提供服务的软件名称叫memcached,不过我们通常都叫它memcache,PHP用来连接操作memcached的扩展有两个,即memcache扩展和memcached扩展。
一、编绎安装Memcached
1、环境准备
系统:Centos6.4最小安装+开发工具包
Memcached所需要的库:libevent
2、安装libevent
# tar xzvf libevent-1.4.14b-stable.tar.gz # cd libevent-1.4.14b-stable # ./configure --prefix=/usr/local/libevent # Make && make install
3、安装memcached
# tar xzvf memcached-1.4.5.tar.gz # cd memcached-1.4.5 # ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent # make && make install
二、Memcached基本命令
1、启动 memcached
./memcached -d -m 2048 -p 11211 # 常用启动参数 -d 启动一个守护进程 -vv 调试信息和错误输出到控制台 -m 分配给memcache使用的内存数量,单位是mb,默认是64mb -u 运行memcached的用户 -l 监听的服务器ip地址 -p 设置memcached监听的端口,最好是1024以上的端口 -c 设置最大运行的并发连接数,默认是1024 -P 设置保存memcached的pid文件
这会以守护程序的形式启动 memcached(-d),为其分配 2GB 内存(-m 2048),并指定监听 localhost,即端口 11211。
2、连接到 memcached
telnet localhost 11211
3、memcached增删改查
3.1 修改命令语法
command <key> <flags> <expiration> <bytes> <value> command 操作命令:set、add、repalce Key 字符串,<250个字符,不包含空格和控制字符 Flags 客户端用来标识数据格式的数值,如json,xml,压缩等 Expiration 存活时间(秒),0为永久。 Bytes 在缓存中存储的字节点 Value 存储的值
3.2 set
set 命令用于向缓存添加新的键值对。如果键已经存在,则之前的值将被替换。
set userId 0 30 5 12345 STORED
如果使用 set 命令正确设定了键值对,服务器将使用单词 STORED 进行响应。本示例向缓存中添加了一个键值对,其键为 userId,其值为 12345。并将过期时间设置为 30秒。
3.3 add
仅当缓存中不存在键时,add 命令才会向缓存中添加一个键值对。如果缓存中已经存在键,则之前的值将仍然保持相同,并且您将获得响应 NOT_STORED。
set userId 0 0 5 12345 STORED add userId 0 0 5 55555 NOT_STORED add companyId 0 0 3 564 STORED
3.4 replace
仅当键已经存在时,replace 命令才会替换缓存中的键。如果缓存中不存在键,那么您将从 memcached 服务器接受到一条 NOT_STORED 响应。
replace accountId 0 0 5 67890 NOT_STORED set accountId 0 0 5 67890 STORED replace accountId 0 0 5 55555 STORED
3.5 get
get 命令用于检索与之前添加的键值对相关的值,如果这个键存在于缓存中,则返回相应的值。如果不存在,则不返回任何内容。
set userId 0 0 5 12345 STORED get userId VALUE userId 0 5 12345 END get bob END
3.6 delete
delete 命令用于删除 memcached 中的任何现有值。您将使用一个键调用 delete,如果该键存在于缓存中,则删除该值。如果不存在,则返回一条 NOT_FOUND 消息。
set userId 0 0 5 98765 STORED delete bob NOT_FOUND delete userId DELETED get userId END
4、缓存管理命令
4.1 stats
stats 命令的功能是转储所连接的memcached实例的当前统计数据。
stats STAT pid 63 STAT uptime 101758 STAT time 1248643186 STAT version 1.4.11 STAT pointer_size 32 STAT rusage_user 1.177192 STAT rusage_system 2.365370 STAT curr_items 2 STAT total_items 8 STAT bytes 119 STAT curr_connections 6 STAT total_connections 7 STAT connection_structures 7 STAT cmd_get 12 STAT cmd_set 12 STAT get_hits 12 STAT get_misses 0 STAT evictions 0 STAT bytes_read 471 STAT bytes_written 535 STAT limit_maxbytes 67108864 STAT threads 4
4.2 flush_all
flush_all用于清理缓存中的所有名称/值对。
三、缓存性能
名称 |
描述 |
pid |
Memcached进程ID |
uptime |
Memcached运行时间,单位:秒 |
time |
Memcached当前的UNIX时间 |
version |
Memcached的版本号 |
rusage_user |
该进程累计的用户时间,单位:秒 |
rusage_system |
该进程累计的系统时间,单位:秒 |
curr_connections |
当前连接数量 |
total_connections |
Memcached运行以来接受的连接总数 |
connection_structures |
Memcached分配的连接结构的数量 |
cmd_get |
查询请求总数 |
get_hits |
查询成功获取数据的总次数 |
get_misses |
查询成功未获取到数据的总次数 |
cmd_set |
存储(添加/更新)请求总数 |
bytes |
Memcached当前存储内容所占用字节数 |
bytes_read |
Memcached从网络读取到的总字节数 |
bytes_written |
Memcached向网络发送的总字节数 |
limit_maxbytes |
Memcached在存储时被允许使用的字节总数 |
curr_items |
Memcached当前存储的内容数量 |
total_items |
Memcached启动以来存储过的内容总数 |
evictions |
LRU释放对象数,用来释放内存 |
根据stats所获得到的统计结果,我们可以确定缓存的利用率。初次启动缓存时,可以看到 get_misses会自然地增加,但在经过一定的使用量之后,get_misses值应该会逐渐趋于平稳,这表示缓存主要用于常见的读取操作。确定缓存效率的另一种方法是查看缓存的命中率(hit ratio)。缓存命中率表示执行get的次数与错过get的次数的百分比,即get_hits/cmd_get*100%。
四、PHP扩展模块安装
Memcache扩展安装
下载地址:http://pecl.php.net/package/memcache
# tar zxvf memcache-2.2.7.tgz # cd memcache-2.2.7 # /usr/local/php/bin/phpize # ./configure --with-php-config=/usr/local/php/bin/php-config # make && make install
# 完成之后会显示扩展文件的安装路径,类似:/usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/ # 编辑php.ini # 确保extension_dir的路径为make install之后显示的路径 # 加入extension = memcache.so
Memcached扩展安装
软件准备:libmemcached、memcached
libmemcached下载地址:https://launchpad.net/libmemcached/+download
memcached下载地址:http://pecl.php.net/package/memcached
#安装libmemcached # tar zxvf libmemcached-1.0.17.tar.gz # cd libmemcached-1.0.17 # ./configure --prefix=/usr/local/libmemcached --with-memcached # make && make install
#安装memcached # tar zxvf memcached-2.1.0.tgz # cd memcached-2.1.0 # /usr/local/php/bin/phpize # ./configure --with-php-config=/usr/local/php/bin/php-config --with-libmemcached-dir=/usr/local/libmemcached # make && make install
#完成之后会显示扩展文件的安装路径,类似:/usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/ # 编辑php.ini # 确保extension_dir的路径为make install之后显示的路径 # 加入extension = memcached.so
五、设置session用memcache来存储
方法I: 在php.ini中全局设置 session.save_handler = memcache session.save_path = "tcp://127.0.0.1:11211"
方法II: 再程序中动态设置 ini_set("session.save_handler", "memcache"); ini_set("session.save_path", "tcp://127.0.0.1:11211");
方法III: htaccess 文件设置 php_value session.save_handler "memcache" php_value session.save_path "tcp://127.0.0.1:11211"
session.save_path可以带额外的参数"persistent"、"weight"、"timeout"、"retry_interval" 等等,使用多个memcached服务器时用逗号","隔开,如:" tcp://host1:port1?persistent=1&weight=2,tcp://host2:port2 "。
六、PHP使用Memcache的一致性哈希连接方式
PHP中自带了两个memcache扩展,即memcache扩展和memcached扩展,默认情况下,两个扩展均采用余数计算分散的分布式算法,这种分布式在添加或移除服务器时,缓存重组的代价相当巨大。添加或移除服务器后,余数就会产生巨变,这样就无法获取与保存时相同的服务器,从而影响缓存的命中率,在Web应用程序中使用memcached时,在添加memcached服务器的瞬间缓存效率会大幅度下降,负载会集中到数据库服务器上,有可能会数据库服务器的崩溃,因此推荐使用一致性哈希算法。一至性哈希算法(Consistent Hashing)能够最大限度地减小服务器增减时的缓存重新分布。
Memcache扩展使用一至性哈希算法配置:
修改php.ini memcache.hash_strategy = 'consistent'; 也可以在程序中动态设置 ini_set('memcache.hash_strategy', 'consistent');
Memcached扩展使用一至性哈希算法配置:
$mc = new memcached(); $mc->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT ); $mc->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE , true);
Memcache服务器端都是直接通过客户端连接后直接操作,没有任何的验证过程,这样如果服务器是直接暴露在互联网上的话是比较危险,轻则数据泄露被其他无关人员查看,重则服务器被入侵,因为Mecache是以root权限运行的,况且里面可能存在一些我们未知的bug或者是缓冲区溢出的情况,这些都是我们未知的,所以危险性是可以预见的。为了安全起见,我做两点建议,能够稍微的防止黑客的入侵或者数据的泄露。
内网访问
最好把两台服务器之间的访问是内网形态的,一般是Web服务器跟Memcache服务器之间。普遍的服务器都是有两块网卡,一块指向互联网,一块指向内网,那么就让Web服务器通过内网的网卡来访问Memcache服务器,我们Memcache的服务器上启动的时候就监听内网的IP地址和端口,内网间的访问能够有效阻止其他非法的访问。
# memcached -d -m 1024 -u root -l 192.168.0.200 -p 11211 -c 1024 -P /tmp/memcached.pid Memcached服务器端设置监听通过内网的192.168.0.200的ip的11211端口,占用1024MB内存,并且允许最大1024个并发连接
设置防火墙
防火墙是简单有效的方式,如果却是两台服务器都是挂在网的,并且需要通过外网IP来访问Memcache的话,那么可以考虑使用防火墙或者代理程序来过滤非法访问。
一般我们在Linux下可以使用iptables或者FreeBSD下的ipfw来指定一些规则防止一些非法的访问,比如我们可以设置只允许我们的Web服务器来访问我们Memcache服务器,同时阻止其他的访问。
# iptables -F # iptables -P INPUT DROP # iptables -A INPUT -p tcp -s 192.168.0.2 –dport 11211 -j ACCEPT # iptables -A INPUT -p udp -s 192.168.0.2 –dport 11211 -j ACCEPT
上面的iptables规则就是只允许192.168.0.2这台Web服务器对Memcache服务器的访问,能够有效的阻止一些非法访问,相应的也可以增加一些其他的规则来加强安全性,这个可以根据自己的需要来做。