在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载。缓存是解决这个问题的好办法。
Memcached是什么?
Memcached是由Danga Interactive开发的,高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。
Memcached能缓存什么?
通过在内存里维护一个统一的巨大的hash表,Memcached能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。
Memcached快么?
非常快。Memcached使用了libevent(如果可以的话,在linux下使用epoll)来均衡任何数量的打开链接,使用非阻塞的网络I/O,对内部对象实现引用计数(因此,针对多样的客户端,对象可以处在多样的状态), 使用自己的页块分配器和哈希表, 因此虚拟内存不会产生碎片并且虚拟内存分配的时间复杂度可以保证为O(1).。
Danga Interactive为提升Danga Interactive的速度研发了Memcached。目前,LiveJournal.com每天已经在向一百万用户提供多达两千万次的页面访问。而这些,是由一个由web服务器和数据库服务器组成的集群完成的。Memcached几乎完全放弃了任何数据都从数据库读取的方式,同时,它还缩短了用户查看页面的速度、更好的资源分配方式,以及Memcache失效时对数据库的访问速度。
Memcached的特点
Memcached的缓存是一种分布式的,可以让不同主机上的多个用户同时访问, 因此解决了共享内存只能单机应用的局限,更不会出现使用数据库做类似事情的时候,磁盘开销和阻塞的发生。
memcached不互相通信的分布式
memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。 各个memcached不会互相通信以共享信息。那么,怎样进行分布式呢? 这完全取决于客户端的实现。
Memcached的使用
Windows下的Memcache安装
1、下载memcache for windows。下载地址:
memcached 1.2.4 Win32 Beta
- memcached 1.2.4 Win32 Beta Binaries (09.03.2008)
- memcached 1.2.4 Win32 Beta Source (09.03.2008)
- memcached 1.2.4 Win32 Beta Patch for SVN revision 662 (tag 1.2.4) (09.03.2008)
- 其他版本
解压(本例中解压到c:\memcached)。
2、在命令行状态下输入: c:\memcached\memcached.exe -d install 。至此memcached已经安装成windows服务
3、在命令行下输入: c:\memcached\memcached.exe -d start 以启动memcached服务。当然也可以选择在windows服务中启动
4、修改端口方法:
c:\memcached\memcached.exe -p 12345 -m 1024 -d start , -p 表示要修改的端口, -m表示占用的最大内存(单位为M)。
但是无论怎么调用这个命令,发现端口一直还是11211。
打开windows服务控制面板一看,发现memcached.exe 默认安装的服务器启动参数中根本没写-p -m的参数,只有1个 -d runservice参数。
所以不管用什么命令启动服务都是没用的,于是就想到直接修改windows服务的启动参数,操作如下,打开注册表,找到:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\memcached Server
其中的ImagePath项的值为:”c:\memcached\memcached.exe” -d runservice
改成:”c:\memcached\memcached.exe” -p 12345 -m 128 -d runservice
保存后重新启动memcached服务,然后在命令行中输入netstat -n -a 看看现在端口是不是改啦,^_^。
你没看错,就是这么简单,简简单单的三步memcache的服务器端就准备完毕
Java引用Memcached模块支持
客户端使用
下载memcached java client:https://github.com/gwhalin/Memcached-Java-Client/downloads
1 解压后将java_memcached-release_2.6.6.zip jar包添加到工程的classpath中
2 利用memcached java client 一个简单的应用
package com.danga.MemCached.test;
import java.util.Date;
import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool;
public class Test {
protected static MemCachedClient mcc = new MemCachedClient();
static {
String[] servers ={“192.168.40.4:12000”};
Integer[] weights = { 3 };
//创建一个实例对象SockIOPool
SockIOPool pool = SockIOPool.getInstance();
// set the servers and the weights
//设置Memcached Server
pool.setServers( servers );
pool.setWeights( weights );
// set some basic pool settings
// 5 initial, 5 min, and 250 max conns
// and set the max idle time for a conn
// to 6 hours
pool.setInitConn( 5 );
pool.setMinConn( 5 );
pool.setMaxConn( 250 ); &nb
sp;
pool.setMaxIdle( 1000 * 60 * 60 * 6 );
// set the sleep for the maint thread
// it will wake up every x seconds and
// maintain the pool size
pool.setMaintSleep( 30 );
// Tcp的规则就是在发送一个包之前,本地机器会等待远程主机
// 对上一次发送的包的确认信息到来;这个方法就可以关闭套接字的缓存,
// 以至这个包准备好了就发;
pool.setNagle( false );
//连接建立后对超时的控制
pool.setSocketTO( 3000 );
//连接建立时对超时的控制
pool.setSocketConnectTO( 0 );
// initialize the connection pool
//初始化一些值并与MemcachedServer段建立连接
pool.initialize();
// lets set some compression on for the client
// compress anything larger than 64k
mcc.setCompressEnable( true );
mcc.setCompressThreshold( 64 * 1024 );
}
public static void bulidCache(){
//set(key,value,Date) ,Date是一个过期时间,如果想让这个过期时间生效的话,这里传递的new Date(long date) 中参数date,需要是个大于或等于1000的值。
//因为java client的实现源码里是这样实现的 expiry.getTime() / 1000 ,也就是说,如果 小于1000的值,除以1000以后都是0,即永不过期
mcc.set( “test”, “This is a test String” ,new Date(11211));
//十秒后过期
}
public static void output() {
//从cache里取值
String value = (String) mcc.get( “test” );
&nb
sp; System.out.println(value);
}
public static void main(String[] args){
bulidCache();
output();
}
}
php安装Memcached模块支持
1、下载php_memcache.dll模块,你可以从http://downloads.php.net/pierre/找到对应的版本,
php5.3的直接下载http://shikii.net/blog/downloads/php_memcache-cvs-20090703-5.3-VC6-x86.zip
2、修改php.ini,添加如下内容:
extension=php_memcache.dll
3、重启apache服务器,然后查看一下phpinfo,如果有memcache,那么就说明安装成功!
测试windows下的Memcached
测试代码如下:
<?php $mem = new Memcache; $mem->connect(“127.0.0.1”, 11211); $mem->set(‘key’, ‘Hello Memcached!’, 0, 60); $val = $mem e=”color:#339933″>->get(‘key’); echo $val;
更多测试代码,需要移步:
http://www.php.net/manual/en/memcache.examples-overview.php
Memcached的基本设置
-p 监听的端口
-l 连接的IP地址, 默认是本机
-d start 启动memcached服务
-d restart 重起memcached服务
-d stop|shutdown 关闭正在运行的memcached服务
-d install 安装memcached服务
-d uninstall 卸载memcached服务
-u 以的身份运行 (仅在以root运行的时候有效)
-m 最大内存使用,单位MB。默认64MB
-M 内存耗尽时返回错误,而不是删除项
-c 最大同时连接数,默认是1024
-f 块大小增长因子,默认是1.25
-n 最小分配空间,key+value+flags默认是48
-h 显示帮助
Memcache安装参考资源
http://www.codeforest.net/how-to-install-memcached-on-windows-machine
http://shikii.net/blog/installing-memcached-for-php-5-3-on-windows-7/