分布式缓存系统Memcached学习心得
http://www.iteye.com/topic/208981
缘起: 在数据驱动的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 1.2.1 for Win32 binaries (Dec 23, 2006)
1 解压缩文件到c:\memcached
2 命令行输入 'c:\memcached\memcached.exe -d install'
3 命令行输入 'c:\memcached\memcached.exe -d start' ,该命令启动 Memcached ,默认监听端口为 11211
通过 memcached.exe -h 可以查看其帮助
二、客户端使用
下载memcached java client:http://www.whalin.com/memcached/#download
1 解压后将java_memcached-release_2.0.1.jar 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 pool = 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 );
- }
-
- public static void bulidCache(){
-
-
- mcc.set( "test", "This is a test String" ,new Date(11211));
-
-
- }
-
- public static void output() {
-
- String value = (String) mcc.get( "test" );
- System.out.println(value);
- }
-
- public static void main(String[] args){
- bulidCache();
- output();
- }
-
- }
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 );
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" );
System.out.println(value);
}
public static void main(String[] args){
bulidCache();
output();
}
}
分享到:
相关推荐
分布式缓存系统在现代Web开发中扮演...总的来说,分布式缓存系统Memcached是现代Web应用中不可或缺的工具。通过深入学习和实践,我们可以充分利用其优势,优化应用性能,减轻数据库压力,从而提供更高效、稳定的服务。
通过阅读《大型分布式网站架构设计与实践》,读者不仅可以学习到分布式系统的设计原理,还能了解到各种实际案例,这对于从事互联网开发或架构设计的人来说是一份宝贵的参考资料。同时,结合文中提到的源码分析和工具...
其中Memcached是一个高性能的分布式内存对象缓存系统,主要用于缓存数据库查询结果和动态Web内容;HBase是基于Google的BigTable模型构建的,支持高可靠性的分布式存储系统;Cassandra是一个高度可扩展的分布式NoSQL...
- **Memcached**:分布式缓存系统,用于减轻数据库负担。 - **Redis**:提供持久化的键值存储,支持多种数据结构。 - **消息队列**:如RabbitMQ、Kafka等,用于解耦系统组件。 - **负载均衡**:使用软件或硬件...
**memcached** 是一个高性能的分布式内存对象缓存系统,用于减轻数据库负载,通过在内存中缓存数据和对象来减少读取数据库的次数,从而极大地提高了动态Web应用的速度。 **重要知识点**: - **memcached的工作原理...
美国Facebok.com,中国Yeejee.com,日本mixi.jp均采用开源分布式缓存服务器Memcache 52 3,图片缓存和加 52 memcached+squid+apache deflate解决网站大访问量问题 52 FeedBurner:基于MySQL和JAVA的可扩展Web...
最后,考虑到网站的可扩展性和性能优化,可能采用了缓存策略(如Redis或Memcached)来减少数据库负载,以及负载均衡和分布式计算技术来应对高并发访问。同时,SEO(搜索引擎优化)也是提升网站可见性的重要一环,这...
此外,Redis还支持主从复制,能构建高可用的分布式系统。 Redis的性能非常高,如描述中提到,SET操作每秒钟可达110000次,GET操作每秒81000次,这得益于其数据都存储在内存中。Redis提供了丰富的命令接口,例如: -...