??xml version="1.0" encoding="utf-8" standalone="yes"?>中文视频一区,久久人体视频,亚洲香蕉在线观看http://www.aygfsteel.com/dongbule/category/46031.html构徏高性能门户|?/description>zh-cnWed, 08 Dec 2010 18:23:57 GMTWed, 08 Dec 2010 18:23:57 GMT60memcached一些应用点?/title><link>http://www.aygfsteel.com/dongbule/archive/2010/12/08/340066.html</link><dc:creator>陈于?/dc:creator><author>陈于?/author><pubDate>Wed, 08 Dec 2010 07:00:00 GMT</pubDate><guid>http://www.aygfsteel.com/dongbule/archive/2010/12/08/340066.html</guid><wfw:comment>http://www.aygfsteel.com/dongbule/comments/340066.html</wfw:comment><comments>http://www.aygfsteel.com/dongbule/archive/2010/12/08/340066.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.aygfsteel.com/dongbule/comments/commentRss/340066.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/dongbule/services/trackbacks/340066.html</trackback:ping><description><![CDATA[大名鼎鼎的分布式~存pȝmemcachedQ在开源社Z可谓是无Z知无Z晓,memcached支持分布式的横向扩展Q但memcached的服务端却是单实例,q无"分布?的功能,所谓的分布式只是客L在存储的主键做分布的存储Q还有memcachedlg~存对象Q如果组件无q行序列化必定无法正取得数据;如何使用memcached的javalg来监控memcached的运行状态;以上{等的问题是我在日常的工作中到q解决的,拿出来跟大家做个分n^_^<br /> <br /> <hr width="100%" size="2" /> <br /> <strong>对象的序列化</strong><br /> 首先memcached是独立的服务器组?独立于应用系l?从客L保存和读取对象到memcached是必通过|络传输,因ؓ|络传输都是二进制的数据,所以所有的对象都必ȝq序列化,否则无法存储到memcahced的服务器?<br /> 正如我们以往在集中应用的序列化一?memcached的序列化的性能也是往往让大家头?如果我们Ҏ们的domainc进行对象的序列?W一ơ序列化旉会比较长,但后l会优化,也就是说序列化最大的消耗不是对象的序列?而是cȝ序列?如果存储的只是一个String对象,q种情况是最理想?省去了序列化的操?实际上String对象本n已经实现了序列化接口,无法我们再次去进行序列化操作.<br /> <br /> <hr width="100%" size="2" /> <br /> <strong>memcached的原子加?/strong><br /> 记录一下上ơ犯得一个错?br /> <div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #000000;"><%</span><span style="color: #000000;"><br /> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> count </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">;<br /> count</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br /> MemCachedClient mcc </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> MemCachedClient();<br /> mcc.add(</span><span style="color: #000000;">"</span><span style="color: #000000;">test.html</span><span style="color: #000000;">"</span><span style="color: #000000;">, count);<br /> </span><span style="color: #000000;">%></span></div> <br /> q段代码的作用是test.html的用戯问次C存到memcached?_劣一看好像ƈ无错?但在高ƈ发时的出来的讉K数据一定是于实际的访问数?当然q里q不是memcached对象锁的问题,主要q是E序中线E的同步问题,但是如果使用java的synchronized或lock那么在性能上肯定是无法忍受?memcached客户端组件带有原子性的加法和减?br /> <br /> <div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #000000;"><%</span><span style="color: #000000;"><br /> MemCachedClient mcc </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> MemCachedClient();<br /> System.out.println(mcc.addOrIncr(</span><span style="color: #000000;">"</span><span style="color: #000000;">test.html</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">1</span><span style="color: #000000;">));<br /> </span><span style="color: #000000;">%></span></div> <br /> long addORIncr(String key,long inc)数器值增加inc,如果计数器不存在,则保存inc数器的?必须注意的是服务器端不会对超q??2ơ方的行行检?br /> <br /> <hr width="100%" size="2" /> <br /> <br /> <strong>分布式的mencached</strong><br /> memcached虽然是属于分布式的缓存服务器,但实际上memcached服务端之间ƈ无分布式的功?不会互相通信׃n数据,如何q行分布?q完全是取决于客L的实?br /> <br /> <img alt="" src="http://www.aygfsteel.com/images/blogjava_net/dongbule/memcached/2.png" width="456" height="390" /><br /> <br /> 假设我们现在有三台memcached服务器分别ؓnode1Qnode2Qnode3Q应用程序要保存键名分别?test1","test2","test3",客户端实现的法是Ҏ键名来决定保存数据的memcached服务?我们?test1"保存到node1Q?test2"保存到node2Q?test3"保存到node3Qƈ且在d~存数据也是通过一L法从各台服务器上读取相应的key,q样通过一个最单的法不同的键保存到不同的服务器?实现了memcached的分布式.<br /> 但是q种法很难保每台服务器得到较为^均的数据?我们需要改变一下客L的算?单来?是Ҏ服务器的台数的余数进行分?br /> <br /> <div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #000000;"><%<br /> "</span><span style="color: #000000;">test1</span><span style="color: #000000;">"</span><span style="color: #000000;">.hashCode()</span><span style="color: #000000;">%</span><span style="color: #000000;">3<br /> %><br /> </span></div> <br /> Ҏkey的java.lang.String.hashCode()取得散列?再将值模服务器的台数得到余数?我们再根据这个余数值来判定q个key要存入哪一台服务器,当key的数量越来越?对key的散列取模也会趋向^?基本可以保证几台memcached服务器所存储的缓存量向q_<br /> g很完?余数计算的方法很?数据的分散性也很优U,但也有其~点,是当需要添加或U除服务器时,~存的重l代h相当巨大?d或移除服务器?余数׃发生变化,q样无法取C原来~存时相同的服务?<br /> |上介绍的Consistent Hashing法基本上可以解册个问?q里做个单的说明,首先是求出memcached服务器节点的哈希?q将光|到0-2?2ơ方的圆?然后用同LҎ求出存储数据的键的哈希?q映到圆上.然后从数据映到的位|开始顺旉查找,数据保存到扑ֈ的第一个服务器?如果过2?2ơ方仍然找不到服务器,׃保存到第一台memcached服务器上<br /> <img alt="" src="http://www.aygfsteel.com/images/blogjava_net/dongbule/memcached/3.png" width="512" height="421" /><br /> <br /> 从上囄状态中d一台memcached服务器。余数分布式法׃保存键的服务器会发生巨大变化而媄响缓存的命中率,但Consistent Hashing中,只有在continuum上增加服务器的地炚w时针方向的W一台服务器上的键会受到影响<br /> <br /> <hr width="100%" size="2" /> <br /> <strong>几种q接客户端的Ҏ</strong><br /> 目前java的memcached主要有Java-Memcached-Client,Xmemached,Spymemcached三种,q三个客L的性能试可以?br /> http://xmemcached.googlecode.com/svn/trunk/benchmark/benchmark.html<br /> <br /> <img alt="" src="http://www.aygfsteel.com/images/blogjava_net/dongbule/memcached/4.png" width="942" height="612" /><br /> h的资源ؓ64Bytes,在低q发Java-Memcached-Client是占有一定的优势,但在q发数超q?00以后,Java-Memcached-Client是呈现直U下?q发数达?00已经无法承受,Spymemcached和Xmemached表现相对E_,特别是Xmemached无论在低q发或高q发都保持优U的性能表现<br /> <br /> <img alt="" src="http://www.aygfsteel.com/images/blogjava_net/dongbule/memcached/5.png" width="950" height="610" /><br /> <br /> q发数固定ؓ100?在小文g的请求Java-Memcached-Clientq是占有优势,当随着h的size来大,三者趋向于同一?br /> 如果你对memcached讉K的负载不?那么Java-Memcached-Client是一个不错的选择,如果你对memcached讉K的负载要求较?推荐使用Xmemached,如果需要异步的扚w处理,可以选择Spymemcached,如果你什么都不知?那么使用Xmemached,因ؓ无论在何U情?它都可以表现好的性能,虽然不是最?br /> <br /> <hr width="100%" size="2" /> <br /> <strong>监控memcached </strong><br /> 推荐使用nagios或cactisq行监控,nagios没有配置q?cactis是需要下载一个脚本插?br /> q里推荐一个从|上淘来的php,只要把它攑ֈ你的机器?当然你的机器要支持php环境,此php攑օ你的|页讉K|络可以访?br /> 下蝲<br /> <a href="/Files/dongbule/cacti/memcache.rar">http://www.aygfsteel.com/Files/dongbule/cacti/memcache.rar</a><br /> 修改php以下几个选项<br /> <br /> <div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #008080;">define</span><span style="color: #000000;">(</span><span style="color: #000000;">'</span><span style="color: #000000;">ADMIN_USERNAME</span><span style="color: #000000;">'</span><span style="color: #000000;">,</span><span style="color: #000000;">'</span><span style="color: #000000;">memcache</span><span style="color: #000000;">'</span><span style="color: #000000;">);    </span><span style="color: #008000;">//</span><span style="color: #008000;"> Admin Username</span><span style="color: #008000;"><br /> </span><span style="color: #008080;">define</span><span style="color: #000000;">(</span><span style="color: #000000;">'</span><span style="color: #000000;">ADMIN_PASSWORD</span><span style="color: #000000;">'</span><span style="color: #000000;">,</span><span style="color: #000000;">'</span><span style="color: #000000;">password</span><span style="color: #000000;">'</span><span style="color: #000000;">);    </span><span style="color: #008000;">//</span><span style="color: #008000;"> Admin Password</span><span style="color: #008000;"><br /> </span><span style="color: #000000;"><br /> </span><span style="color: #800080;">$MEMCACHE_SERVERS</span><span style="color: #000000;">[] </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">'</span><span style="color: #000000;">192.168.1.100:11211</span><span style="color: #000000;">'</span><span style="color: #000000;">; </span><span style="color: #008000;">//</span><span style="color: #008000;"> add more as an array</span><span style="color: #008000;"><br /> #</span><span style="color: #008000;">$MEMCACHE_SERVERS[] = 'mymemcache-server2:11211'; // add more as an array</span></div> <br /> 监控的^?br /> <br /> <img alt="" src="http://www.aygfsteel.com/images/blogjava_net/dongbule/memcached/6.png" width="992" height="422" /><br /> <br /> <hr width="100%" size="2" /> <br /> <strong>理解memcached的删除机?/strong><br /> memcached内部不会监视记录是否q期,而是在get时查看记录的旉?查记录是否过? q种技术被UCؓlazy(惰?expiration.因此,memcached不会在过期监视上耗费CPU旉<br /> memcached会优先用已时的记录的I间,q用LRU法来分配空?因此当memcached的内存空间不?׃最q违背用的记录中搜?q将I间分配l新的记?br /> 不过在某些情况下LRU机制会造成某些ȝ,如你q不惌淘汰已被~存q的记录,可以在memcached启动时添?-M 参数来禁止LRU,但这样在memcached的内存用时,memcached会返回错?是否使用LRU,在于你的需?br /> <br /> <br /> ----------------------------------------<br /> <br /> by 陈于?<br /> QQ:34174409<br /> Mail: dongbule@163.com<br /> <br /> <br /> <br /> <img src ="http://www.aygfsteel.com/dongbule/aggbug/340066.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/dongbule/" target="_blank">陈于?/a> 2010-12-08 15:00 <a href="http://www.aygfsteel.com/dongbule/archive/2010/12/08/340066.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>览器的~存协商http://www.aygfsteel.com/dongbule/archive/2010/08/25/329840.html陈于?/dc:creator>陈于?/author>Tue, 24 Aug 2010 16:03:00 GMThttp://www.aygfsteel.com/dongbule/archive/2010/08/25/329840.htmlhttp://www.aygfsteel.com/dongbule/comments/329840.htmlhttp://www.aygfsteel.com/dongbule/archive/2010/08/25/329840.html#Feedback0http://www.aygfsteel.com/dongbule/comments/commentRss/329840.htmlhttp://www.aygfsteel.com/dongbule/services/trackbacks/329840.html
~存协商
现在我们需要将用户的浏览器也纳入我们构建网站各个缓存层ơ中的其中一个重要层ơ,|站信息和内容在由web服务器生成,而将q些信息和内容作ZD二q制的文件作为本地缓存文件存攑֜用户的浏览器Q是两个独立个体共同完成的Q务,所以两者之间需要一U沟通的机制Q也是HTTP的缓存协?br />
Last-Modified和If-Modified-Since协商
Last-Modified和If-Modified-Since分别位于响应头信息和h头信息中Q都是记录请求的面最后的修改旉
在第一ơ访问web服务器会q回200状态,q在览器的响应头Last-Modified上写上此面最后修改的旉?br /> 使用firebugq行查看




