﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Chan Chen Coding...-文章分类-Memcached</title><link>http://www.blogjava.net/czihong/category/51442.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 30 Apr 2013 22:12:45 GMT</lastBuildDate><pubDate>Tue, 30 Apr 2013 22:12:45 GMT</pubDate><ttl>60</ttl><item><title>memcached 客户端代码 Java memcached client学习</title><link>http://www.blogjava.net/czihong/articles/398082.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Fri, 19 Apr 2013 04:16:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/398082.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/398082.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/398082.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/398082.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/398082.html</trackback:ping><description><![CDATA[<span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">Refer to:</span><a href="http://makemyownlife.iteye.com/blog/1439581">http://makemyownlife.iteye.com/blog/1439581</a><br /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff; color: red;"><br />java memcached client</span><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">源码，总的代码量还是很少的&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">主要是如下两个类:&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">MemcachedClient.java&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">SockIOPool.java</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">好 先看推荐的测试代码:&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><div id="" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; background-color: #ffffff; width: 679px; margin-left: 9px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; word-break: break-all; word-wrap: break-word; line-height: 25.1875px;"><div><div style="padding-right: 3px; padding-bottom: 3px; padding-left: 3px; margin: 0px; font-weight: bold;">Java代码&nbsp;&nbsp;<a href="" title="收藏这段代码" style="color: #108ac6;"><img src="http://makemyownlife.iteye.com/images/icon_star.png" alt="收藏代码" style="border: 0px;" /><br /></a></div></div></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">/**</span><span style="color: #008000; ">&nbsp;<br />&nbsp;*&nbsp;Copyright&nbsp;(c)&nbsp;2008&nbsp;Greg&nbsp;Whalin&nbsp;<br />&nbsp;*&nbsp;All&nbsp;rights&nbsp;reserved.&nbsp;<br />&nbsp;*&nbsp;<br />&nbsp;*&nbsp;This&nbsp;library&nbsp;is&nbsp;free&nbsp;software;&nbsp;you&nbsp;can&nbsp;redistribute&nbsp;it&nbsp;and/or&nbsp;<br />&nbsp;*&nbsp;modify&nbsp;it&nbsp;under&nbsp;the&nbsp;terms&nbsp;of&nbsp;the&nbsp;BSD&nbsp;license&nbsp;<br />&nbsp;*&nbsp;<br />&nbsp;*&nbsp;This&nbsp;library&nbsp;is&nbsp;distributed&nbsp;in&nbsp;the&nbsp;hope&nbsp;that&nbsp;it&nbsp;will&nbsp;be&nbsp;<br />&nbsp;*&nbsp;useful,&nbsp;but&nbsp;WITHOUT&nbsp;ANY&nbsp;WARRANTY;&nbsp;without&nbsp;even&nbsp;the&nbsp;implied&nbsp;<br />&nbsp;*&nbsp;warranty&nbsp;of&nbsp;MERCHANTABILITY&nbsp;or&nbsp;FITNESS&nbsp;FOR&nbsp;A&nbsp;PARTICULAR&nbsp;<br />&nbsp;*&nbsp;PURPOSE.&nbsp;<br />&nbsp;*&nbsp;<br />&nbsp;*&nbsp;You&nbsp;should&nbsp;have&nbsp;received&nbsp;a&nbsp;copy&nbsp;of&nbsp;the&nbsp;BSD&nbsp;License&nbsp;along&nbsp;with&nbsp;this&nbsp;<br />&nbsp;*&nbsp;library.&nbsp;<br />&nbsp;*&nbsp;<br />&nbsp;*&nbsp;</span><span style="color: #808080; ">@author</span><span style="color: #008000; ">&nbsp;greg&nbsp;whalin&nbsp;&lt;greg@meetup.com&gt;&nbsp;&nbsp;<br />&nbsp;</span><span style="color: #008000; ">*/</span>&nbsp;&nbsp;<br /><span style="color: #0000FF; ">package</span>&nbsp;com.meetup.memcached.test;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br /><span style="color: #0000FF; ">import</span>&nbsp;com.meetup.memcached.*;&nbsp;&nbsp;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.log4j.*;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;TestMemcached&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;memcached&nbsp;should&nbsp;be&nbsp;running&nbsp;on&nbsp;port&nbsp;11211&nbsp;but&nbsp;NOT&nbsp;on&nbsp;11212&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BasicConfigurator.configure();&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;servers&nbsp;=&nbsp;{&nbsp;"localhost:11211"};&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SockIOPool&nbsp;pool&nbsp;=&nbsp;SockIOPool.getInstance();&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool.setServers(&nbsp;servers&nbsp;);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool.setFailover(&nbsp;<span style="color: #0000FF; ">true</span>&nbsp;);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool.setInitConn(&nbsp;10&nbsp;);&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool.setMinConn(&nbsp;5&nbsp;);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool.setMaxConn(&nbsp;250&nbsp;);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool.setMaintSleep(&nbsp;30&nbsp;);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">这是开启一个nagle&nbsp;算法。改算法避免网络中充塞小封包，提高网络的利用率&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool.setNagle(&nbsp;<span style="color: #0000FF; ">false</span>&nbsp;);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool.setSocketTO(&nbsp;3000&nbsp;);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool.setAliveCheck(&nbsp;<span style="color: #0000FF; ">true</span>&nbsp;);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool.initialize();&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MemcachedClient&nbsp;mcc&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;MemcachedClient();&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;turn&nbsp;off&nbsp;most&nbsp;memcached&nbsp;client&nbsp;logging:&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;com.meetup.memcached.Logger.getLogger(&nbsp;MemcachedClient.<span style="color: #0000FF; ">class</span>.getName()&nbsp;).setLevel(&nbsp;com.meetup.memcached.Logger.LEVEL_WARN&nbsp;);&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;10;&nbsp;i++&nbsp;)&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;success&nbsp;=&nbsp;mcc.set(&nbsp;""&nbsp;+&nbsp;i,&nbsp;"Hello!"&nbsp;);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;result&nbsp;=&nbsp;(String)mcc.get(&nbsp;""&nbsp;+&nbsp;i&nbsp;);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;String.format(&nbsp;"set(&nbsp;%d&nbsp;):&nbsp;%s",&nbsp;i,&nbsp;success&nbsp;)&nbsp;);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;String.format(&nbsp;"get(&nbsp;%d&nbsp;):&nbsp;%s",&nbsp;i,&nbsp;result&nbsp;)&nbsp;);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />} &nbsp;</div><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">其实 对于我来说 我很想明白的是连接池是如何配置的,关键在于 pool.initialize(); 这个方法如何初始化的。&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><div id="" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; background-color: #ffffff; width: 679px; margin-left: 9px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; word-break: break-all; word-wrap: break-word; line-height: 25.1875px;"><div><div style="padding-right: 3px; padding-bottom: 3px; padding-left: 3px; margin: 0px; font-weight: bold;">Java代码&nbsp;&nbsp;<a href="" title="收藏这段代码" style="color: #108ac6;"><img src="http://makemyownlife.iteye.com/images/icon_star.png" alt="收藏代码" style="border: 0px;" /></a></div></div></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">/**</span><span style="color: #008000; ">&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Initializes&nbsp;the&nbsp;pool.&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span>&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;initialize()&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">synchronized</span>(&nbsp;<span style="color: #0000FF; ">this</span>&nbsp;)&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;check&nbsp;to&nbsp;see&nbsp;if&nbsp;already&nbsp;initialized&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(&nbsp;initialized&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;&amp;&nbsp;(&nbsp;buckets&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>&nbsp;||&nbsp;consistentBuckets&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>&nbsp;)&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;&amp;&nbsp;(&nbsp;availPool&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>&nbsp;)&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;&amp;&nbsp;(&nbsp;busyPool&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>&nbsp;)&nbsp;)&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.error(&nbsp;"++++&nbsp;trying&nbsp;to&nbsp;initialize&nbsp;an&nbsp;already&nbsp;initialized&nbsp;pool"&nbsp;);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;pools&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;availPool&nbsp;&nbsp;&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;HashMap&lt;String,Map&lt;SockIO,Long&gt;&gt;(&nbsp;servers.length&nbsp;*&nbsp;initConn&nbsp;);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;busyPool&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;HashMap&lt;String,Map&lt;SockIO,Long&gt;&gt;(&nbsp;servers.length&nbsp;*&nbsp;initConn&nbsp;);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;deadPool&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;IdentityHashMap&lt;SockIO,Integer&gt;();&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hostDeadDur&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;HashMap&lt;String,Long&gt;();&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hostDead&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;HashMap&lt;String,Date&gt;();&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxCreate&nbsp;&nbsp;&nbsp;=&nbsp;(poolMultiplier&nbsp;&gt;&nbsp;minConn)&nbsp;?&nbsp;minConn&nbsp;:&nbsp;minConn&nbsp;/&nbsp;poolMultiplier;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;only&nbsp;create&nbsp;up&nbsp;to&nbsp;maxCreate&nbsp;connections&nbsp;at&nbsp;once&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(&nbsp;log.isDebugEnabled()&nbsp;)&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.debug(&nbsp;"++++&nbsp;initializing&nbsp;pool&nbsp;with&nbsp;following&nbsp;settings:"&nbsp;);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.debug(&nbsp;"++++&nbsp;initial&nbsp;size:&nbsp;"&nbsp;+&nbsp;initConn&nbsp;);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.debug(&nbsp;"++++&nbsp;min&nbsp;spare&nbsp;&nbsp;&nbsp;:&nbsp;"&nbsp;+&nbsp;minConn&nbsp;);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.debug(&nbsp;"++++&nbsp;max&nbsp;spare&nbsp;&nbsp;&nbsp;:&nbsp;"&nbsp;+&nbsp;maxConn&nbsp;);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;if&nbsp;servers&nbsp;is&nbsp;not&nbsp;set,&nbsp;or&nbsp;it&nbsp;empty,&nbsp;then&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;throw&nbsp;a&nbsp;runtime&nbsp;exception&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(&nbsp;servers&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>&nbsp;||&nbsp;servers.length&nbsp;&lt;=&nbsp;0&nbsp;)&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.error(&nbsp;"++++&nbsp;trying&nbsp;to&nbsp;initialize&nbsp;with&nbsp;no&nbsp;servers"&nbsp;);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throw</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;IllegalStateException(&nbsp;"++++&nbsp;trying&nbsp;to&nbsp;initialize&nbsp;with&nbsp;no&nbsp;servers"&nbsp;);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;initalize&nbsp;our&nbsp;internal&nbsp;hashing&nbsp;structures&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(&nbsp;<span style="color: #0000FF; ">this</span>.hashingAlg&nbsp;==&nbsp;CONSISTENT_HASH&nbsp;)&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;populateConsistentBuckets();&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;populateBuckets();&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;mark&nbsp;pool&nbsp;as&nbsp;initialized&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.initialized&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;start&nbsp;maint&nbsp;thread&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(&nbsp;<span style="color: #0000FF; ">this</span>.maintSleep&nbsp;&gt;&nbsp;0&nbsp;)&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.startMaintThread();&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;</div><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">如上代码流程如下：&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">1&nbsp; 检测是否已经被初始化&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">2&nbsp; 定义可用链接 ，繁忙链接池&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">3&nbsp; 判断是否一致性hash算法 还是普通的算法&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">4&nbsp; 定义一个后台线程 ，来维护&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">好 ，首先来分析下一致性hash算法。&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">从如下代码来分析 ：&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><div id="" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; background-color: #ffffff; width: 679px; margin-left: 9px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; word-break: break-all; word-wrap: break-word; line-height: 25.1875px;"><div><div style="padding-right: 3px; padding-bottom: 3px; padding-left: 3px; margin: 0px; font-weight: bold;">Java代码&nbsp;&nbsp;<a href="" title="收藏这段代码" style="color: #108ac6;"><img src="http://makemyownlife.iteye.com/images/icon_star.png" alt="收藏代码" style="border: 0px;" /></a></div></div></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.hashingAlg&nbsp;==&nbsp;CONSISTENT_HASH&nbsp;)&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;populateConsistentBuckets(); &nbsp;<br />}</div><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><div id="" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; background-color: #ffffff; width: 679px; margin-left: 9px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; word-break: break-all; word-wrap: break-word; line-height: 25.1875px;"><div><div style="padding-right: 3px; padding-bottom: 3px; padding-left: 3px; margin: 0px; font-weight: bold;">Java代码&nbsp;&nbsp;<a href="" title="收藏这段代码" style="color: #108ac6;"><img src="http://makemyownlife.iteye.com/images/icon_star.png" alt="收藏代码" style="border: 0px;" /></a></div></div></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">/**</span><span style="color: #008000; ">&nbsp;将server添加到一致性hash的2的32次&nbsp;圆环&nbsp;&nbsp;*</span><span style="color: #008000; ">*/</span>&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;populateConsistentBuckets()&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(&nbsp;log.isDebugEnabled()&nbsp;)&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.debug(&nbsp;"++++&nbsp;initializing&nbsp;internal&nbsp;hashing&nbsp;structure&nbsp;for&nbsp;consistent&nbsp;hashing"&nbsp;);&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;store&nbsp;buckets&nbsp;in&nbsp;tree&nbsp;map&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.consistentBuckets&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;TreeMap&lt;Long,String&gt;();&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageDigest&nbsp;md5&nbsp;=&nbsp;MD5.get();&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">得到总的权重&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(&nbsp;<span style="color: #0000FF; ">this</span>.totalWeight&nbsp;&lt;=&nbsp;0&nbsp;&amp;&amp;&nbsp;<span style="color: #0000FF; ">this</span>.weights&nbsp;!=&nbsp;&nbsp;<span style="color: #0000FF; ">null</span>&nbsp;)&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;<span style="color: #0000FF; ">this</span>.weights.length;&nbsp;i++&nbsp;)&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.totalWeight&nbsp;+=&nbsp;(&nbsp;<span style="color: #0000FF; ">this</span>.weights[i]&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>&nbsp;)&nbsp;?&nbsp;1&nbsp;:&nbsp;<span style="color: #0000FF; ">this</span>.weights[i];&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(&nbsp;<span style="color: #0000FF; ">this</span>.weights&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>&nbsp;)&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.totalWeight&nbsp;=&nbsp;<span style="color: #0000FF; ">this</span>.servers.length;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;servers.length;&nbsp;i++&nbsp;)&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">每台服务器的权重&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;thisWeight&nbsp;=&nbsp;1;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(&nbsp;<span style="color: #0000FF; ">this</span>.weights&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>&nbsp;&amp;&amp;&nbsp;<span style="color: #0000FF; ">this</span>.weights[i]&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>&nbsp;)&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thisWeight&nbsp;=&nbsp;<span style="color: #0000FF; ">this</span>.weights[i];&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">有兴趣的朋友可以参考平衡Hash&nbsp;算法的另一个指标是平衡性&nbsp;(Balance)&nbsp;，定义如下：&nbsp;&nbsp;&nbsp;&nbsp;平衡性　平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去，这样可以使得所有的缓冲空间都得到利用&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">了解决这种情况，&nbsp;consistent&nbsp;hashing&nbsp;引入了&#8220;虚拟节点&#8221;的概念，它可以如下定义：&nbsp;&#8220;虚拟节点&#8221;（&nbsp;virtual&nbsp;node&nbsp;）是实际节点在&nbsp;hash&nbsp;空间的复制品（&nbsp;replica&nbsp;），一实际个节点对应了若干个&#8220;虚拟节点&#8221;，这个对应个数也成为&#8220;复制个数&#8221;，&#8220;虚拟节点&#8221;在&nbsp;hash&nbsp;空间中以&nbsp;hash&nbsp;值排列。&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">double</span>&nbsp;factor&nbsp;=&nbsp;Math.floor(((<span style="color: #0000FF; ">double</span>)(40&nbsp;*&nbsp;<span style="color: #0000FF; ">this</span>.servers.length&nbsp;*&nbsp;thisWeight))&nbsp;/&nbsp;(<span style="color: #0000FF; ">double</span>)<span style="color: #0000FF; ">this</span>.totalWeight);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;&nbsp;factor;&nbsp;j++&nbsp;)&nbsp;{&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">加密规则类似&nbsp;127.0.0.1_1&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;d&nbsp;=&nbsp;md5.digest(&nbsp;(&nbsp;servers[i]&nbsp;+&nbsp;"-"&nbsp;+&nbsp;j&nbsp;).getBytes()&nbsp;);&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">转化成16位的字节数组&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">16位二进制数组每4位为一组，每组第4个值左移24位，第三个值左移16位，第二个值左移8位，第一个值不移位。进行或运算，得到一个小于2的32&nbsp;次方的long值&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;h&nbsp;=&nbsp;0&nbsp;;&nbsp;h&nbsp;&lt;&nbsp;4;&nbsp;h++&nbsp;)&nbsp;{&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">因为是16位&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Long&nbsp;k&nbsp;=&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">实际上每个字节进行了运算&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((<span style="color: #0000FF; ">long</span>)(d[3+h*4]&amp;0xFF)&nbsp;&lt;&lt;&nbsp;24)&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;((<span style="color: #0000FF; ">long</span>)(d[2+h*4]&amp;0xFF)&nbsp;&lt;&lt;&nbsp;16)&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;((<span style="color: #0000FF; ">long</span>)(d[1+h*4]&amp;0xFF)&nbsp;&lt;&lt;&nbsp;8)&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;((<span style="color: #0000FF; ">long</span>)(d[0+h*4]&amp;0xFF));&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;consistentBuckets.put(&nbsp;k,&nbsp;servers[i]&nbsp;);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(&nbsp;log.isDebugEnabled()&nbsp;)&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.debug(&nbsp;"++++&nbsp;added&nbsp;"&nbsp;+&nbsp;servers[i]&nbsp;+&nbsp;"&nbsp;to&nbsp;server&nbsp;bucket"&nbsp;);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;create&nbsp;initial&nbsp;connections&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(&nbsp;log.isDebugEnabled()&nbsp;)&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.debug(&nbsp;"+++&nbsp;creating&nbsp;initial&nbsp;connections&nbsp;("&nbsp;+&nbsp;initConn&nbsp;+&nbsp;")&nbsp;for&nbsp;host:&nbsp;"&nbsp;+&nbsp;servers[i]&nbsp;);&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">创建链接&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;&nbsp;initConn;&nbsp;j++&nbsp;)&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SockIO&nbsp;socket&nbsp;=&nbsp;createSocket(&nbsp;servers[i]&nbsp;);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(&nbsp;socket&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>&nbsp;)&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.error(&nbsp;"++++&nbsp;failed&nbsp;to&nbsp;create&nbsp;connection&nbsp;to:&nbsp;"&nbsp;+&nbsp;servers[i]&nbsp;+&nbsp;"&nbsp;--&nbsp;only&nbsp;"&nbsp;+&nbsp;j&nbsp;+&nbsp;"&nbsp;created."&nbsp;);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">加入socket到连接池&nbsp;这里慢慢谈&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addSocketToPool(&nbsp;availPool,&nbsp;servers[i],&nbsp;socket&nbsp;);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(&nbsp;log.isDebugEnabled()&nbsp;)&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.debug(&nbsp;"++++&nbsp;created&nbsp;and&nbsp;added&nbsp;socket:&nbsp;"&nbsp;+&nbsp;socket.toString()&nbsp;+&nbsp;"&nbsp;for&nbsp;host&nbsp;"&nbsp;+&nbsp;servers[i]&nbsp;);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;</div><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">好 比如说 我们调用了 如下代码:&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><div id="" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; background-color: #ffffff; width: 679px; margin-left: 9px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; word-break: break-all; word-wrap: break-word; line-height: 25.1875px;"><div><div style="padding-right: 3px; padding-bottom: 3px; padding-left: 3px; margin: 0px; font-weight: bold;">Java代码&nbsp;&nbsp;<a href="" title="收藏这段代码" style="color: #108ac6;"><img src="http://makemyownlife.iteye.com/images/icon_star.png" alt="收藏代码" style="border: 0px;" /></a></div></div></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->MemcachedClient&nbsp;mcc&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;MemcachedClient();&nbsp;&nbsp;<br />mcc.set("6",&nbsp;1); &nbsp;</div><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><span style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;">这里key 如何定位到一台server呢？我先把一致性hash算法的定位方法说下。&nbsp;</span><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><div id="" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; background-color: #ffffff; width: 679px; margin-left: 9px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; word-break: break-all; word-wrap: break-word; line-height: 25.1875px;"><div><div style="padding-right: 3px; padding-bottom: 3px; padding-left: 3px; margin: 0px; font-weight: bold;">Java代码&nbsp;&nbsp;<a href="" title="收藏这段代码" style="color: #108ac6;"><img src="http://makemyownlife.iteye.com/images/icon_star.png" alt="收藏代码" style="border: 0px;" /></a></div></div></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">得到定位server的Socket封装对象&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>SockIOPool.SockIO&nbsp;sock&nbsp;=&nbsp;pool.getSock(&nbsp;key,&nbsp;hashCode&nbsp;); &nbsp;</div><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><div id="" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; background-color: #ffffff; width: 679px; margin-left: 9px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; word-break: break-all; word-wrap: break-word; line-height: 25.1875px;"><div><div style="padding-right: 3px; padding-bottom: 3px; padding-left: 3px; margin: 0px; font-weight: bold;">Java代码&nbsp;&nbsp;<a href="" title="收藏这段代码" style="color: #108ac6;"><img src="http://makemyownlife.iteye.com/images/icon_star.png" alt="收藏代码" style="border: 0px;" /></a></div></div></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">计算出key对应的hash值(md5)&nbsp;，然后&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">long</span>&nbsp;bucket&nbsp;=&nbsp;getBucket(&nbsp;key,&nbsp;hashCode&nbsp;); &nbsp;</div><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><div id="" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; background-color: #ffffff; width: 679px; margin-left: 9px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; word-break: break-all; word-wrap: break-word; line-height: 25.1875px;"><div><div style="padding-right: 3px; padding-bottom: 3px; padding-left: 3px; margin: 0px; font-weight: bold;">Java代码&nbsp;&nbsp;<a href="" title="收藏这段代码" style="color: #108ac6;"><img src="http://makemyownlife.iteye.com/images/icon_star.png" alt="收藏代码" style="border: 0px;" /></a><span style="background-color: #fafafa; font-size: 1em; line-height: 18px; color: #2b91af;">&nbsp;</span></div></div></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">得到大于hash的map，因为treemap已经排好序了。调用tailMap可以得到大于等于这个hash的对象&nbsp;，然后调用firstKey得到圆环上的hash值&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>SortedMap&lt;Long,String&gt;&nbsp;tmap&nbsp;=&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.consistentBuckets.tailMap(&nbsp;hv&nbsp;);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;(&nbsp;tmap.isEmpty()&nbsp;)&nbsp;?&nbsp;<span style="color: #0000FF; ">this</span>.consistentBuckets.firstKey()&nbsp;:&nbsp;tmap.firstKey(); &nbsp;</div><br style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25.1875px; background-color: #ffffff;" /><img src ="http://www.blogjava.net/czihong/aggbug/398082.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2013-04-19 12:16 <a href="http://www.blogjava.net/czihong/articles/398082.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Memcached实现内存缓存(一)</title><link>http://www.blogjava.net/czihong/articles/375295.html</link><dc:creator>Chan Chen</dc:creator><author>Chan Chen</author><pubDate>Thu, 19 Apr 2012 09:36:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/375295.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/375295.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/375295.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/375295.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/375295.html</trackback:ping><description><![CDATA[<p style="padding: 0px; margin: 0px 0px 15px; text-align: left; background-color: #ffffff;"><div><span style="line-height: 24px;">Memcached是danga.com（运营LiveJournal的技术团队）开发的一套分布式内存对象缓存系统，用于在动态系统中减少数据库负载，提升性能。LJ每秒动态页面访问量几千次，用户700万。Memcached将数据库负载大幅度降低，更好的分配资源，更快速访问。</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">&nbsp; &nbsp; 关于这个东西，相信很多人都用过，本文意在通过对memcached的实现及代码分析，获得对这个出色的开源软件更深入的了解，并可以根据我们的需要对其进行更进一步的优化。末了将通过对BSM_Memcache扩展的分析，加深对 memcached的使用方式理解。。</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">1.Memcached是什么</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">在阐述这个问题之前，我们首先要清楚它&#8220;不是什么&#8221;。很多人把它当作和SharedMemory那种形式的存储载体来使用，虽然memcached使用了同样的&#8220;Key=&gt;Value&#8221;方式组织数据，但是它和共享内存、APC等本地缓存有非常大的区别。Memcached是分布式的，也就是说它不是本地的。它基于网络连接（当然它也可以使用localhost）方式完成服务，本身它是一个独立于应用的程序或守护进程（Daemon方式）。即Memcached是高性能的，分布式的内存对象缓存系统，用于在动态应用中减少数据库负载，提升访问速度。</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">Memcached 使用libevent库实现网络连接服务，理论上可以处理无限多的连接，但是它和Apache不同，它更多的时候是面向稳定的持续连接的，所以它实际的并发能力是有限制的。在保守情况下memcached的最大同时连接数为200，这和Linux线程能力有关系，这个数值是可以调整的。关于 libevent可以参考相关文档。 Memcached内存使用方式也和APC不同。APC是基于共享内存和MMAP的，memcachd有自己的内存分配算法和管理方式，它和共享内存没有关系，也没有共享内存的限制，通常情况下，每个memcached进程可以管理2GB的内存空间，如果需要更多的空间，可以增加进程数。</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">2. Memcached适合什么场合</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">在很多时候，memcached都被滥用了，这当然少不了对它的抱怨。我经常在论坛上看见有人发贴，类似于&#8220;如何提高效率&#8221;，回复是&#8220;用memcached&#8221;，至于怎么用，用在哪里，用来干什么一句没有。memcached不是万能的，它也不是适用在所有场合。</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">Memcached 是&#8220;分布式&#8221;的内存对象缓存系统，那么就是说，那些不需要&#8220;分布&#8221;的，不需要共享的，或者干脆规模小到只有一台服务器的应用， memcached不会带来任何好处，相反还会拖慢系统效率，因为网络连接同样需要资源，即使是UNIX本地连接也一样。在我之前的测试数据中显示， memcached本地读写速度要比直接PHP内存数组慢几十倍，而APC、共享内存方式都和直接数组差不多。可见，如果只是本地级缓存，使用 memcached是非常不划算的。</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">&nbsp;Memcached在很多时候都是作为数据库前端cache使用的。因为它比数据库少了很多SQL解析、磁盘操作等开销，而且它是使用内存来管理数据的，所以它可以提供比直接读取数据库更好的性能，在大型系统中，访问同样的数据是很频繁的， memcached可以大大降低数据库压力，使系统执行效率提升。另外，memcached也经常作为服务器之间数据共享的储媒介，例如在SSO系统中保存系统单点登陆状态的数据就可以保存在memcached中，被多个应用共享。</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">需要注意的是，memcached使用内存管理数据，所以它是易失的，当服务器重启，或者memcached进程中止，数据便会丢失，所以 memcached不能用来持久保存数据。很多人的错误理解，memcached的性能非常好，好到了内存和硬盘的对比程度，其实memcached使用内存并不会得到成百上千的读写速度提高，它的实际瓶颈在于网络连接，它和使用磁盘的数据库系统相比，好处在于它本身非常&#8220;轻&#8221;，因为没有过多的开销和直接的读写方式，它可以轻松应付非常大的数据交换量，所以经常会出现两条千兆网络带宽都满负荷了，memcached进程本身并不占用多少CPU资源的情况。</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">通常的网页缓存方式有动态缓存和静态缓存等几种，在ASP.NET中已经可以实现对页面局部进行缓存，而使用memcached的缓存比 ASP.NET的局部缓存更加灵活，可以缓存任意的对象，不管是否在页面上输出。而memcached最大的优点是可以分布式的部署，这对于大规模应用来说也是必不可少的要求。</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">LiveJournal.com使用了memcached在前端进行缓存，取得了良好的效果，而像wikipedia,sourceforge等也采用了或即将采用memcached作为缓存工具。memcached可以大规模网站应用发挥巨大的作用。</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">2.1 memcached 的工作原理</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">首先 memcached 是以守护程序方式运行于一个或多个服务器中，随时接受客户端的连接操作，客户端可以由各种语言编写，目前已知的客户端 API 包括 Perl/PHP/Python/Ruby/Java/C#/C 等等。PHP 等客户端在与 memcached 服务建立连接之后，接下来的事情就是存取对象了，每个被存取的对象都有一个唯一的标识符 key，存取操作均通过这个 key 进行，保存到 memcached 中的对象实际上是放置内存中的，并不是保存在 cache 文件中的，这也是为什么 memcached 能够如此高效快速的原因。注意，这些对象并不是持久的，服务停止之后，里边的数据就会丢失。</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">.2 &nbsp;memcached 安装</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">首先是下载 memcached 了，目前最新版本是 1.1.12，直接从官方网站即可下载到 memcached-1.1.12.tar.gz。除此之外，memcached 用到了 libevent，我下载的是 libevent-1.1a.tar.gz</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">接下来是分别将 libevent-1.1a.tar.gz 和 memcached-1.1.12.tar.gz 解开包、编译、安装：</span></div><div><span style="line-height: 24px;"><br /></span></div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#&nbsp;tar&nbsp;-xzf&nbsp;libevent-1.1a.tar.gz&nbsp;<br />#&nbsp;cd&nbsp;libevent-1.1a&nbsp;<br />#&nbsp;./configure&nbsp;--prefix=/usr&nbsp;<br />#&nbsp;make&nbsp;<br />#&nbsp;make&nbsp;install&nbsp;<br />#&nbsp;cd&nbsp;..&nbsp;<br />#&nbsp;tar&nbsp;-xzf&nbsp;memcached-1.1.12.tar.gz&nbsp;<br />#&nbsp;cd&nbsp;memcached-1.1.12&nbsp;<br />#&nbsp;./configure&nbsp;--prefix=/usr&nbsp;<br />#&nbsp;make&nbsp;<br />#&nbsp;make&nbsp;install</div></div><div><span style="line-height: 24px;">安装完成之后，memcached 应该在 /usr/bin/memcached。</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">3.如何使用memcached-Server端?</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">在服务端运行：</span></div><div><span style="line-height: 24px;"><br /></span></div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#&nbsp;./memcached&nbsp;-d&nbsp;-m&nbsp;2048&nbsp;-l&nbsp;10.0.0.40&nbsp;-p&nbsp;11211&nbsp;&nbsp;-u&nbsp;httpd</div></div><div></div><div><span style="line-height: 24px;">-d 以守护程序（daemon）方式运行 memcached；</span></div><div><span style="line-height: 24px;">-m 设置 memcached 可以使用的内存大小，单位为 M；</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">-l 设置监听的 IP&amp;nb</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">sp;地址，如果是本机的话，通常可以不设置此参数；</span></div><div><span style="line-height: 24px;">-p 设置监听的端口，默认为 11211，所以也可以不设置此参数；</span></div><div><span style="line-height: 24px;">-u 指定用户，如果当前为 root 的话，需要使用此参数指定用户。</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">这将会启动一个占用2G内存的进程，并打开11211端口用于接收请求。由于32位系统只能处理4G内存的寻址，所以在大于4G内存使用PAE的32位服务器上可以运行2-3个进程，并在不同端口进行监听。</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">4. 如何使用memcached-Client端?</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">在应用端包含一个用于描述Client的Class后，就可以直接使用，非常简单。</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">PHP Example:</span></div><div></div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->$options["debug"]&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br /><br />$memc&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;MemCachedClient($options);<br /><br />$myarr&nbsp;=&nbsp;array("one","two",&nbsp;3);<br /><br />$memc-&gt;set("key_one",&nbsp;$myarr);<br />$options["servers"]&nbsp;=&nbsp;array("192.168.1.41:11211",&nbsp;"192.168.1.42:11212");<br /><br />$val&nbsp;=&nbsp;$memc-&gt;get("key_one");<br /><br />print&nbsp;$val[0]."\n";&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;prints&nbsp;'one&#8216;</span><span style="color: #008000; "><br /></span><br />print&nbsp;$val[1]."\n";&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;prints&nbsp;'two&#8216;</span><span style="color: #008000; "><br /></span><br />print&nbsp;$val[2]."\n";&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;prints&nbsp;3<br /></span></div></div><div><span style="line-height: 24px;">5.为什么不使用数据库做这些？</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">暂且不考虑使用什么样的数据库(MS-SQL, Oracle, Postgres, MysQL-InnoDB, etc..), 实现事务(ACID，Atomicity, Consistency, Isolation, and Durability )需要大量开销，特别当使用到硬盘的时候，这就意味着查询可能会阻塞。当使用不包含事务的数据库（例如Mysql-MyISAM），上面的开销不存在，但读线程又可能会被写线程阻塞。Memcached从不阻塞，速度非常快。</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">6.为什么不使用共享内存?</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">最初的缓存做法是在线程内对对象进行缓存，但这样进程间就无法共享缓存，命中率非常低，导致缓存效率极低。后来出现了共享内存的缓存，多个进程或者线程共享同一块缓存，但毕竟还是只能局限在一台机器上，多台机器做相同的缓存同样是一种资源的浪费，而且命中率也比较低。</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">Memcached Server和Clients共同工作，实现跨服务器分布式的全局的缓存。并且可以与Web Server共同工作，Web Server对CPU要求高，对内存要求低，Memcached Server对CPU要求低，对内存要求高，所以可以搭配使用。</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">7.Mysql 4.x的缓存怎么样?</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">Mysql查询缓存不是很理想，因为以下几点：</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">当指定的表发生更新后，查询缓存会被清空。在一个大负载的系统上这样的事情发生的非常频繁，导致查询缓存效率非常低，有的情况下甚至还不如不开，因为它对cache的管理还是会有开销。</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">在32位机器上，Mysql对内存的操作还是被限制在4G以内，但memcached可以分布开，内存规模理论上不受限制。</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">Mysql上的是查询缓存，而不是对象缓存，如果在查询后还需要大量其它操作，查询缓存就帮不上忙了。</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">如果要缓存的数据不大，并且查询的不是非常频繁，这样的情况下可以用Mysql 查询缓存，不然的话memcached更好。</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">8.数据库同步怎么样？</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">这里的数据库同步是指的类似Mysql Master-Slave模式的靠日志同步实现数据库同步的机制。</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">你可以分布读操作，但无法分布写操作，但写操作的同步需要消耗大量的资源，而且这个开销是随着slave服务器的增长而不断增长的。</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">下一步是要对数据库进行水平切分，从而让不同的数据分布到不同的数据库服务器组上，从而实现分布的读写，这需要在应用中实现根据不同的数据连接不同的数据库。</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">当这一模式工作后（我们也推荐这样做），更多的数据库导致更多的让人头疼的硬件错误。</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">Memcached可以有效的降低对数据库的访问，让数据库用主要的精力来做不频繁的写操作，而这是数据库自己控制的，很少会自己阻塞 自己。</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">9.Memcached快吗？</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">非常快，它使用libevent，可以应付任意数量打开的连接（使用epoll，而非poll），使用非阻塞网络IO，分布式散列对象到不同的服务器，查询复杂度是O(1)。</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">10.memcached的相关抽象类</span></div><div><span style="line-height: 24px;"><br /></span></div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">abstract</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;BaseManager&lt;T&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;BaseObject&gt;&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;Manager&lt;T&gt;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />{&nbsp;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;MemcachedClient&nbsp;memcached;&nbsp;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">protected</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;default_cache_time_second&nbsp;=&nbsp;3600;&nbsp;&nbsp;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;setMemcached(MemcachedClient&nbsp;memcached)&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />{&nbsp;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.memcached&nbsp;=&nbsp;memcached;&nbsp;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;MemcachedClient&nbsp;getMemcached()&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />{&nbsp;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;memcached;&nbsp;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;setDefault_cache_time_second(<span style="color: #0000FF; ">int</span>&nbsp;default_cache_time_second)&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />{&nbsp;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.default_cache_time_second&nbsp;=&nbsp;default_cache_time_second;&nbsp;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Object&nbsp;getCacheValueFromMemcached(String&nbsp;key)&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;getCacheValueFromMemcached(key,&nbsp;<span style="color: #0000FF; ">null</span>);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Object&nbsp;getCacheValueFromMemcached(String&nbsp;key,&nbsp;Object&nbsp;obj)&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;new_obj&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new_obj&nbsp;=&nbsp;memcached.get(key);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(Exception&nbsp;e)&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(logger.isWarnEnabled())&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />{<br /><br />logger.warn("Failed&nbsp;to&nbsp;get&nbsp;from&nbsp;MeMCache",&nbsp;e);&nbsp;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;(new_obj&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;?&nbsp;new_obj&nbsp;:&nbsp;obj;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;setCacheValueToMemcached(String&nbsp;cacheKey,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;time_to_live,&nbsp;Serializable&nbsp;obj)&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />{&nbsp;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(<span style="color: #0000FF; ">null</span>&nbsp;!=&nbsp;memcached.get(cacheKey))&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />{&nbsp;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcached.replace(cacheKey,&nbsp;time_to_live,&nbsp;obj);&nbsp;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />{&nbsp;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcached.add(cacheKey,&nbsp;time_to_live,&nbsp;obj);&nbsp;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</div></div><div><span style="line-height: 24px;">11.service调用memcache的一个例子：</span></div><div><span style="line-height: 24px;"><br /></span></div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">public</span>&nbsp;List&lt;Integer&gt;&nbsp;getLastModifyAlbumMember(<span style="color: #0000FF; ">int</span>&nbsp;limit)&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;cacheKey&nbsp;=&nbsp;<span style="color: #0000FF; ">this</span>.createCachekey(<span style="color: #0000FF; ">new</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object[]<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />{"schedule","lastmodifyalbumember",limit});<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;list&nbsp;=&nbsp;(List)&nbsp;<span style="color: #0000FF; ">this</span>.getCacheValueFromMemcached(cacheKey);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;Integer&gt;&nbsp;list1&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ArrayList&lt;Integer&gt;();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(<span style="color: #0000FF; ">null</span>!=list&amp;&amp;list.size()&gt;0)<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(Object&nbsp;aList&nbsp;:&nbsp;list)&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list1.add(Integer.parseInt(String.valueOf(aList)));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;list1;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}</div></div><div><span style="line-height: 24px;">参考资料：</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">http://www.danga.com/</span></div><div><span style="line-height: 24px;"><br /></span></div><div><span style="line-height: 24px;">http://www.linuxjournal.com/article/7451</span></div></p><img src ="http://www.blogjava.net/czihong/aggbug/375295.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">Chan Chen</a> 2012-04-19 17:36 <a href="http://www.blogjava.net/czihong/articles/375295.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>