总结
这次简单介绍了memcached,以及它的安装方法、Perl客户端Cache::Memcached的用法。只要知道,memcached的使用方法十分简单就足够了。
下次由前坂来说明memcached的内部结构。了解memcached的内部构造,就能知道如何使用memcached才能使Web应用的速度更上一层楼。欢迎继续阅读下一章。 缘起: 在数据驱动的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 一个简单的应用 Java代码
1. package com.danga.MemCached.test; 2.
3. import java.util.Date; 4.
5. import com.danga.MemCached.MemCachedClient; 6. import com.danga.MemCached.SockIOPool; 7. 8.
9. public class Test {
10. protected static MemCachedClient mcc = new MemCachedClient(); 11.
12. static {
13. String[] servers ={\}; 14.
15. Integer[] weights = { 3 }; 16.
17. //创建一个实例对象SockIOPool
18. SockIOPool pool = SockIOPool.getInstance(); 19.
20. // set the servers and the weights 21. //设置Memcached Server
22. pool.setServers( servers ); 23. pool.setWeights( weights ); 24.
25. // set some basic pool settings
26. // 5 initial, 5 min, and 250 max conns 27. // and set the max idle time for a conn 28. // to 6 hours
29. pool.setInitConn( 5 ); 30. pool.setMinConn( 5 ); 31. pool.setMaxConn( 250 );
32. pool.setMaxIdle( 1000 * 60 * 60 * 6 ); 33.
34. // set the sleep for the maint thread 35. // it will wake up every x seconds and
36. // maintain the pool size 37. pool.setMaintSleep( 30 ); 38.
39. // Tcp的规则就是在发送一个包之前,本地机器会等待远程主机
40. // 对上一次发送的包的确认信息到来;这个方法就可以关闭套接字的缓存,
41. // 以至这个包准备好了就发; 42. pool.setNagle( false ); 43. //连接建立后对超时的控制
44. pool.setSocketTO( 3000 ); 45. //连接建立时对超时的控制
46. pool.setSocketConnectTO( 0 ); 47.
48. // initialize the connection pool
49. //初始化一些值并与MemcachedServer段建立连接 50. pool.initialize(); 51. 52.
53. // lets set some compression on for the client
54. // compress anything larger than 64k 55. mcc.setCompressEnable( true );
56. mcc.setCompressThreshold( 64 * 1024 ); 57. } 58.
59. public static void bulidCache(){
60. //set(key,value,Date) ,Date是一个过期时间,如果想让这个过期时间生效的话,这里传递的new Date(long date) 中参数date,需要是个大于或等于1000的值。
61. //因为java client的实现源码里是这样实现
的 expiry.getTime() / 1000 ,也就是说,如果 小于1000的值,除以1000以后都是0,即永不过期
62. mcc.set( \, \ ,new Date(11211));
63. //十秒后过期 64. 65. } 66.
67. public static void output() { 68. //从cache里取值
69. String value = (String) mcc.get( \ ); 70. System.out.println(value); 71. }
72.
73. public static void main(String[] args){ 74. bulidCache(); 75. output(); 76. } 77. 78.}
79.Memcached官方:http://danga.com/memcached/ 80.关于Memcached的介绍请参考:Memcached深度分析 81.下载Windows的Server端
82.下载地址:http://code.jellycan.com/memcached/ 83.安装Memcache Server(也可以不安装直接启动)
84.1. 下载memcached的windows稳定版,解压放某个盘下面,比如在c:\\memcached
2. 在CMD下输入 \安装. 3. 再输入:\启动。NOTE: 以后memcached将作为windows的一个服务每次开机时自动启动。这样服务器端已经安装完毕了。
85.如果下载的是二进制的版本,直接运行就可以了,可以加上参数来加以设置。 86.
常用设置:
-p
-l
-d stop|shutdown 关闭正在运行的memcached服务 -d install 安装memcached服务 -d uninstall 卸载memcached服务
-u
-m
-n
87.然后就可以用.net 的memcached客户端来试一下了。
88.C# 下可用的API(每个客户端API中都有详细的说明和注释) 89.https://sourceforge.net/projects/memcacheddotnet/
http://www.codeplex.com/EnyimMemcached/ - Client developed in .NET 2.0 keeping performance and extensibility in
90.mind. (Supports consistent hashing.)
http://code.google.com/p/beitmemcached/ - Client developed by BeIT with many new features 91.Memcached深度分析
92.Memcached是danga.com(运营LiveJournal的技术团队)开发的一套分布式内存对象缓存系统,用于在动态系统中减 少数据库负载,提升性能。关于这个东西,相信很多人都用过,本文意在通过对memcached的实现及代码分析,获得对这个出色的开源软件更深入的了解, 并可以根据我们的需要对其进行更进一步的优化。末了将通过对BSM_Memcache扩展的分析,加深对memcached的使用方式理解。
93.本文的部分内容可能需要比较好的数学基础作为辅助。 94.◎Memcached是什么 95.在阐述这个问题之前,我们首先要清楚它“不是什么”。很多人把它当作和SharedMemory那种形式的存储载体来使用,虽然 memcached使用了同样的“Key=>Value”方式组织数据,但是它和共享内存、APC等本地缓存有非常大的区别。Memcached是 分布式的,也就是说它不是本地的。它基于网络连接(当然它也可以使用localhost)方式完成服务,本身它是一个独立于应用的程序或守护进程 (Daemon方式)。
96.Memcached使用libevent库实现网络连接服务,理论上可以处理无限多的连接,但是它和Apache不同,它更多的时候是面向 稳定的持续连接的,所以它实际的并发能力是有限制的。在保守情况下memcached的最大同时连接数为200,这和Linux线程能力有关系,这个数值 是可以调整的。关于libevent可以参考相关文档。 Memcached内存使用方式也和APC不同。APC是基于共享内存和MMAP的,memcachd有自己的内存分配算法和管理方式,它和共享内存没有 关系,也没有共享内存的限制,通常情况下,每个memcached进程可以管理2GB的内存空间,如果需要更多的空间,可以增加进程数。
97.◎Memcached适合什么场合
98.在很多时候,memcached都被滥用了,这当然少不了对它的抱怨。我经常在论坛上看见有人发贴,类似于“如何提高效率”,回复是“用
memcached”,至于怎么用,用在哪里,用来干什么一句没有。memcached不是万能的,它也不是适用在所有场合。
99.Memcached是“分布式”的内存对象缓存系统,那么就是说,那些不需要“分布”的,不需要共享的,或者干脆规模小到只有一台服务器的 应用,memcached不会带来任何好处,相反还会拖慢系统效率,因为网络连接同样需要资源,即使是UNIX本地连接也一样。 在我之前的测试数据中显示,memcached本地读写速度要比直接PHP内存数组慢几十倍,而APC、共享内存方式都和直接数组差不多。可见,如果只是 本地级缓存,使用memcached是非常不划算的。
100. Memcached在很多时候都是作为数据库前端cache使用的。因为它比数据库少了很多SQL解析、磁盘操作等开销,而且它是使用内存 来管理数据的,所以它可以提供比直接读取数据库更好的性能,在大型系统中,访问同样的数据是很频繁的,memcached可以大大降低数据库压力,使系统 执行效率提升。另外,memcached也经常作为服务器之间数据共享的