在再ơ访问时Q浏览器会把W一ơ返回Last-Modified的时间戳记录到If-Modified-SinceQƈ作ؓh头信息发送到服务区,web服务器会通过If-Modified-Since上的旉x判断用户的页面是否是最新的Q如果不是最新的Q则q回新的面q修改响应头Last-Modified旉戳给用户Q如果判断是最新的Q则q回304状态ƈ告诉览器本地的cache面是最新的Q浏览器可以直接加蝲本地面Q这样可以减网l上传输的数据,q且也减服务器的负担?br />



q里需要注意的是,HTTP协议中规定用的是GMT旉(格林威治)Q而我们国家用的是GMT+8的时_所以我们从firebug中看到的旉是比我们早了8个小Ӟ不过q没关系Q它q不影响到缓存的Ҏ工作

Etag协商
如果我们的一个文件存攑֜多台web服务器上Q用Lh在这些服务器上之间轮询,实现负蝲均衡Q那些这个文件在各台web服务器的最后修Ҏ间很可能是不一Pq样用户每次h到的web服务器都可能是不同,Last-Modified和If-Modified-Since则无法对应,D每次都需要重新获取内容,q时候采用直接标记内容的Etag法Q就可以避免上述的问?br /> Etag是由Web服务器生成的Q如ApacheZ个静态文件新增响应头?br /> Etag    "e3af4060-5-472bedf076880"
览器获得这个Etag后,便会在下ơ请求该面Ӟ在HTTP的请求头附上If-None-Match    "e3af4060-5-472bedf076880"Q与web服务器上的Etag值相比较Q如果是相同的话Q便q回304状态,不同则重新返回新面信息



