1Memcache是什么
Memcache是danga.com的一个项目,最早是为LiveJournal服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。
它可以应对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,Memcached自管理这些HashTable。
为什么会有Memcache和memcached两种名称?
其实Memcache是这个项目的名称,而memcached是它服务器端的主程序文件名,
Memcache官方网站:http://www.danga.com/memcached,
2Memcache工作原理
首先memcached是以守护程序方式运行于一个或多个服务器中,随时接受客户端的连接操作,客户端可以由各种语言编写,目前已知的客户端API包括Perl/PHP/Python/Ruby/Java/C#/C等等。客户端在与memcached服务建立连接之后,接下来的事情就是存取对象了,每个被存取的对象都有一个唯一的标识符key,存取操作均通过这个key进行,保存到memcached中的对象实际上是放置内存中的,并不是保存在cache文件中的,这也是为什么memcached能够如此高效快速的原因。注意,这些对象并不是持久的,服务停止之后,里边的数据就会丢失。
与许多cache工具类似,Memcached的原理并不复杂。它采用了C/S的模式,在server端启动服务进程,在启动时可以指定监听的ip,自己的端口号,所使用的内存大小等几个关键参数。一旦启动,服务就一直处于可用状态。Memcached的目前版本是通过C实现,采用了单进程,单线程,异步I/O,基于事件(event_based)的服务方式.使用libevent作为事件通知实现。多个Server可以协同工作,但这些Server之间是没有任何通讯联系的,每个Server只是对自己的数据进行管理。Client端通过指定Server端的ip地址(通过域名应该也可以)。需要缓存的对象或数据是以key->value对的形式保存在Server端。key的值通过hash进行转换,根据hash值把value传递到对应的具体的某个Server上。当需要获取对象数据时,也根据key进行。首先对key进行hash,通过获得的值可以确定它被保存在了哪台Server上,然后再向该Server发出请求。Client端只需要知道保存hash(key)的值在哪台服务器上就可以了。
其实说到底,memcache的工作就是在专门的机器的内存里维护一张巨大的hash表,来存储经常被读写的一些数组与文件,从而极大的提高网站的运行效率。
3如何使用
-
建立Manager类
java代码:
-
packagecom.alisoft.sme.memcached;
-
-
importjava.util.Date;
-
-
importcom.danga.MemCached.MemCachedClient;
-
importcom.danga.MemCached.SockIOPool;
-
-
publicclassMemCachedManager{
-
-
-
protectedstaticMemCachedClientmcc=newMemCachedClient();
-
-
protectedstaticMemCachedManagermemCachedManager=newMemCachedManager();
-
-
-
static{
-
-
String[]servers={"127.0.0.1:11211"};
-
Integer[]weights={3};
-
-
-
SockIOPoolpool=SockIOPool.getInstance();
-
-
-
pool.setServers(servers);
-
pool.setWeights(weights);
-
-
-
pool.setInitConn(5);
-
pool.setMinConn(5);
-
pool.setMaxConn(250);
-
pool.setMaxIdle(1000*60*60*6);
-
-
-
pool.setMaintSleep(30);
-
-
-
pool.setNagle(false);
-
pool.setSocketTO(3000);
-
pool.setSocketConnectTO(0);
-
-
-
pool.initialize();
-
-
-
mcc.setCompressEnable(true);
-
mcc.setCompressThreshold(64*1024);
-
}
-
-
-
-
-
-
protectedMemCachedManager(){
-
-
}
-
-
-
-
-
-
-
publicstaticMemCachedManagergetInstance(){
-
returnmemCachedManager;
-
}
-
-
-
-
-
-
-
-
-
publicbooleanadd(Stringkey,Objectvalue){
-
returnmcc.add(key,value);
-
}
-
-
publicbooleanadd(Stringkey,Objectvalue,Dateexpiry){
-
returnmcc.add(key,value,expiry);
-
}
-
-
publicbooleanreplace(Stringkey,Objectvalue){
-
returnmcc.replace(key,value);
-
}
-
-
publicbooleanreplace(Stringkey,Objectvalue,Dateexpiry){
-
returnmcc.replace(key,value,expiry);
-
}
-
-
-
-
-
-
-
-
publicObjectget(Stringkey){
-
returnmcc.get(key);
-
}
-
-
publicstaticvoidmain(String[]args){
-
MemCachedManagercache=MemCachedManager.getInstance();
-
cache.add("hello",234);
-
System.out.print("getvalue:"+cache.get("hello"));
-
}
-
}
建立数据对象
java代码:
-
packagecom.alisoft.sme.memcached;
-
-
importjava.io.Serializable;
-
-
publicclassTBeanimplementsSerializable{
-
-
privatestaticfinallongserialVersionUID=1945562032261336919L;
-
-
privateStringname;
-
-
publicStringgetName(){
-
returnname;
-
}
-
-
publicvoidsetName(Stringname){
-
this.name=name;
-
}
-
}
创建测试用例
java代码:
-
packagecom.alisoft.sme.memcached.test;
-
-
importjunit.framework.TestCase;
-
-
importorg.junit.Test;
-
-
importcom.alisoft.sme.memcached.MemCachedManager;
-
importcom.alisoft.sme.memcached.TBean;
-
-
publicclassTestMemcachedextendsTestCase{
-
-
privatestaticMemCachedManagercache;
-
-
@Test
-
publicvoidtestCache(){
-
-
TBeantb=newTBean();
-
tb.setName("E网打进");
-
cache.add("bean",tb);
-
-
TBeantb1=(TBean)cache.get("bean");
-
System.out.println("name="+tb1.getName());
-
tb1.setName("E网打进_修改的");
-
-
tb1=(TBean)cache.get("bean");
-
System.out.println("name="+tb1.getName());
-
}
-
-
@Override
-
protectedvoidsetUp()throwsException{
-
super.setUp();
-
cache=MemCachedManager.getInstance();
-
}
-
-
@Override
-
protectedvoidtearDown()throwsException{
-
super.tearDown();
-
cache=null;
-
}
-
-
}
测试结果
java代码:
-
[INFO]++++serializingforkey:beanforclass:com.alisoft.sme.memcached.TBean
-
[INFO]++++memcachecmd(resultcode):addbean8093(NOT_STORED)
-
[INFO]++++datanotstoredincacheforkey:bean
-
[INFO]++++deserializingclasscom.alisoft.sme.memcached.TBean
-
name=E网打进
-
[INFO]++++deserializingclasscom.alisoft.sme.memcached.TBean
-
name=E网打进
分享到:
相关推荐
赠送jar包:netty-codec-memcache-4.1.73.Final.jar; 赠送原API文档:netty-codec-memcache-4.1.73.Final-javadoc.jar; 赠送源代码:netty-codec-memcache-4.1.73.Final-sources.jar; 赠送Maven依赖信息文件:...
Memcache-client for php 一个PHP 的 Memcached缓存 客户端
赠送jar包:netty-codec-memcache-4.1.73.Final.jar; 赠送原API文档:netty-codec-memcache-4.1.73.Final-javadoc.jar; 赠送源代码:netty-codec-memcache-4.1.73.Final-sources.jar; 赠送Maven依赖信息文件:...
Memcache-eAccelerator-APC-Xcache-Redis 五种php缓存加速器特点浅析.docx
ehcache-memcache-redis三大缓存男高音.docx
本教程用到的memcache扩展,可根据自己的PHP版本去官网下载合适自己的版本 本教程用到的memcache扩展,可根据自己的PHP版本去官网下载合适自己的版本
缓存框架-Memcache的例子
资源来自pypi官网。 资源全名:nexus-memcache-0.3.6.tar.gz
Java 高性能缓存(Memcache) ,缓存思路
memcache-collections 是 memcache 高速缓存系统中的产生并发式和分布式数据结构开发包。memcache 是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据...
Memcache缓存技术,Memcache配置说明及其文件,PHP5.2.6版本内存缓存技术配置,PHP运行环境PHP5.2.6版本的配置,操作系统是windows下
主要封装了memcache的缓存机制。使用者可以通过实例对象直接调用工程中的方法进行存取
memcache是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发,但目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的、需要频繁访问数据库的网站访问速度提升效果十分显著[1] 。这是一套...
memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。
在服务器的内存开辟一块内存,可供不同的系统访问,实行不同系统间的缓存共享。memcache
memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。Memcache是danga.com的一个项目,最早是...
整理了一个Memcache数据缓存操作类库文件,希望对各位会有帮助,操作类就是把一些常用的一系列的数据库或相关操作写在一个类中,这样调用时我们只要调用类文件,如果要执行相关操作就直接调用类文件中的方法函数就可以...
文件中包含MemCache和Redis的jar包、下载的exe文件以及相关介绍和配置!
Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数数据调用到内存中,然后...
django-memcache-状态此应用程序在Django管理部分的索引视图中显示您的实例的当前负载和一些统计信息。 目前,这些Memcached绑定已经过测试: 后端支持带有 :check_mark_button: > = v1.57可以正常工作pylibmc与 :...