当然啦,q里要指出浏览器~存只针对HTML和HTMq行而动态文件则无法~存Q浏览器q不在乎你的文g是否动态还是静态,览器只认准和web服务器通讯的HTTP协商Q所以只要动态页面HTTP头信息包含的~存协商信息Q动态内容也是可以一栯览器进行缓存的Q和静态页面无什么两P只是你确定你需要这样做Q让动态页面被~存Q?br /> 以下是对一个jspq行写头信息

response.addHeader("Last-Modified",DateUtl.format(new java.util.Date())+" GMT");
response.addHeader(
"ETag","e3af4060-5-472bedf076880");


同样Q这样两个设|会写入览器的响应_q个动态文件跟静态文件一样会被浏览器~存

Expires
Expires标记告诉览器该面何时q期Qƈ且在此过期前不需要再讉Kweb服务器,直接使用本地的缓存文件即可,q样h响应头都不需要,实节省了带宽和服务器的开销Q但是就页面在web服务器上更新后在Expiresq期前也不会出现在用户面前,I竟是否应该在于我们的实际应用和取舍
下面是Apache中提供的mod_expires模块
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault A600
ExpiresByType image/x-icon A2592000
ExpiresByType application/x-javascript A604800
ExpiresByType text/css A604800
ExpiresByType image/gif A2592000
ExpiresByType image/png A2592000
ExpiresByType image/jpeg A2592000
ExpiresByType text/plain A86400
ExpiresByType application/x-shockwave-flash A2592000
ExpiresByType video/x-flv A2592000
ExpiresByType application/pdf A2592000
ExpiresByType text/html A600
</IfModule>

或?br />
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access plus 12 hours"
ExpiresByType text/html "access plus 3 days"
ExpiresByType text/plain "access plus 3 days"
ExpiresByType text/css  "access plus 7 days"
ExpiresByType image/gif "access plus 30 days"
ExpiresByType image/png "access plus 30 days"
ExpiresByType image/jpeg "access plus 30 days"
ExpiresByType image/x-icon "access plus 30 days"
ExpiresByType video/x-flv  "access plus 30 days"
ExpiresByType application/x-shockwave-flash "access plus 30 days"
</IfModule>


我们在jsp文g也可以指定expires的过期时?br />
response.addHeader("Expires",DateUtl.format(new java.util.Date())+" GMT");



当然啦,你再h也不会返?04状态,因ؓ览器已l不用想web服务器发?br />
----------------------------------------

by 陈于?
Mail: chenyz@corp.netease.com


参考文?br /> 郭欣 《构建高新能web站点?br /> 中文?《HTTP协议(RFC2616)?br />

]]>
վ֩ģ壺 Ҧ| ½| | | | | | | | | | ɽ| Դ| ͩ| | | | | | ԫ| | | ʱ| ˳| | ͬ| ɽ| ˾| | | | ͺ| | Ǧɽ| ɽ| Զ| | | ʹ| ɽ| |