﻿<?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>IT博客-大话人生</title><link>http://www.cnitblog.com/stomic/</link><description /><language>zh-cn</language><lastBuildDate>Mon, 09 Mar 2026 18:45:54 GMT</lastBuildDate><pubDate>Mon, 09 Mar 2026 18:45:54 GMT</pubDate><ttl>60</ttl><item><title>在很多场合中，你都必须指定一个回调程序</title><link>http://www.cnitblog.com/stomic/archive/2022/10/02/96121.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Sat, 01 Oct 2022 22:15:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2022/10/02/96121.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/96121.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2022/10/02/96121.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/96121.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/96121.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 228				729				112				107				699				486				724				748				068				909				790				091				430				864				743				784				369				926				53...&nbsp;&nbsp;<a href='http://www.cnitblog.com/stomic/archive/2022/10/02/96121.html'>阅读全文</a><img src ="http://www.cnitblog.com/stomic/aggbug/96121.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2022-10-02 06:15 <a href="http://www.cnitblog.com/stomic/archive/2022/10/02/96121.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>就是一个很严重的问题既然 浏览器都已经冻结</title><link>http://www.cnitblog.com/stomic/archive/2022/10/02/96119.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Sat, 01 Oct 2022 22:14:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2022/10/02/96119.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/96119.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2022/10/02/96119.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/96119.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/96119.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 733				520				538				851				708				483				203				286				795				457				206				775				967				609				851				115				738				823				38...&nbsp;&nbsp;<a href='http://www.cnitblog.com/stomic/archive/2022/10/02/96119.html'>阅读全文</a><img src ="http://www.cnitblog.com/stomic/aggbug/96119.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2022-10-02 06:14 <a href="http://www.cnitblog.com/stomic/archive/2022/10/02/96119.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>既然同步通信在使用中会造成如此严重的问题</title><link>http://www.cnitblog.com/stomic/archive/2022/10/02/96120.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Sat, 01 Oct 2022 22:14:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2022/10/02/96120.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/96120.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2022/10/02/96120.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/96120.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/96120.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 051				456				887				086				278				560				208				236				957				186				964				342				989				238				589				878				386				544				00...&nbsp;&nbsp;<a href='http://www.cnitblog.com/stomic/archive/2022/10/02/96120.html'>阅读全文</a><img src ="http://www.cnitblog.com/stomic/aggbug/96120.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2022-10-02 06:14 <a href="http://www.cnitblog.com/stomic/archive/2022/10/02/96120.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>当浏览器在等待服务器响应时它不能对用户行为作出响应</title><link>http://www.cnitblog.com/stomic/archive/2022/10/02/96118.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Sat, 01 Oct 2022 22:13:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2022/10/02/96118.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/96118.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2022/10/02/96118.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/96118.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/96118.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 512				899				982				947				307				848				406				375				326				910				305				168				720				989				774				276				660				684				34...&nbsp;&nbsp;<a href='http://www.cnitblog.com/stomic/archive/2022/10/02/96118.html'>阅读全文</a><img src ="http://www.cnitblog.com/stomic/aggbug/96118.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2022-10-02 06:13 <a href="http://www.cnitblog.com/stomic/archive/2022/10/02/96118.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>要求在与服务器进行交互时要用异步通信</title><link>http://www.cnitblog.com/stomic/archive/2022/10/02/96117.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Sat, 01 Oct 2022 22:12:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2022/10/02/96117.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/96117.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2022/10/02/96117.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/96117.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/96117.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 328				617				171				378				291				085				952				342				680				592				417				555				188				033				955				618				369				248				07...&nbsp;&nbsp;<a href='http://www.cnitblog.com/stomic/archive/2022/10/02/96117.html'>阅读全文</a><img src ="http://www.cnitblog.com/stomic/aggbug/96117.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2022-10-02 06:12 <a href="http://www.cnitblog.com/stomic/archive/2022/10/02/96117.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>就不能 对用户的鼠标点击和键盘操作做出响</title><link>http://www.cnitblog.com/stomic/archive/2022/10/02/96116.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Sat, 01 Oct 2022 22:11:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2022/10/02/96116.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/96116.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2022/10/02/96116.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/96116.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/96116.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 845				876				681				567				327				357				011				485				744				876				658				319				068				741				250				791				934				212				36...&nbsp;&nbsp;<a href='http://www.cnitblog.com/stomic/archive/2022/10/02/96116.html'>阅读全文</a><img src ="http://www.cnitblog.com/stomic/aggbug/96116.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2022-10-02 06:11 <a href="http://www.cnitblog.com/stomic/archive/2022/10/02/96116.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>发性能的影响也越大。对于多数应用程序</title><link>http://www.cnitblog.com/stomic/archive/2022/10/01/96072.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Sat, 01 Oct 2022 02:57:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2022/10/01/96072.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/96072.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2022/10/01/96072.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/96072.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/96072.html</trackback:ping><description><![CDATA[但是对并发性能的影响也越大。对于多数应用程序，可以有优先考虑把数据库系统的隔离级别设为Read Commited，它能够避免脏读，而且具有较好的并发性能。尽管它会导致不可重复读、虚读和第二类丢失更新这些并发问题，在可能出现这类问题的个别场合，可以由



<a href="http://ds.163.com/article/633782ebb3801c0001778aa9/" class="uri">547353</a><br /><a href="http://ds.163.com/feed/633782ebb3801c0001778aa9/" class="uri">009272</a><br /><a href="http://ds.163.com/article/633782ed880c71000193a37e/" class="uri">964758</a><br /><a href="http://ds.163.com/feed/633782ed880c71000193a37e/" class="uri">011216</a><br /><a href="http://ds.163.com/article/633782eeb4e5c000012fe555/" class="uri">890010</a><br /><a href="http://ds.163.com/feed/633782eeb4e5c000012fe555/" class="uri">936811</a><br /><a href="http://ds.163.com/article/633782f027237900019c6eea/" class="uri">092822</a><br /><a href="http://ds.163.com/feed/633782f027237900019c6eea/" class="uri">052505</a><br /><a href="http://ds.163.com/article/633782f1880c71000193a386/" class="uri">117477</a><br /><a href="http://ds.163.com/feed/633782f1880c71000193a386/" class="uri">294994</a><br /><a href="http://ds.163.com/article/633782f385eece000183e92f/" class="uri">996906</a><br /><a href="http://ds.163.com/feed/633782f385eece000183e92f/" class="uri">608942</a><br /><a href="http://ds.163.com/article/633782f4d3fdd00001973fbb/" class="uri">315864</a><br /><a href="http://ds.163.com/feed/633782f4d3fdd00001973fbb/" class="uri">029545</a><br /><a href="http://ds.163.com/article/633782f685eece000183e934/" class="uri">655470</a><br /><a href="http://ds.163.com/feed/633782f685eece000183e934/" class="uri">902940</a><br /><a href="http://ds.163.com/article/633782f7a1ca540001d1b31e/" class="uri">356831</a><br /><a href="http://ds.163.com/feed/633782f7a1ca540001d1b31e/" class="uri">900919</a><br /><a href="http://ds.163.com/article/633782f98d5cee00016f818e/" class="uri">970683</a><br /><a href="http://ds.163.com/feed/633782f98d5cee00016f818e/" class="uri">164666</a><br /><a href="http://ds.163.com/article/633782fb9f65bb00013fb27b/" class="uri">313163</a><br /><a href="http://ds.163.com/feed/633782fb9f65bb00013fb27b/" class="uri">307714</a><br /><a href="http://ds.163.com/article/633782fc8d5cee00016f8191/" class="uri">534333</a><br /><a href="http://ds.163.com/feed/633782fc8d5cee00016f8191/" class="uri">872761</a><br /><a href="http://ds.163.com/article/633782fec4707400013644d0/" class="uri">371218</a><br /><a href="http://ds.163.com/feed/633782fec4707400013644d0/" class="uri">516732</a><br /><a href="http://ds.163.com/article/633782ff27237900019c6f04/" class="uri">266218</a><br /><a href="http://ds.163.com/feed/633782ff27237900019c6f04/" class="uri">513084</a><br /><a href="http://ds.163.com/article/63378300cb2dc40001eb387b/" class="uri">562442</a><br /><a href="http://ds.163.com/feed/63378300cb2dc40001eb387b/" class="uri">922916</a><br /><a href="http://ds.163.com/article/6337830285eece000183e941/" class="uri">526967</a><br /><a href="http://ds.163.com/feed/6337830285eece000183e941/" class="uri">073351</a><br /><a href="http://ds.163.com/article/6337830385eece000183e945/" class="uri">748325</a><br /><a href="http://ds.163.com/feed/6337830385eece000183e945/" class="uri">697944</a><br /><a href="http://ds.163.com/article/63378305d3fdd00001973fd3/" class="uri">140820</a><br /><a href="http://ds.163.com/feed/63378305d3fdd00001973fd3/" class="uri">695106</a><br /><a href="http://ds.163.com/article/63378306b3801c0001778abd/" class="uri">209730</a><br /><a href="http://ds.163.com/feed/63378306b3801c0001778abd/" class="uri">396971</a><br /><a href="http://ds.163.com/article/63378308c5e20100011e59d6/" class="uri">475970</a><br /><a href="http://ds.163.com/feed/63378308c5e20100011e59d6/" class="uri">829690</a><br /><a href="http://ds.163.com/article/63378311b3801c0001778ac0/" class="uri">969338</a><br /><a href="http://ds.163.com/feed/63378311b3801c0001778ac0/" class="uri">012164</a><br /><a href="http://ds.163.com/article/63378313d3fdd00001973fda/" class="uri">495936</a><br /><a href="http://ds.163.com/feed/63378313d3fdd00001973fda/" class="uri">006033</a><br /><a href="http://ds.163.com/article/633783148d5cee00016f81a1/" class="uri">899307</a><br /><a href="http://ds.163.com/feed/633783148d5cee00016f81a1/" class="uri">807911</a><br /><a href="http://ds.163.com/article/633783169f65bb00013fb28f/" class="uri">511011</a><br /><a href="http://ds.163.com/feed/633783169f65bb00013fb28f/" class="uri">075855</a><br /><a href="http://ds.163.com/article/63378317c5e20100011e59e4/" class="uri">866808</a><br /><a href="http://ds.163.com/feed/63378317c5e20100011e59e4/" class="uri">192027</a><br /><a href="http://ds.163.com/article/63378319c4707400013644e9/" class="uri">830762</a><br /><a href="http://ds.163.com/feed/63378319c4707400013644e9/" class="uri">744287</a><br /><a href="http://ds.163.com/article/6337831acb2dc40001eb3895/" class="uri">261814</a><br /><a href="http://ds.163.com/feed/6337831acb2dc40001eb3895/" class="uri">165139</a><br /><a href="http://ds.163.com/article/6337831cc5e20100011e59eb/" class="uri">291151</a><br /><a href="http://ds.163.com/feed/6337831cc5e20100011e59eb/" class="uri">240891</a><br /><a href="http://ds.163.com/article/6337831d1c09770001f198e2/" class="uri">094684</a><br /><a href="http://ds.163.com/feed/6337831d1c09770001f198e2/" class="uri">339842</a><br /><a href="http://ds.163.com/article/6337831fd3fdd00001973fe5/" class="uri">605149</a><br /><a href="http://ds.163.com/feed/6337831fd3fdd00001973fe5/" class="uri">144316</a><br /><a href="http://ds.163.com/article/63378320b3801c0001778ace/" class="uri">168119</a><br /><a href="http://ds.163.com/feed/63378320b3801c0001778ace/" class="uri">035657</a><br /><a href="http://ds.163.com/article/63378322cd732300011abb70/" class="uri">366805</a><br /><a href="http://ds.163.com/feed/63378322cd732300011abb70/" class="uri">729496</a><br /><a href="http://ds.163.com/article/633783239f65bb00013fb29a/" class="uri">995442</a><br /><a href="http://ds.163.com/feed/633783239f65bb00013fb29a/" class="uri">698756</a><br /><a href="http://ds.163.com/article/633783258d5cee00016f81b2/" class="uri">543894</a><br /><a href="http://ds.163.com/feed/633783258d5cee00016f81b2/" class="uri">883329</a><br /><a href="http://ds.163.com/article/63378326d3fdd00001973fec/" class="uri">467624</a><br /><a href="http://ds.163.com/feed/63378326d3fdd00001973fec/" class="uri">880526</a><br /><a href="http://ds.163.com/article/63378328a1ca540001d1b349/" class="uri">241574</a><br /><a href="http://ds.163.com/feed/63378328a1ca540001d1b349/" class="uri">051924</a><br /><a href="http://ds.163.com/article/6337832985eece000183e96b/" class="uri">810038</a><br /><a href="http://ds.163.com/feed/6337832985eece000183e96b/" class="uri">738059</a><br /><a href="http://ds.163.com/article/6337832b8d5cee00016f81b8/" class="uri">969517</a><br /><a href="http://ds.163.com/feed/6337832b8d5cee00016f81b8/" class="uri">622222</a><br /><a href="http://ds.163.com/article/6337832c85eece000183e96e/" class="uri">819819</a><br /><a href="http://ds.163.com/feed/6337832c85eece000183e96e/" class="uri">642204</a><br /><a href="http://ds.163.com/article/6337832e39677300015b888a/" class="uri">302881</a><br /><a href="http://ds.163.com/feed/6337832e39677300015b888a/" class="uri">408960</a><br /><a href="http://ds.163.com/article/6337832fd3fdd00001973ffb/" class="uri">923125</a><br /><a href="http://ds.163.com/feed/6337832fd3fdd00001973ffb/" class="uri">122338</a><br /><a href="http://ds.163.com/article/63378331c5e20100011e5a05/" class="uri">966041</a><br /><a href="http://ds.163.com/feed/63378331c5e20100011e5a05/" class="uri">121469</a><br /><a href="http://ds.163.com/article/63378332d3fdd00001973fff/" class="uri">571838</a><br /><a href="http://ds.163.com/feed/63378332d3fdd00001973fff/" class="uri">462828</a><br /><a href="http://ds.163.com/article/6337833485eece000183e97c/" class="uri">195349</a><br /><a href="http://ds.163.com/feed/6337833485eece000183e97c/" class="uri">741687</a><br /><a href="http://ds.163.com/article/6337834ec470740001364522/" class="uri">640607</a><br /><a href="http://ds.163.com/feed/6337834ec470740001364522/" class="uri">435833</a><br /><a href="http://ds.163.com/article/633783501c09770001f19912/" class="uri">845560</a><br /><a href="http://ds.163.com/feed/633783501c09770001f19912/" class="uri">135287</a><br /><a href="http://ds.163.com/article/63378351d70a9b0001f3dfad/" class="uri">082456</a><br /><a href="http://ds.163.com/feed/63378351d70a9b0001f3dfad/" class="uri">286824</a><br /><a href="http://ds.163.com/article/6337835327237900019c6f5a/" class="uri">263527</a><br /><a href="http://ds.163.com/feed/6337835327237900019c6f5a/" class="uri">157254</a><br /><a href="http://ds.163.com/article/63378354b4e5c000012fe5cc/" class="uri">345587</a><br /><a href="http://ds.163.com/feed/63378354b4e5c000012fe5cc/" class="uri">988890</a><br /><a href="http://ds.163.com/article/633783569f65bb00013fb2b8/" class="uri">265149</a><br /><a href="http://ds.163.com/feed/633783569f65bb00013fb2b8/" class="uri">649911</a><br /><a href="http://ds.163.com/article/63378357cd732300011abba9/" class="uri">441903</a><br /><a href="http://ds.163.com/feed/63378357cd732300011abba9/" class="uri">005414</a><br /><a href="http://ds.163.com/article/63378358b4e5c000012fe5d0/" class="uri">861826</a><br /><a href="http://ds.163.com/feed/63378358b4e5c000012fe5d0/" class="uri">946335</a><br /><a href="http://ds.163.com/article/6337835a85eece000183e9aa/" class="uri">242094</a><br /><a href="http://ds.163.com/feed/6337835a85eece000183e9aa/" class="uri">913320</a><br /><a href="http://ds.163.com/article/6337835ca1ca540001d1b389/" class="uri">484661</a><br /><a href="http://ds.163.com/feed/6337835ca1ca540001d1b389/" class="uri">255593</a><br /><a href="http://ds.163.com/article/6337835dcb2dc40001eb38e9/" class="uri">869849</a><br /><a href="http://ds.163.com/feed/6337835dcb2dc40001eb38e9/" class="uri">959934</a><br /><a href="http://ds.163.com/article/6337835f39677300015b88a5/" class="uri">091673</a><br /><a href="http://ds.163.com/feed/6337835f39677300015b88a5/" class="uri">987242</a><br /><a href="http://ds.163.com/article/63378360b3801c0001778afb/" class="uri">039793</a><br /><a href="http://ds.163.com/feed/63378360b3801c0001778afb/" class="uri">493497</a><br /><a href="http://ds.163.com/article/63378362cb2dc40001eb38ec/" class="uri">928342</a><br /><a href="http://ds.163.com/feed/63378362cb2dc40001eb38ec/" class="uri">509105</a><br /><a href="http://ds.163.com/article/6337836485eece000183e9b0/" class="uri">907448</a><br /><a href="http://ds.163.com/feed/6337836485eece000183e9b0/" class="uri">206298</a><br /><a href="http://ds.163.com/article/63378365880c71000193a436/" class="uri">289153</a><br /><a href="http://ds.163.com/feed/63378365880c71000193a436/" class="uri">623130</a><br /><a href="http://ds.163.com/article/63378367a1ca540001d1b399/" class="uri">325050</a><br /><a href="http://ds.163.com/feed/63378367a1ca540001d1b399/" class="uri">895193</a><br /><a href="http://ds.163.com/article/63378368880c71000193a43a/" class="uri">641587</a><br /><a href="http://ds.163.com/feed/63378368880c71000193a43a/" class="uri">129070</a><br /><a href="http://ds.163.com/article/6337836a27237900019c6f7f/" class="uri">316568</a><br /><a href="http://ds.163.com/feed/6337836a27237900019c6f7f/" class="uri">545555</a><br /><a href="http://ds.163.com/article/6337836b1c09770001f19920/" class="uri">624407</a><br /><a href="http://ds.163.com/feed/6337836b1c09770001f19920/" class="uri">230244</a><br /><a href="http://ds.163.com/article/6337836d39677300015b88b7/" class="uri">999444</a><br /><a href="http://ds.163.com/feed/6337836d39677300015b88b7/" class="uri">899226</a><br /><a href="http://ds.163.com/article/6337836ea1ca540001d1b3a3/" class="uri">637409</a><br /><a href="http://ds.163.com/feed/6337836ea1ca540001d1b3a3/" class="uri">609012</a><br /><a href="http://ds.163.com/article/6337836fc5e20100011e5a49/" class="uri">175510</a><br /><a href="http://ds.163.com/feed/6337836fc5e20100011e5a49/" class="uri">792164</a><br /><a href="http://ds.163.com/article/6337837185eece000183e9c0/" class="uri">347882</a><br /><a href="http://ds.163.com/feed/6337837185eece000183e9c0/" class="uri">401501</a><br /><a href="http://ds.163.com/article/6337838339677300015b88c3/" class="uri">453023</a><br /><a href="http://ds.163.com/feed/6337838339677300015b88c3/" class="uri">594320</a><br /><a href="http://ds.163.com/article/633783858d5cee00016f81e4/" class="uri">916351</a><br /><a href="http://ds.163.com/feed/633783858d5cee00016f81e4/" class="uri">628779</a><br /><a href="http://ds.163.com/article/63378386c5e20100011e5a69/" class="uri">069428</a><br /><a href="http://ds.163.com/feed/63378386c5e20100011e5a69/" class="uri">213147</a><br /><a href="http://ds.163.com/article/633783889f65bb00013fb2d0/" class="uri">394351</a><br /><a href="http://ds.163.com/feed/633783889f65bb00013fb2d0/" class="uri">061671</a><br /><a href="http://ds.163.com/article/63378389b3801c0001778b18/" class="uri">615257</a><br /><a href="http://ds.163.com/feed/63378389b3801c0001778b18/" class="uri">317568</a><br /><a href="http://ds.163.com/article/6337838bb3801c0001778b1c/" class="uri">520115</a><br /><a href="http://ds.163.com/feed/6337838bb3801c0001778b1c/" class="uri">038050</a><br /><a href="http://ds.163.com/article/6337838cc470740001364570/" class="uri">192007</a><br /><a href="http://ds.163.com/feed/6337838cc470740001364570/" class="uri">610701</a><br /><a href="http://ds.163.com/article/6337838e880c71000193a462/" class="uri">682921</a><br /><a href="http://ds.163.com/feed/6337838e880c71000193a462/" class="uri">151830</a><br /><a href="http://ds.163.com/article/6337838f9f65bb00013fb2d4/" class="uri">689975</a><br /><a href="http://ds.163.com/feed/6337838f9f65bb00013fb2d4/" class="uri">687455</a><br /><a href="http://ds.163.com/article/63378391cd732300011abbc6/" class="uri">864645</a><br /><a href="http://ds.163.com/feed/63378391cd732300011abbc6/" class="uri">817796</a><br /><a href="http://ds.163.com/article/6337839285eece000183e9e2/" class="uri">569867</a><br /><a href="http://ds.163.com/feed/6337839285eece000183e9e2/" class="uri">826096</a><br /><a href="http://ds.163.com/article/63378394cd732300011abbcf/" class="uri">268197</a><br /><a href="http://ds.163.com/feed/63378394cd732300011abbcf/" class="uri">858341</a><br /><a href="http://ds.163.com/article/63378395c5e20100011e5a7f/" class="uri">823300</a><br /><a href="http://ds.163.com/feed/63378395c5e20100011e5a7f/" class="uri">937260</a><br /><a href="http://ds.163.com/article/63378397b3801c0001778b27/" class="uri">138328</a><br /><a href="http://ds.163.com/feed/63378397b3801c0001778b27/" class="uri">916383</a><br /><a href="http://ds.163.com/article/63378398a1ca540001d1b3d4/" class="uri">296881</a><br /><a href="http://ds.163.com/feed/63378398a1ca540001d1b3d4/" class="uri">223072</a><br /><a href="http://ds.163.com/article/6337839a1c09770001f19944/" class="uri">335042</a><br /><a href="http://ds.163.com/feed/6337839a1c09770001f19944/" class="uri">372001</a><br /><a href="http://ds.163.com/article/6337839bb4e5c000012fe61f/" class="uri">461550</a><br /><a href="http://ds.163.com/feed/6337839bb4e5c000012fe61f/" class="uri">936081</a><br /><a href="http://ds.163.com/article/6337839db4e5c000012fe622/" class="uri">651911</a><br /><a href="http://ds.163.com/feed/6337839db4e5c000012fe622/" class="uri">753133</a><br /><a href="http://ds.163.com/article/6337839ed3fdd00001974046/" class="uri">328737</a><br /><a href="http://ds.163.com/feed/6337839ed3fdd00001974046/" class="uri">766250</a><br /><a href="http://ds.163.com/article/633783a0d70a9b0001f3dfe4/" class="uri">262491</a><br /><a href="http://ds.163.com/feed/633783a0d70a9b0001f3dfe4/" class="uri">319655</a><br /><a href="http://ds.163.com/article/633783a1c5e20100011e5a89/" class="uri">693603</a><br /><a href="http://ds.163.com/feed/633783a1c5e20100011e5a89/" class="uri">816065</a><br /><a href="http://ds.163.com/article/633783a3c5e20100011e5a8b/" class="uri">123601</a><br /><a href="http://ds.163.com/feed/633783a3c5e20100011e5a8b/" class="uri">388487</a><br /><a href="http://ds.163.com/article/633783a4cb2dc40001eb393f/" class="uri">340177</a><br /><a href="http://ds.163.com/feed/633783a4cb2dc40001eb393f/" class="uri">872967</a><br /><a href="http://ds.163.com/article/633783a59f65bb00013fb2e7/" class="uri">278177</a><br /><a href="http://ds.163.com/feed/633783a59f65bb00013fb2e7/" class="uri">426577</a><br /><a href="http://ds.163.com/article/633783b5b4e5c000012fe641/" class="uri">818076</a><br /><a href="http://ds.163.com/feed/633783b5b4e5c000012fe641/" class="uri">280919</a><br /><a href="http://ds.163.com/article/633783b6a1ca540001d1b3f2/" class="uri">350273</a><br /><a href="http://ds.163.com/feed/633783b6a1ca540001d1b3f2/" class="uri">765975</a><br /><a href="http://ds.163.com/article/633783b7c47074000136459b/" class="uri">680772</a><br /><a href="http://ds.163.com/feed/633783b7c47074000136459b/" class="uri">370805</a><br /><a href="http://ds.163.com/article/633783b9b4e5c000012fe647/" class="uri">765969</a><br /><a href="http://ds.163.com/feed/633783b9b4e5c000012fe647/" class="uri">991113</a><br /><a href="http://ds.163.com/article/633783bbc5e20100011e5aa7/" class="uri">175117</a><br /><a href="http://ds.163.com/feed/633783bbc5e20100011e5aa7/" class="uri">849728</a><br /><a href="http://ds.163.com/article/633783bc85eece000183ea0c/" class="uri">649047</a><br /><a href="http://ds.163.com/feed/633783bc85eece000183ea0c/" class="uri">474659</a><br /><a href="http://ds.163.com/article/633783becd732300011abbe8/" class="uri">561380</a><br /><a href="http://ds.163.com/feed/633783becd732300011abbe8/" class="uri">022296</a><br /><a href="http://ds.163.com/article/633783bf39677300015b88dc/" class="uri">896052</a><br /><a href="http://ds.163.com/feed/633783bf39677300015b88dc/" class="uri">118122</a><br /><a href="http://ds.163.com/article/633783c1c5e20100011e5aaf/" class="uri">350269</a><br /><a href="http://ds.163.com/feed/633783c1c5e20100011e5aaf/" class="uri">977229</a><br /><a href="http://ds.163.com/article/633783c21c09770001f19960/" class="uri">677729</a><br /><a href="http://ds.163.com/feed/633783c21c09770001f19960/" class="uri">450412</a><br /><a href="http://ds.163.com/article/633783c427237900019c6fd7/" class="uri">021073</a><br /><a href="http://ds.163.com/feed/633783c427237900019c6fd7/" class="uri">594479</a><br /><a href="http://ds.163.com/article/633783c585eece000183ea14/" class="uri">604711</a><br /><a href="http://ds.163.com/feed/633783c585eece000183ea14/" class="uri">759697</a><br /><a href="http://ds.163.com/article/633783c6d70a9b0001f3e003/" class="uri">681481</a><br /><a href="http://ds.163.com/feed/633783c6d70a9b0001f3e003/" class="uri">873195</a><br /><a href="http://ds.163.com/article/633783c8b4e5c000012fe657/" class="uri">972598</a><br /><a href="http://ds.163.com/feed/633783c8b4e5c000012fe657/" class="uri">202172</a><br /><a href="http://ds.163.com/article/633783c985eece000183ea1b/" class="uri">329515</a><br /><a href="http://ds.163.com/feed/633783c985eece000183ea1b/" class="uri">156927</a><br /><a href="http://ds.163.com/article/633783cbd3fdd00001974069/" class="uri">289585</a><br /><a href="http://ds.163.com/feed/633783cbd3fdd00001974069/" class="uri">265693</a><br /><a href="http://ds.163.com/article/633783ccd3fdd0000197406b/" class="uri">796910</a><br /><a href="http://ds.163.com/feed/633783ccd3fdd0000197406b/" class="uri">950215</a><br /><a href="http://ds.163.com/article/633783cdc5e20100011e5ac0/" class="uri">861905</a><br /><a href="http://ds.163.com/feed/633783cdc5e20100011e5ac0/" class="uri">274737</a><br /><a href="http://ds.163.com/article/633783cfcb2dc40001eb396e/" class="uri">883900</a><br /><a href="http://ds.163.com/feed/633783cfcb2dc40001eb396e/" class="uri">308306</a><br /><a href="http://ds.163.com/article/633783d027237900019c6fe3/" class="uri">779355</a><br /><a href="http://ds.163.com/feed/633783d027237900019c6fe3/" class="uri">313832</a><br /><a href="http://ds.163.com/article/633783d29f65bb00013fb303/" class="uri">647944</a><br /><a href="http://ds.163.com/feed/633783d29f65bb00013fb303/" class="uri">265958</a><br /><a href="http://ds.163.com/article/633783d327237900019c6fe8/" class="uri">036507</a><br /><a href="http://ds.163.com/feed/633783d327237900019c6fe8/" class="uri">767040</a><br /><a href="http://ds.163.com/article/633783e885eece000183ea51/" class="uri">238774</a><br /><a href="http://ds.163.com/feed/633783e885eece000183ea51/" class="uri">112072</a><br /><a href="http://ds.163.com/article/633783eacb2dc40001eb3988/" class="uri">225593</a><br /><a href="http://ds.163.com/feed/633783eacb2dc40001eb3988/" class="uri">376030</a><br /><a href="http://ds.163.com/article/633783eb1c09770001f19985/" class="uri">544872</a><br /><a href="http://ds.163.com/feed/633783eb1c09770001f19985/" class="uri">469123</a><br /><a href="http://ds.163.com/article/633783ecc4707400013645cb/" class="uri">047423</a><br /><a href="http://ds.163.com/feed/633783ecc4707400013645cb/" class="uri">602892</a><br /><a href="http://ds.163.com/article/633783ee9f65bb00013fb318/" class="uri">506529</a><br /><a href="http://ds.163.com/feed/633783ee9f65bb00013fb318/" class="uri">490234</a><br /><a href="http://ds.163.com/article/633783efd70a9b0001f3e020/" class="uri">100857</a><br /><a href="http://ds.163.com/feed/633783efd70a9b0001f3e020/" class="uri">795442</a><br /><a href="http://ds.163.com/article/633783f1b3801c0001778b6f/" class="uri">682728</a><br /><a href="http://ds.163.com/feed/633783f1b3801c0001778b6f/" class="uri">911259</a><br /><a href="http://ds.163.com/article/633783f285eece000183ea5c/" class="uri">307551</a><br /><a href="http://ds.163.com/feed/633783f285eece000183ea5c/" class="uri">150881</a><br /><a href="http://ds.163.com/article/633783f427237900019c7003/" class="uri">898288</a><br /><a href="http://ds.163.com/feed/633783f427237900019c7003/" class="uri">129408</a><br /><a href="http://ds.163.com/article/633783f5a1ca540001d1b444/" class="uri">288303</a><br /><a href="http://ds.163.com/feed/633783f5a1ca540001d1b444/" class="uri">289435</a><br /><a href="http://ds.163.com/article/633783f7c5e20100011e5af7/" class="uri">903026</a><br /><a href="http://ds.163.com/feed/633783f7c5e20100011e5af7/" class="uri">689847</a><br /><a href="http://ds.163.com/article/633783f8cd732300011abc1c/" class="uri">372657</a><br /><a href="http://ds.163.com/feed/633783f8cd732300011abc1c/" class="uri">384247</a><br /><a href="http://ds.163.com/article/633783fa85eece000183ea63/" class="uri">444283</a><br /><a href="http://ds.163.com/feed/633783fa85eece000183ea63/" class="uri">134187</a><br /><a href="http://ds.163.com/article/633783fbc5e20100011e5b00/" class="uri">653766</a><br /><a href="http://ds.163.com/feed/633783fbc5e20100011e5b00/" class="uri">948820</a><br /><a href="http://ds.163.com/article/633783fd9f65bb00013fb32c/" class="uri">692511</a><br /><a href="http://ds.163.com/feed/633783fd9f65bb00013fb32c/" class="uri">216975</a><br /><a href="http://ds.163.com/article/633783fe880c71000193a4fa/" class="uri">053636</a><br /><a href="http://ds.163.com/feed/633783fe880c71000193a4fa/" class="uri">797943</a><br /><a href="http://ds.163.com/article/6337840039677300015b8906/" class="uri">839638</a><br /><a href="http://ds.163.com/feed/6337840039677300015b8906/" class="uri">355250</a><br /><a href="http://ds.163.com/article/63378401a1ca540001d1b451/" class="uri">572822</a><br /><a href="http://ds.163.com/feed/63378401a1ca540001d1b451/" class="uri">360595</a><br /><a href="http://ds.163.com/article/63378403c4707400013645e4/" class="uri">829818</a><br /><a href="http://ds.163.com/feed/63378403c4707400013645e4/" class="uri">725070</a><br /><a href="http://ds.163.com/article/63378404d3fdd00001974097/" class="uri">669661</a><br /><a href="http://ds.163.com/feed/63378404d3fdd00001974097/" class="uri">904203</a><br /><a href="http://ds.163.com/article/6337842627237900019c7041/" class="uri">064085</a><br /><a href="http://ds.163.com/feed/6337842627237900019c7041/" class="uri">681537</a><br /><a href="http://ds.163.com/article/63378427c47074000136461a/" class="uri">236939</a><br /><a href="http://ds.163.com/feed/63378427c47074000136461a/" class="uri">944380</a><br /><a href="http://ds.163.com/article/633784291c09770001f199bb/" class="uri">115769</a><br /><a href="http://ds.163.com/feed/633784291c09770001f199bb/" class="uri">948646</a><br /><a href="http://ds.163.com/article/6337842a9f65bb00013fb356/" class="uri">220243</a><br /><a href="http://ds.163.com/feed/6337842a9f65bb00013fb356/" class="uri">714287</a><br /><a href="http://ds.163.com/article/6337842c39677300015b8933/" class="uri">224934</a><br /><a href="http://ds.163.com/feed/6337842c39677300015b8933/" class="uri">422622</a><br /><a href="http://ds.163.com/article/6337842ecb2dc40001eb39e0/" class="uri">794466</a><br /><a href="http://ds.163.com/feed/6337842ecb2dc40001eb39e0/" class="uri">227866</a><br /><a href="http://ds.163.com/article/6337842fcb2dc40001eb39e4/" class="uri">996850</a><br /><a href="http://ds.163.com/feed/6337842fcb2dc40001eb39e4/" class="uri">325039</a><br /><a href="http://ds.163.com/article/63378431a1ca540001d1b490/" class="uri">404260</a><br /><a href="http://ds.163.com/feed/63378431a1ca540001d1b490/" class="uri">181862</a><br /><a href="http://ds.163.com/article/63378432cd732300011abc47/" class="uri">725039</a><br /><a href="http://ds.163.com/feed/63378432cd732300011abc47/" class="uri">705821</a><br /><a href="http://ds.163.com/article/6337843439677300015b893e/" class="uri">396706</a><br /><a href="http://ds.163.com/feed/6337843439677300015b893e/" class="uri">714202</a><br /><a href="http://ds.163.com/article/63378435c470740001364635/" class="uri">775188</a><br /><a href="http://ds.163.com/feed/63378435c470740001364635/" class="uri">061500</a><br /><a href="http://ds.163.com/article/633784369f65bb00013fb363/" class="uri">046781</a><br /><a href="http://ds.163.com/feed/633784369f65bb00013fb363/" class="uri">730552</a><br /><a href="http://ds.163.com/article/63378438cd732300011abc4b/" class="uri">427498</a><br /><a href="http://ds.163.com/feed/63378438cd732300011abc4b/" class="uri">576436</a><br /><a href="http://ds.163.com/article/63378439c47074000136463b/" class="uri">524757</a><br /><a href="http://ds.163.com/feed/63378439c47074000136463b/" class="uri">760982</a><br /><a href="http://ds.163.com/article/6337843ba1ca540001d1b49e/" class="uri">070017</a><br /><a href="http://ds.163.com/feed/6337843ba1ca540001d1b49e/" class="uri">844482</a><br /><a href="http://ds.163.com/article/6337843ccb2dc40001eb39fb/" class="uri">708215</a><br /><a href="http://ds.163.com/feed/6337843ccb2dc40001eb39fb/" class="uri">182605</a><br /><a href="http://ds.163.com/article/6337843eb4e5c000012fe6ed/" class="uri">787458</a><br /><a href="http://ds.163.com/feed/6337843eb4e5c000012fe6ed/" class="uri">054742</a><br /><a href="http://ds.163.com/article/6337843f27237900019c7057/" class="uri">275021</a><br /><a href="http://ds.163.com/feed/6337843f27237900019c7057/" class="uri">985839</a><br /><a href="http://ds.163.com/article/63378450b3801c0001778ba9/" class="uri">304594</a><br /><a href="http://ds.163.com/feed/63378450b3801c0001778ba9/" class="uri">792874</a><br /><a href="http://ds.163.com/article/63378452a1ca540001d1b4b8/" class="uri">965828</a><br /><a href="http://ds.163.com/feed/63378452a1ca540001d1b4b8/" class="uri">125342</a><br /><a href="http://ds.163.com/article/63378454a1ca540001d1b4ba/" class="uri">398323</a><br /><a href="http://ds.163.com/feed/63378454a1ca540001d1b4ba/" class="uri">037059</a><br /><a href="http://ds.163.com/article/63378455b4e5c000012fe702/" class="uri">305028</a><br /><a href="http://ds.163.com/feed/63378455b4e5c000012fe702/" class="uri">860116</a><br /><a href="http://ds.163.com/article/6337845685eece000183eacc/" class="uri">091524</a><br /><a href="http://ds.163.com/feed/6337845685eece000183eacc/" class="uri">474287</a><br /><a href="http://ds.163.com/article/63378458b3801c0001778baf/" class="uri">444955</a><br /><a href="http://ds.163.com/feed/63378458b3801c0001778baf/" class="uri">558774</a><br /><a href="http://ds.163.com/article/6337845ac5e20100011e5b75/" class="uri">517877</a><br /><a href="http://ds.163.com/feed/6337845ac5e20100011e5b75/" class="uri">748950</a><br /><a href="http://ds.163.com/article/6337845bd3fdd000019740dc/" class="uri">520886</a><br /><a href="http://ds.163.com/feed/6337845bd3fdd000019740dc/" class="uri">336583</a><br /><a href="http://ds.163.com/article/6337845cc5e20100011e5b7f/" class="uri">589804</a><br /><a href="http://ds.163.com/feed/6337845cc5e20100011e5b7f/" class="uri">428195</a><br /><a href="http://ds.163.com/article/6337845e85eece000183eadc/" class="uri">650796</a><br /><a href="http://ds.163.com/feed/6337845e85eece000183eadc/" class="uri">160545</a><br /><a href="http://ds.163.com/article/6337845f1c09770001f199ee/" class="uri">621788</a><br /><a href="http://ds.163.com/feed/6337845f1c09770001f199ee/" class="uri">624369</a><br /><a href="http://ds.163.com/article/63378461a1ca540001d1b4d0/" class="uri">780834</a><br /><a href="http://ds.163.com/feed/63378461a1ca540001d1b4d0/" class="uri">101473</a><br /><a href="http://ds.163.com/article/63378462d3fdd000019740e7/" class="uri">548716</a><br /><a href="http://ds.163.com/feed/63378462d3fdd000019740e7/" class="uri">116812</a><br /><a href="http://ds.163.com/article/63378464c5e20100011e5b8b/" class="uri">652520</a><br /><a href="http://ds.163.com/feed/63378464c5e20100011e5b8b/" class="uri">510875</a><br /><a href="http://ds.163.com/article/63378465cd732300011abc7a/" class="uri">309222</a><br /><a href="http://ds.163.com/feed/63378465cd732300011abc7a/" class="uri">512121</a><br /><a href="http://ds.163.com/article/63378466d3fdd000019740eb/" class="uri">043338</a><br /><a href="http://ds.163.com/feed/63378466d3fdd000019740eb/" class="uri">652752</a><br /><a href="http://ds.163.com/article/63378468d70a9b0001f3e08a/" class="uri">647877</a><br /><a href="http://ds.163.com/feed/63378468d70a9b0001f3e08a/" class="uri">240623</a><br /><a href="http://ds.163.com/article/63378469d3fdd000019740f1/" class="uri">775876</a><br /><a href="http://ds.163.com/feed/63378469d3fdd000019740f1/" class="uri">976307</a><br /><a href="http://ds.163.com/article/6337846b27237900019c708a/" class="uri">766607</a><br /><a href="http://ds.163.com/feed/6337846b27237900019c708a/" class="uri">934790</a><br /><a href="http://ds.163.com/article/6337846ccb2dc40001eb3a42/" class="uri">505819</a><br /><a href="http://ds.163.com/feed/6337846ccb2dc40001eb3a42/" class="uri">156526</a><br /><a href="http://ds.163.com/article/6337846eb3801c0001778bc2/" class="uri">604675</a><br /><a href="http://ds.163.com/feed/6337846eb3801c0001778bc2/" class="uri">754018</a><br /><a href="http://ds.163.com/article/6337846fc47074000136467f/" class="uri">425150</a><br /><a href="http://ds.163.com/feed/6337846fc47074000136467f/" class="uri">164213</a><br /><a href="http://ds.163.com/article/633784709f65bb00013fb38f/" class="uri">809716</a><br /><a href="http://ds.163.com/feed/633784709f65bb00013fb38f/" class="uri">081744</a><br /><a href="http://ds.163.com/article/6337847227237900019c7091/" class="uri">409207</a><br /><a href="http://ds.163.com/feed/6337847227237900019c7091/" class="uri">268961</a><br /><a href="http://ds.163.com/article/6337847a39677300015b8979/" class="uri">734330</a><br /><a href="http://ds.163.com/feed/6337847a39677300015b8979/" class="uri">719630</a><br /><a href="http://ds.163.com/article/6337847c9f65bb00013fb39d/" class="uri">842405</a><br /><a href="http://ds.163.com/feed/6337847c9f65bb00013fb39d/" class="uri">980041</a><br /><a href="http://ds.163.com/article/6337847e9f65bb00013fb3a1/" class="uri">525005</a><br /><a href="http://ds.163.com/feed/6337847e9f65bb00013fb3a1/" class="uri">326273</a><br /><a href="http://ds.163.com/article/6337847fc5e20100011e5ba9/" class="uri">965626</a><br /><a href="http://ds.163.com/feed/6337847fc5e20100011e5ba9/" class="uri">011743</a><br /><a href="http://ds.163.com/article/6337848339677300015b8980/" class="uri">101910</a><br /><a href="http://ds.163.com/feed/6337848339677300015b8980/" class="uri">553050</a><br /><a href="http://ds.163.com/article/63378484b4e5c000012fe729/" class="uri">777528</a><br /><a href="http://ds.163.com/feed/63378484b4e5c000012fe729/" class="uri">313232</a><br /><a href="http://ds.163.com/article/633784878d5cee00016f82af/" class="uri">911095</a><br /><a href="http://ds.163.com/feed/633784878d5cee00016f82af/" class="uri">252939</a><br /><a href="http://ds.163.com/article/6337848ab4e5c000012fe72f/" class="uri">194301</a><br /><a href="http://ds.163.com/feed/6337848ab4e5c000012fe72f/" class="uri">221484</a><br /><a href="http://ds.163.com/article/6337848bcb2dc40001eb3a52/" class="uri">237689</a><br /><a href="http://ds.163.com/feed/6337848bcb2dc40001eb3a52/" class="uri">199043</a><br /><a href="http://ds.163.com/article/6337848da1ca540001d1b501/" class="uri">469958</a><br /><a href="http://ds.163.com/feed/6337848da1ca540001d1b501/" class="uri">595773</a><br /><a href="http://ds.163.com/article/6337848e27237900019c70b3/" class="uri">632033</a><br /><a href="http://ds.163.com/feed/6337848e27237900019c70b3/" class="uri">372580</a><br /><a href="http://ds.163.com/article/6337849027237900019c70b5/" class="uri">693802</a><br /><a href="http://ds.163.com/feed/6337849027237900019c70b5/" class="uri">626082</a><br /><a href="http://ds.163.com/article/63378491c4707400013646b0/" class="uri">378252</a><br /><a href="http://ds.163.com/feed/63378491c4707400013646b0/" class="uri">318956</a><br /><a href="http://ds.163.com/article/63378493c4707400013646b3/" class="uri">880313</a><br /><a href="http://ds.163.com/feed/63378493c4707400013646b3/" class="uri">304482</a><br /><a href="http://ds.163.com/article/63378494d3fdd0000197411f/" class="uri">191776</a><br /><a href="http://ds.163.com/feed/63378494d3fdd0000197411f/" class="uri">246174</a><br /><a href="http://ds.163.com/article/633784969f65bb00013fb3b8/" class="uri">294885</a><br /><a href="http://ds.163.com/feed/633784969f65bb00013fb3b8/" class="uri">529773</a><br /><a href="http://ds.163.com/article/6337849739677300015b8997/" class="uri">688627</a><br /><a href="http://ds.163.com/feed/6337849739677300015b8997/" class="uri">802198</a><br /><a href="http://ds.163.com/article/6337849927237900019c70c4/" class="uri">772263</a><br /><a href="http://ds.163.com/feed/6337849927237900019c70c4/" class="uri">362487</a><br /><a href="http://ds.163.com/article/6337849a85eece000183eb15/" class="uri">519214</a><br /><a href="http://ds.163.com/feed/6337849a85eece000183eb15/" class="uri">753241</a><br /><a href="http://ds.163.com/article/6337849cd3fdd0000197412c/" class="uri">170809</a><br /><a href="http://ds.163.com/feed/6337849cd3fdd0000197412c/" class="uri">957381</a><br /><a href="http://ds.163.com/article/633784a5cd732300011abc9b/" class="uri">571861</a><br /><a href="http://ds.163.com/feed/633784a5cd732300011abc9b/" class="uri">748024</a><br /><a href="http://ds.163.com/article/633784a6b3801c0001778bfa/" class="uri">649607</a><br /><a href="http://ds.163.com/feed/633784a6b3801c0001778bfa/" class="uri">845464</a><br /><a href="http://ds.163.com/article/633784aa880c71000193a5c5/" class="uri">738844</a><br /><a href="http://ds.163.com/feed/633784aa880c71000193a5c5/" class="uri">885391</a><br /><a href="http://ds.163.com/article/633784acc5e20100011e5be6/" class="uri">654080</a><br /><a href="http://ds.163.com/feed/633784acc5e20100011e5be6/" class="uri">033427</a><br /><a href="http://ds.163.com/article/633784aeb4e5c000012fe75c/" class="uri">533917</a><br /><a href="http://ds.163.com/feed/633784aeb4e5c000012fe75c/" class="uri">097971</a><br /><a href="http://ds.163.com/article/633784afa1ca540001d1b522/" class="uri">614122</a><br /><a href="http://ds.163.com/feed/633784afa1ca540001d1b522/" class="uri">666994</a><br /><a href="http://ds.163.com/article/633784b139677300015b89ac/" class="uri">228870</a><br /><a href="http://ds.163.com/feed/633784b139677300015b89ac/" class="uri">322407</a><br /><a href="http://ds.163.com/article/633784b2c4707400013646e1/" class="uri">371432</a><br /><a href="http://ds.163.com/feed/633784b2c4707400013646e1/" class="uri">156870</a><br /><a href="http://ds.163.com/article/633784b4c4707400013646e3/" class="uri">222182</a><br /><a href="http://ds.163.com/feed/633784b4c4707400013646e3/" class="uri">740200</a><br /><a href="http://ds.163.com/article/633784b51c09770001f19a29/" class="uri">022829</a><br /><a href="http://ds.163.com/feed/633784b51c09770001f19a29/" class="uri">810500</a><br /><a href="http://ds.163.com/article/633784b739677300015b89b1/" class="uri">126785</a><br /><a href="http://ds.163.com/feed/633784b739677300015b89b1/" class="uri">465383</a><br /><a href="http://ds.163.com/article/633784b8b4e5c000012fe766/" class="uri">276534</a><br /><a href="http://ds.163.com/feed/633784b8b4e5c000012fe766/" class="uri">839294</a><br /><a href="http://ds.163.com/article/633784ba39677300015b89b5/" class="uri">810901</a><br /><a href="http://ds.163.com/feed/633784ba39677300015b89b5/" class="uri">900742</a><br /><a href="http://ds.163.com/article/633784bbc4707400013646ed/" class="uri">258827</a><br /><a href="http://ds.163.com/feed/633784bbc4707400013646ed/" class="uri">623158</a><br /><a href="http://ds.163.com/article/633784bd880c71000193a5d6/" class="uri">073441</a><br /><a href="http://ds.163.com/feed/633784bd880c71000193a5d6/" class="uri">528613</a><br /><a href="http://ds.163.com/article/633784c027237900019c70f2/" class="uri">862060</a><br /><a href="http://ds.163.com/feed/633784c027237900019c70f2/" class="uri">364242</a><br /><a href="http://ds.163.com/article/633784c2c5e20100011e5bfb/" class="uri">115513</a><br /><a href="http://ds.163.com/feed/633784c2c5e20100011e5bfb/" class="uri">177185</a><br /><a href="http://ds.163.com/article/633784c3a1ca540001d1b536/" class="uri">140776</a><br /><a href="http://ds.163.com/feed/633784c3a1ca540001d1b536/" class="uri">674400</a><br /><a href="http://ds.163.com/article/633784c59f65bb00013fb3d7/" class="uri">262986</a><br /><a href="http://ds.163.com/feed/633784c59f65bb00013fb3d7/" class="uri">837809</a><br /><a href="http://ds.163.com/article/633784c7c5e20100011e5c00/" class="uri">943674</a><br /><a href="http://ds.163.com/feed/633784c7c5e20100011e5c00/" class="uri">171437</a><br /><a href="http://ds.163.com/article/633784c8c5e20100011e5c06/" class="uri">535335</a><br /><a href="http://ds.163.com/feed/633784c8c5e20100011e5c06/" class="uri">130770</a><br /><a href="http://ds.163.com/article/633784e9b4e5c000012fe7a6/" class="uri">628050</a><br /><a href="http://ds.163.com/feed/633784e9b4e5c000012fe7a6/" class="uri">458746</a><br /><a href="http://ds.163.com/article/633784ebd70a9b0001f3e0e2/" class="uri">631784</a><br /><a href="http://ds.163.com/feed/633784ebd70a9b0001f3e0e2/" class="uri">934093</a><br /><a href="http://ds.163.com/article/633784edcb2dc40001eb3ab7/" class="uri">126447</a><br /><a href="http://ds.163.com/feed/633784edcb2dc40001eb3ab7/" class="uri">668435</a><br /><a href="http://ds.163.com/article/633784ee85eece000183eb78/" class="uri">170126</a><br /><a href="http://ds.163.com/feed/633784ee85eece000183eb78/" class="uri">662561</a><br /><a href="http://ds.163.com/article/633784f0a1ca540001d1b56b/" class="uri">355045</a><br /><a href="http://ds.163.com/feed/633784f0a1ca540001d1b56b/" class="uri">196769</a><br /><a href="http://ds.163.com/article/633784f1cb2dc40001eb3abc/" class="uri">729453</a><br /><a href="http://ds.163.com/feed/633784f1cb2dc40001eb3abc/" class="uri">751929</a><br /><a href="http://ds.163.com/article/633784f3880c71000193a62e/" class="uri">916354</a><br /><a href="http://ds.163.com/feed/633784f3880c71000193a62e/" class="uri">642860</a><br /><a href="http://ds.163.com/article/633784f4880c71000193a630/" class="uri">766344</a><br /><a href="http://ds.163.com/feed/633784f4880c71000193a630/" class="uri">838474</a><br /><a href="http://ds.163.com/article/633784f6c470740001364731/" class="uri">993583</a><br /><a href="http://ds.163.com/feed/633784f6c470740001364731/" class="uri">104643</a><br /><a href="http://ds.163.com/article/633784f7cb2dc40001eb3ac8/" class="uri">622468</a><br /><a href="http://ds.163.com/feed/633784f7cb2dc40001eb3ac8/" class="uri">881575</a><br /><a href="http://ds.163.com/article/633784f9cb2dc40001eb3aca/" class="uri">141458</a><br /><a href="http://ds.163.com/feed/633784f9cb2dc40001eb3aca/" class="uri">681007</a><br /><a href="http://ds.163.com/article/633784fa880c71000193a63d/" class="uri">978364</a><br /><a href="http://ds.163.com/feed/633784fa880c71000193a63d/" class="uri">577156</a><br /><a href="http://ds.163.com/article/633784fbd3fdd00001974177/" class="uri">584032</a><br /><a href="http://ds.163.com/feed/633784fbd3fdd00001974177/" class="uri">834345</a><br /><a href="http://ds.163.com/article/633784fdc47074000136473e/" class="uri">715407</a><br /><a href="http://ds.163.com/feed/633784fdc47074000136473e/" class="uri">768587</a><br /><a href="http://ds.163.com/article/633784fe8d5cee00016f830c/" class="uri">519433</a><br /><a href="http://ds.163.com/feed/633784fe8d5cee00016f830c/" class="uri">257845</a><br /><a href="http://ds.163.com/article/633785009f65bb00013fb411/" class="uri">948113</a><br /><a href="http://ds.163.com/feed/633785009f65bb00013fb411/" class="uri">818706</a><br /><a href="http://ds.163.com/article/63378501b4e5c000012fe7bc/" class="uri">087500</a><br /><a href="http://ds.163.com/feed/63378501b4e5c000012fe7bc/" class="uri">606794</a><br /><a href="http://ds.163.com/article/63378503d3fdd0000197417b/" class="uri">934326</a><br /><a href="http://ds.163.com/feed/63378503d3fdd0000197417b/" class="uri">400693</a><br /><a href="http://ds.163.com/article/63378504b3801c0001778c37/" class="uri">395472</a><br /><a href="http://ds.163.com/feed/63378504b3801c0001778c37/" class="uri">421734</a><br /><a href="http://ds.163.com/article/6337850627237900019c7154/" class="uri">955391</a><br /><a href="http://ds.163.com/feed/6337850627237900019c7154/" class="uri">049097</a><br /><a href="http://ds.163.com/article/63378507d70a9b0001f3e108/" class="uri">061375</a><br /><a href="http://ds.163.com/feed/63378507d70a9b0001f3e108/" class="uri">820529</a><br /><a href="http://ds.163.com/article/63378509a1ca540001d1b587/" class="uri">236209</a><br /><a href="http://ds.163.com/feed/63378509a1ca540001d1b587/" class="uri">233447</a><br /><a href="http://ds.163.com/article/633785148d5cee00016f8315/" class="uri">427494</a><br /><a href="http://ds.163.com/feed/633785148d5cee00016f8315/" class="uri">966589</a><br /><a href="http://ds.163.com/article/63378515a1ca540001d1b597/" class="uri">279596</a><br /><a href="http://ds.163.com/feed/63378515a1ca540001d1b597/" class="uri">850454</a><br /><a href="http://ds.163.com/article/63378517c5e20100011e5c6d/" class="uri">226123</a><br /><a href="http://ds.163.com/feed/63378517c5e20100011e5c6d/" class="uri">661011</a><br /><a href="http://ds.163.com/article/63378518a1ca540001d1b59a/" class="uri">335816</a><br /><a href="http://ds.163.com/feed/63378518a1ca540001d1b59a/" class="uri">051077</a><br /><a href="http://ds.163.com/article/6337851a39677300015b8a01/" class="uri">262365</a><br /><a href="http://ds.163.com/feed/6337851a39677300015b8a01/" class="uri">865223</a><br /><a href="http://ds.163.com/article/6337851bc5e20100011e5c70/" class="uri">220027</a><br /><a href="http://ds.163.com/feed/6337851bc5e20100011e5c70/" class="uri">885779</a><br /><a href="http://ds.163.com/article/6337851d39677300015b8a07/" class="uri">710715</a><br /><a href="http://ds.163.com/feed/6337851d39677300015b8a07/" class="uri">967373</a><br /><a href="http://ds.163.com/article/6337851e27237900019c716e/" class="uri">070504</a><br /><a href="http://ds.163.com/feed/6337851e27237900019c716e/" class="uri">909880</a><br /><a href="http://ds.163.com/article/63378520cd732300011abd0a/" class="uri">703797</a><br /><a href="http://ds.163.com/feed/63378520cd732300011abd0a/" class="uri">267200</a><br /><a href="http://ds.163.com/article/63378521d70a9b0001f3e127/" class="uri">588230</a><br /><a href="http://ds.163.com/feed/63378521d70a9b0001f3e127/" class="uri">235682</a><br /><a href="http://ds.163.com/article/63378523d70a9b0001f3e12b/" class="uri">792364</a><br /><a href="http://ds.163.com/feed/63378523d70a9b0001f3e12b/" class="uri">398310</a><br /><a href="http://ds.163.com/article/63378524c470740001364771/" class="uri">989739</a><br /><a href="http://ds.163.com/feed/63378524c470740001364771/" class="uri">857956</a><br /><a href="http://ds.163.com/article/63378526c470740001364775/" class="uri">630291</a><br /><a href="http://ds.163.com/feed/63378526c470740001364775/" class="uri">006760</a><br /><a href="http://ds.163.com/article/63378527c470740001364777/" class="uri">796456</a><br /><a href="http://ds.163.com/feed/63378527c470740001364777/" class="uri">744454</a><br /><a href="http://ds.163.com/article/63378529b4e5c000012fe7e3/" class="uri">179269</a><br /><a href="http://ds.163.com/feed/63378529b4e5c000012fe7e3/" class="uri">851043</a><br /><a href="http://ds.163.com/article/6337852aa1ca540001d1b5b5/" class="uri">963554</a><br /><a href="http://ds.163.com/feed/6337852aa1ca540001d1b5b5/" class="uri">677683</a><br /><a href="http://ds.163.com/article/6337852ccd732300011abd16/" class="uri">612507</a><br /><a href="http://ds.163.com/feed/6337852ccd732300011abd16/" class="uri">531770</a><br /><a href="http://ds.163.com/article/6337852e39677300015b8a0e/" class="uri">464588</a><br /><a href="http://ds.163.com/feed/6337852e39677300015b8a0e/" class="uri">983765</a><br /><a href="http://ds.163.com/article/6337852fc5e20100011e5c82/" class="uri">827951</a><br /><a href="http://ds.163.com/feed/6337852fc5e20100011e5c82/" class="uri">006933</a><br /><a href="http://ds.163.com/article/633785318d5cee00016f833a/" class="uri">555116</a><br /><a href="http://ds.163.com/feed/633785318d5cee00016f833a/" class="uri">517931</a><br /><a href="http://ds.163.com/article/63378535a1ca540001d1b5bd/" class="uri">403641</a><br /><a href="http://ds.163.com/feed/63378535a1ca540001d1b5bd/" class="uri">833539</a><br /><a href="http://ds.163.com/article/63378536cb2dc40001eb3b00/" class="uri">381113</a><br /><a href="http://ds.163.com/feed/63378536cb2dc40001eb3b00/" class="uri">545780</a><br /><a href="http://ds.163.com/article/6337853ed70a9b0001f3e14e/" class="uri">918276</a><br /><a href="http://ds.163.com/feed/6337853ed70a9b0001f3e14e/" class="uri">843818</a><br /><a href="http://ds.163.com/article/6337854085eece000183ebcc/" class="uri">100473</a><br /><a href="http://ds.163.com/feed/6337854085eece000183ebcc/" class="uri">139708</a><br /><a href="http://ds.163.com/article/6337854239677300015b8a21/" class="uri">133583</a><br /><a href="http://ds.163.com/feed/6337854239677300015b8a21/" class="uri">632130</a><br /><a href="http://ds.163.com/article/63378543cd732300011abd2e/" class="uri">259058</a><br /><a href="http://ds.163.com/feed/63378543cd732300011abd2e/" class="uri">041215</a><br /><a href="http://ds.163.com/article/63378545c47074000136479f/" class="uri">245272</a><br /><a href="http://ds.163.com/feed/63378545c47074000136479f/" class="uri">398523</a><br /><a href="http://ds.163.com/article/63378546880c71000193a685/" class="uri">254587</a><br /><a href="http://ds.163.com/feed/63378546880c71000193a685/" class="uri">390730</a><br /><a href="http://ds.163.com/article/63378548d3fdd000019741b3/" class="uri">469132</a><br /><a href="http://ds.163.com/feed/63378548d3fdd000019741b3/" class="uri">429857</a><br /><a href="http://ds.163.com/article/6337854acd732300011abd38/" class="uri">147221</a><br /><a href="http://ds.163.com/feed/6337854acd732300011abd38/" class="uri">821207</a><br /><a href="http://ds.163.com/article/6337854b39677300015b8a29/" class="uri">666034</a><br /><a href="http://ds.163.com/feed/6337854b39677300015b8a29/" class="uri">196470</a><br /><a href="http://ds.163.com/article/6337854dc5e20100011e5c9b/" class="uri">182735</a><br /><a href="http://ds.163.com/feed/6337854dc5e20100011e5c9b/" class="uri">868465</a><br /><a href="http://ds.163.com/article/63378551cb2dc40001eb3b19/" class="uri">020631</a><br /><a href="http://ds.163.com/feed/63378551cb2dc40001eb3b19/" class="uri">713933</a><br /><a href="http://ds.163.com/article/633785528d5cee00016f8352/" class="uri">401525</a><br /><a href="http://ds.163.com/feed/633785528d5cee00016f8352/" class="uri">990488</a><br /><a href="http://ds.163.com/article/6337855485eece000183ebe2/" class="uri">857765</a><br /><a href="http://ds.163.com/feed/6337855485eece000183ebe2/" class="uri">783313</a><br /><a href="http://ds.163.com/article/63378555b4e5c000012fe808/" class="uri">700734</a><br /><a href="http://ds.163.com/feed/63378555b4e5c000012fe808/" class="uri">851063</a><br /><img src ="http://www.cnitblog.com/stomic/aggbug/96072.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2022-10-01 10:57 <a href="http://www.cnitblog.com/stomic/archive/2022/10/01/96072.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>应用程序采用版本控制手段来避免可能出</title><link>http://www.cnitblog.com/stomic/archive/2022/10/01/96071.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Sat, 01 Oct 2022 02:56:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2022/10/01/96071.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/96071.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2022/10/01/96071.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/96071.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/96071.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 乐观锁假定当前事务操作数据资源时，不回有其他事务同时访问该数据资源，因此完全依靠数据库的隔离级别来自动管理锁的工作。应用程序采用版本控制手段来避免可能出8930319991577176806658869927305726573484356265269728503231890632621295286250529310996295207688424942505572796802104452...&nbsp;&nbsp;<a href='http://www.cnitblog.com/stomic/archive/2022/10/01/96071.html'>阅读全文</a><img src ="http://www.cnitblog.com/stomic/aggbug/96071.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2022-10-01 10:56 <a href="http://www.cnitblog.com/stomic/archive/2022/10/01/96071.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>表明记录状态的LOCK字段，当它取值为“Y”时</title><link>http://www.cnitblog.com/stomic/archive/2022/10/01/96070.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Sat, 01 Oct 2022 02:55:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2022/10/01/96070.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/96070.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2022/10/01/96070.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/96070.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/96070.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: .在应用程序中显示指定采用数据库系统的独占所来锁定数据资源。SQL语句：select ... for update，在Hibernate中使用get，load时如session.get(Account.class,new Long(1),LockMode,UPGRADE) 533297710597573902720033464846020538507475633712055193086...&nbsp;&nbsp;<a href='http://www.cnitblog.com/stomic/archive/2022/10/01/96070.html'>阅读全文</a><img src ="http://www.cnitblog.com/stomic/aggbug/96070.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2022-10-01 10:55 <a href="http://www.cnitblog.com/stomic/archive/2022/10/01/96070.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>程序中显示指定采用数据库</title><link>http://www.cnitblog.com/stomic/archive/2022/10/01/96068.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Sat, 01 Oct 2022 02:54:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2022/10/01/96068.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/96068.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2022/10/01/96068.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/96068.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/96068.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 悲观锁有两种实现方式。　　A.在应用程序中显示指定采用数据库系统的独占所来锁定数据资源。SQL语句：select ... for update，在Hibernate中使用get，load时如session.get(Account.class,new Long(1),LockMode,UPGRADE) 165724435481591664376072925558657397093...&nbsp;&nbsp;<a href='http://www.cnitblog.com/stomic/archive/2022/10/01/96068.html'>阅读全文</a><img src ="http://www.cnitblog.com/stomic/aggbug/96068.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2022-10-01 10:54 <a href="http://www.cnitblog.com/stomic/archive/2022/10/01/96068.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>到极致，做到无人能及。</title><link>http://www.cnitblog.com/stomic/archive/2022/10/01/96069.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Sat, 01 Oct 2022 02:54:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2022/10/01/96069.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/96069.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2022/10/01/96069.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/96069.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/96069.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在应用程序中可以利用Hibernate提供的版本控制功能来视线乐观锁，OR映射文件中的元素和都具有版本控制的功能，一般推荐采用当一个人找不到出路的时候，最好的办法就是将当前能做好的事情做到极致，做到无人能及。48037593020770744648813072518157451207111666339476959388868370601179856046172977516532...&nbsp;&nbsp;<a href='http://www.cnitblog.com/stomic/archive/2022/10/01/96069.html'>阅读全文</a><img src ="http://www.cnitblog.com/stomic/aggbug/96069.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2022-10-01 10:54 <a href="http://www.cnitblog.com/stomic/archive/2022/10/01/96069.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>把其他事务已提交的更新数据覆盖。</title><link>http://www.cnitblog.com/stomic/archive/2022/10/01/96067.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Sat, 01 Oct 2022 02:53:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2022/10/01/96067.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/96067.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2022/10/01/96067.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/96067.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/96067.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 越能保证数据的完整性和一致性，但是对并发性能的影响也越大。对于多数应用程序，可以有优先考虑把数据库系统的隔离级别设为Read Commited，它能够避免脏读，而且具有较好的并发性能。尽管它会导致不可重复读、虚读和第二类丢失更新这些并发问题，在可能出现这类问题的个别场合，可以由应用程序采用悲观锁或乐观锁来控制。342486053658413483191041091292374399...&nbsp;&nbsp;<a href='http://www.cnitblog.com/stomic/archive/2022/10/01/96067.html'>阅读全文</a><img src ="http://www.cnitblog.com/stomic/aggbug/96067.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2022-10-01 10:53 <a href="http://www.cnitblog.com/stomic/archive/2022/10/01/96067.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL中数据库表分为3种类型</title><link>http://www.cnitblog.com/stomic/archive/2022/10/01/96066.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Sat, 01 Oct 2022 02:52:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2022/10/01/96066.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/96066.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2022/10/01/96066.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/96066.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/96066.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 必须由数据库客户程序显示指定事务开始边界和结束边界。　　注：MySQL中数据库表分为3种类型：INNODB、BDB和MyISAM，其中MyISAM不支持数据库事务。MySQL中create table 语句默认为MyISAM类型。55452387024001541136260067750705504138852539979986464449696714858231695831845...&nbsp;&nbsp;<a href='http://www.cnitblog.com/stomic/archive/2022/10/01/96066.html'>阅读全文</a><img src ="http://www.cnitblog.com/stomic/aggbug/96066.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2022-10-01 10:52 <a href="http://www.cnitblog.com/stomic/archive/2022/10/01/96066.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>务开始之前所处的状态。不管是哪种情况，</title><link>http://www.cnitblog.com/stomic/archive/2022/10/01/96064.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Sat, 01 Oct 2022 02:50:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2022/10/01/96064.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/96064.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2022/10/01/96064.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/96064.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/96064.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: ，通过执行COMMIT或ROLLBACK语句来终止事务。当执行COMMIT语句时，自从事务启动以来对数据库所做的一切更改就成为永久性的了-- 即它们被写到磁盘。当执行ROLLBACK语句时，自从事务启动以来对数据库所做的一切更改都被撤销，并且数据库返回到事务开始之前所处的状态。不管是哪种情况，数据库在事务完成时都保证能回到一致状态614280199355033851305292407431...&nbsp;&nbsp;<a href='http://www.cnitblog.com/stomic/archive/2022/10/01/96064.html'>阅读全文</a><img src ="http://www.cnitblog.com/stomic/aggbug/96064.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2022-10-01 10:50 <a href="http://www.cnitblog.com/stomic/archive/2022/10/01/96064.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从而提供了一般的数据库一致性</title><link>http://www.cnitblog.com/stomic/archive/2022/10/01/96065.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Sat, 01 Oct 2022 02:50:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2022/10/01/96065.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/96065.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2022/10/01/96065.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/96065.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/96065.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 虽然事务通过确保对数据的更改仅在事务被成功提交之后才成为永久性的，从而提供了一般的数据库一致性，但还是须要用户或应用程序来确保每个事务中执行的SQL操作序列始终会导致一致的数据库。44460009756225293596545866631275133754016983742221831898902222403810590635676590839400502673282441296757...&nbsp;&nbsp;<a href='http://www.cnitblog.com/stomic/archive/2022/10/01/96065.html'>阅读全文</a><img src ="http://www.cnitblog.com/stomic/aggbug/96065.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2022-10-01 10:50 <a href="http://www.cnitblog.com/stomic/archive/2022/10/01/96065.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>隔离性（isolation）和持久性（durability）的缩写事务必须</title><link>http://www.cnitblog.com/stomic/archive/2022/10/01/96062.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Sat, 01 Oct 2022 02:49:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2022/10/01/96062.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/96062.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2022/10/01/96062.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/96062.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/96062.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 子事务的数据库操作被回滚，即数据库回到事务执行前的状态，不会发生状态转换。 一致性或可串性。事务的执行使得数据库从一种正确状态转换成另一种正确状态。569297880480488283430410272955401744514843486813992882603584799586075636860182095431042666129936332512407130476502005512...&nbsp;&nbsp;<a href='http://www.cnitblog.com/stomic/archive/2022/10/01/96062.html'>阅读全文</a><img src ="http://www.cnitblog.com/stomic/aggbug/96062.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2022-10-01 10:49 <a href="http://www.cnitblog.com/stomic/archive/2022/10/01/96062.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正确提交之前，不允许把该事务对数据</title><link>http://www.cnitblog.com/stomic/archive/2022/10/01/96063.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Sat, 01 Oct 2022 02:49:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2022/10/01/96063.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/96063.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2022/10/01/96063.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/96063.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/96063.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 运行嵌入式SQL应用程序或脚本，在可执行SQL语句第一次执行时(在建立与数据库的连接之后或在现有事务终止之后)，事务就会自动启动。在启动事务之后，必须由启动事务的用户或应用程序显式地终止它，除非使用了称为自动提交(automatic commit)的过程(在这种情况下，发出的每个单独的SQL语句被看做单个事务，它一执行就被隐式地提交了)。51071854998527114505032376...&nbsp;&nbsp;<a href='http://www.cnitblog.com/stomic/archive/2022/10/01/96063.html'>阅读全文</a><img src ="http://www.cnitblog.com/stomic/aggbug/96063.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2022-10-01 10:49 <a href="http://www.cnitblog.com/stomic/archive/2022/10/01/96063.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转）JAVA事务的概念</title><link>http://www.cnitblog.com/stomic/archive/2016/02/01/90365.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Mon, 01 Feb 2016 09:51:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2016/02/01/90365.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/90365.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2016/02/01/90365.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/90365.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/90365.html</trackback:ping><description><![CDATA[<div id="cnblogs_post_body" style="margin-bottom: 20px; word-break: break-word; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19.5px;"><p style="margin: 10px auto;">一、什么是事务</p><div>　　事务是访问数据库的一个操作序列，数据库应用系统通过事务集来完成对数据库的存取。事务的正确执行使得数据库从一种状态转换成另一种状态。</div><div>&nbsp;</div><div>　　事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性（atomicity）、一致性（consistency）、隔离性（isolation）和持久性（durability）的缩写事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性（atomicity）、一致性（consistency）、隔离性（isolation）和持久性（durability）的缩写。</div><ul style="margin-left: 30px; padding-left: 0px;"><li style="list-style-type: disc;"><div>&nbsp;<strong>原子性</strong>。即不可分割性，事务要么全部被执行，要么就全部不被执行。如果事务的所有子事务全部提交成功，则所有的数据库操作被提交，数据库状态发生转换；如果有子事务失败，则其他子事务的数据库操作被回滚，即数据库回到事务执行前的状态，不会发生状态转换。</div></li></ul><ul style="margin-left: 30px; padding-left: 0px;"><li style="list-style-type: disc;"><div>&nbsp;<strong>一致性或可串性</strong>。事务的执行使得数据库从一种正确状态转换成另一种正确状态。</div></li></ul><ul style="margin-left: 30px; padding-left: 0px;"><li style="list-style-type: disc;"><div><strong>隔离性</strong>。在事务正确提交之前，不允许把该事务对数据的任何改变提供给任何其他事务，即在事务正确提交之前，它可能的结果不应显示给任何其他事务。</div></li></ul><ul style="margin-left: 30px; padding-left: 0px;"><li style="list-style-type: disc;"><div><strong>持久性</strong>。事务正确提交后，其结果将永久保存在数据库中，即使在事务提交后有了其他故障，事务的处理结果也会得到保存。 　　</div></li></ul><p style="margin: 10px auto;">　　运行嵌入式SQL应用程序或脚本，在可执行SQL语句第一次执行时(在建立与数据库的连接之后或在现有事务终止之后)，事务就会自动启动。在启动事务之后，必须由启动事务的用户或应用程序显式地终止它，除非使用了称为自动提交(automatic commit)的过程(在这种情况下，发出的每个单独的SQL语句被看做单个事务，它一执行就被隐式地提交了)。</p><p style="margin: 10px auto;">　　在大多数情况下，通过执行COMMIT或ROLLBACK语句来终止事务。当执行COMMIT语句时，自从事务启动以来对数据库所做的一切更改就成为永久性的了-- 即它们被写到磁盘。当执行ROLLBACK语句时，自从事务启动以来对数据库所做的一切更改都被撤销，并且数据库返回到事务开始之前所处的状态。不管是哪种情况，数据库在事务完成时都保证能回到一致状态。</p><p style="margin: 10px auto;">　　一定要注意一点：虽然事务通过确保对数据的更改仅在事务被成功提交之后才成为永久性的，从而提供了一般的数据库一致性，但还是须要用户或应用程序来确保每个事务中执行的SQL操作序列始终会导致一致的数据库。</p><p style="margin: 10px auto;"></p><p style="margin: 10px auto;">二、数据库系统支持两种事务模式：</p><ul style="margin-left: 30px; padding-left: 0px;"><li style="list-style-type: disc;"><strong>自动提交模式：</strong>每个SQL语句都是一个独立的事务，当数据库系统执行完一个SQL语句后，会自动提交事务。</li><strong>﻿</strong><li style="list-style-type: disc;"><strong>手动提交模式：</strong>必须由数据库客户程序显示指定事务开始边界和结束边界。</li></ul><p style="margin: 10px auto;">　　注：MySQL中数据库表分为3种类型：INNODB、BDB和MyISAM，其中MyISAM不支持数据库事务。MySQL中create table 语句默认为MyISAM类型。</p><p style="margin: 10px auto;">　　</p><p style="margin: 10px auto;">三、对于同时运行的多个事务，当这些事务访问数据库中相同的数据时，如果没有采取必要的隔离机制，就会导致各种并发问题，这些并发问题可归纳为以下几类：</p><ul style="margin-left: 30px; padding-left: 0px;"><li style="list-style-type: disc;"><strong>第一类丢失更新：</strong>撤销一个事务时，把其他事务已提交的更新数据覆盖。　</li><li style="list-style-type: disc;"><strong>脏读：</strong>一个事务读到另一个事务为提交的更新数据。</li><li style="list-style-type: disc;"><strong>虚读：</strong>一个事务读到另一个事务已提交的新插入的数据。</li><li style="list-style-type: disc;"><strong>不可重复读：</strong>一个事务读到另一个事务已提交的更新数据。</li><li style="list-style-type: disc;"><strong>第二类丢失更新：</strong>这是不可重复读中的特例，一个事务覆盖另一个事务已提交的更新数据。　　</li></ul><p style="margin: 10px auto;">　</p><ul style="margin-left: 30px; padding-left: 0px;"></ul><p style="margin: 10px auto;">四、隔离级别</p><p style="margin: 10px auto;"></p><p style="margin: 10px auto;"></p><p style="margin: 10px auto;"></p><p style="margin: 10px auto;">　　当数据库系统采用read Commited隔离级别时，会导致不可重复读喝第二类丢失更新的并发问题，可以在应用程序中采用悲观锁或乐观锁来避免这类问题。从应用程序的角度，锁可以分为以下几类：</p><ul style="margin-left: 30px; padding-left: 0px;"><li style="list-style-type: disc;"><strong>Serializable(串行化)：</strong>一个事务在执行过程中完全看不到其他事务对数据库所做的更新。</li><li style="list-style-type: disc;"><strong>Repeatable Read(可重复读)：</strong>一个事务在执行过程中可以看到其他事务已经提交的新插入的记录，但是不能看到其他事务对已有记录的更新。</li><li style="list-style-type: disc;"><strong>Read Commited（读已提交数据）：</strong>一个事务在执行过程中可以看到其他事务已经提交的新插入的记录，而且能看到其他事务已经提交的对已有记录的更新</li><li style="list-style-type: disc;"><strong>Read Uncomitted（读未提交数据）：</strong>一个事务在执行过程中可以拷打其他事务没有提交的新插入的记录，而且能看到其他事务没有提交的对已有记录的更新。</li></ul><p style="margin: 10px auto;">&nbsp;&nbsp;&nbsp; 隔离级别越高，越能保证数据的完整性和一致性，但是对并发性能的影响也越大。对于多数应用程序，可以有优先考虑把数据库系统的隔离级别设为Read Commited，它能够避免脏读，而且具有较好的并发性能。尽管它会导致不可重复读、虚读和第二类丢失更新这些并发问题，在可能出现这类问题的个别场合，可以由应用程序采用悲观锁或乐观锁来控制。</p><p style="margin: 10px auto;">　　当数据库系统采用read Commited隔离级别时，会导致不可重复读喝第二类丢失更新的并发问题，可以在应用程序中采用悲观锁或乐观锁来避免这类问题。从应用程序的角度，锁可以分为以下几类：</p><p style="margin: 10px auto;">　　<strong>A.悲观锁</strong>：指在应用程序中显示的为数据资源加锁。尽管能防止丢失更新和不可重复读这类并发问题，但是它会影响并发性能，因此应该谨慎地使用。&nbsp;<br /><br />　　<strong>B.乐观锁</strong>：乐观锁假定当前事务操作数据资源时，不回有其他事务同时访问该数据资源，因此完全依靠数据库的隔离级别来自动管理锁的工作。应用程序采用版本控制手段来避免可能出现的并发问题。<br /><br /></p><p style="margin: 10px auto;">五、悲观锁有两种实现方式。</p><p style="margin: 10px auto;">　　A.在应用程序中显示指定采用数据库系统的独占所来锁定数据资源。SQL语句：select ... for update，在Hibernate中使用get，load时如session.get(Account.class,new Long(1),LockMode,UPGRADE)&nbsp;<br /><br />　　B.在数据库表中增加一个表明记录状态的LOCK字段，当它取值为&#8220;Y&#8221;时，表示该记录已经被某个事务锁定，如果为&#8220;N&#8221;，表明该记录处于空闲状态，事务可以访问它。增加锁标记字段就可以实现。</p><p style="margin: 10px auto;">　　利用Hibernate的版本控制来实现乐观锁</p><p style="margin: 10px auto;">　　乐观锁是由程序提供的一种机制，这种机制既能保证多个事务并发访问数据，又能防止第二类丢失更新问题。</p><p style="margin: 10px auto;">　　在应用程序中可以利用Hibernate提供的版本控制功能来视线乐观锁，OR映射文件中的&lt;version&gt;元素和&lt;timestamp&gt;都具有版本控制的功能，一般推荐采用&lt;version&gt;</p></div><div id="MySignature" style="font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19.5px;">当一个人找不到出路的时候，最好的办法就是将当前能做好的事情做到极致，做到无人能及。</div><img src ="http://www.cnitblog.com/stomic/aggbug/90365.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2016-02-01 17:51 <a href="http://www.cnitblog.com/stomic/archive/2016/02/01/90365.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转)并发用户数与TPS之间的关系 </title><link>http://www.cnitblog.com/stomic/archive/2016/01/14/90345.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Wed, 13 Jan 2016 16:42:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2016/01/14/90345.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/90345.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2016/01/14/90345.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/90345.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/90345.html</trackback:ping><description><![CDATA[<div class="context">
 <strong><span style="font-size: 26.0pt;font-family: 宋体;"></span></strong><strong><span style="font-size: 26.0pt;"></span></strong> 
<h1 style="margin-left: 21.0pt;text-indent: -21.0pt;">
<span><span><span style="font-family: microsoft yahei;font-size: 14.0px;">1.</span><span style="font-family: microsoft yahei;font-size: 14.0px;">&nbsp; </span></span></span><span style="font-family: microsoft yahei;font-size: 14.0px;">背景</span><span></span> 
</h1>
<p style="margin-left: 21.0pt;text-indent: 21.0pt;" align="left">
<span style="font-family: microsoft yahei;font-size: 14.0px;">在做性能测试的时候，很多人都用并发用户数来衡量系统的性能，觉得系统能支撑的并发用户数越多，系统的性能就越好；对</span><span style="font-family: microsoft yahei;font-size: 14.0px;">TPS</span><span style="font-family: microsoft yahei;font-size: 14.0px;">不是非常理解，也根本不知道它们之间的关系，因此非常有必要进行解释。</span><span></span> 
</p>
<h1 style="margin-left: 21.0pt;text-indent: -21.0pt;">
<span><span><span style="font-family: microsoft yahei;font-size: 14.0px;">2.</span><span style="font-family: microsoft yahei;font-size: 14.0px;">&nbsp; </span></span></span><span style="font-family: microsoft yahei;font-size: 14.0px;">术语定义</span><span></span> 
</h1>
<p style="margin-left: 21.0pt;text-indent: -21.0pt;">
<span style="font-family: wingdings;"><span><span style="font-family: microsoft yahei;font-size: 14.0px;">&#216;</span><span style="font-family: microsoft yahei;font-size: 14.0px;">&nbsp; </span></span></span><strong><span style="font-family: microsoft yahei;font-size: 14.0px;">并发用户数：</span></strong><span style="font-family: microsoft yahei;font-size: 14.0px;">指的是现实系统中操作业务的用户，在性能测试工具中，一般称为虚拟用户数</span><span style="font-family: microsoft yahei;font-size: 14.0px;">(Virutal User)</span><span style="font-family: microsoft yahei;font-size: 14.0px;">，注意并发用户数跟注册用户数、在线用户数有很大差别的，并发用户数一定会对服务器产生压力的，而在线用户数只是</span> <span style="font-family: microsoft yahei;font-size: 14.0px;">&#8221;</span><span style="font-family: microsoft yahei;font-size: 14.0px;">挂</span><span style="font-family: microsoft yahei;font-size: 14.0px;">&#8221; </span><span style="font-family: microsoft yahei;font-size: 14.0px;">在系统上，对服务器不产生压力，注册用户数一般指的是数据库中存在的用户数。</span> <span></span> 
</p>
<p style="margin-left: 21.0pt;text-indent: -21.0pt;">
<span style="font-family: wingdings;"><span><span style="font-family: microsoft yahei;font-size: 14.0px;">&#216;</span><span style="font-family: microsoft yahei;font-size: 14.0px;">&nbsp; </span></span></span><strong><span style="font-family: microsoft yahei;font-size: 14.0px;">TPS</span></strong><strong><span style="font-family: microsoft yahei;font-size: 14.0px;">：</span></strong><span><span style="font-family: microsoft yahei;font-size: 14.0px;">Transaction Per Second,</span><strong> </strong></span><span style="font-family: microsoft yahei;font-size: 14.0px;">每秒事务数</span><span style="font-family: microsoft yahei;font-size: 14.0px;">, </span><span style="font-family: microsoft yahei;font-size: 14.0px;">是衡量系统性能的一个非常重要的指标，</span><strong><span></span></strong> 
</p>
<p>
<strong><span style="font-family: microsoft yahei;font-size: 14.0px;">&nbsp;</span></strong> 
</p>
<h1 style="margin-left: 21.0pt;text-indent: -21.0pt;">
<span><span><span style="font-family: microsoft yahei;font-size: 14.0px;">3.</span><span style="font-family: microsoft yahei;font-size: 14.0px;">&nbsp; </span></span></span><span style="font-family: microsoft yahei;font-size: 14.0px;">Vu</span><span style="font-family: microsoft yahei;font-size: 14.0px;">和</span><span style="font-family: microsoft yahei;font-size: 14.0px;">TPS</span><span style="font-family: microsoft yahei;font-size: 14.0px;">换算</span><span></span> 
</h1>
<p style="margin-left: 21.0pt;text-indent: -21.0pt;">
<span style="font-family: wingdings;"><span><span style="font-family: microsoft yahei;font-size: 14.0px;">&#216;</span><span style="font-family: microsoft yahei;font-size: 14.0px;">&nbsp; </span></span></span><strong><span style="font-family: microsoft yahei;font-size: 14.0px;">简单例子：</span></strong><span style="font-family: microsoft yahei;font-size: 14.0px;">在术语中解释了</span><span style="font-family: microsoft yahei;font-size: 14.0px;">TPS</span><span style="font-family: microsoft yahei;font-size: 14.0px;">是每秒事务数，但是事务时要靠虚拟用户做出来的，假如</span><span style="font-family: microsoft yahei;font-size: 14.0px;">1</span><span style="font-family: microsoft yahei;font-size: 14.0px;">个虚拟用户在</span><span style="font-family: microsoft yahei;font-size: 14.0px;">1</span><span style="font-family: microsoft yahei;font-size: 14.0px;">秒内完成</span><span style="font-family: microsoft yahei;font-size: 14.0px;">1</span><span style="font-family: microsoft yahei;font-size: 14.0px;">笔事务，那么</span><span style="font-family: microsoft yahei;font-size: 14.0px;">TPS</span><span style="font-family: microsoft yahei;font-size: 14.0px;">明显就是</span><span style="font-family: microsoft yahei;font-size: 14.0px;">1</span><span style="font-family: microsoft yahei;font-size: 14.0px;">；如果某笔业务响应时间是</span><span style="font-family: microsoft yahei;font-size: 14.0px;">1ms,</span><span style="font-family: microsoft yahei;font-size: 14.0px;">那么</span><span style="font-family: microsoft yahei;font-size: 14.0px;">1</span><span style="font-family: microsoft yahei;font-size: 14.0px;">个用户在</span><span style="font-family: microsoft yahei;font-size: 14.0px;">1</span><span style="font-family: microsoft yahei;font-size: 14.0px;">秒内能完成</span><span style="font-family: microsoft yahei;font-size: 14.0px;">1000</span><span style="font-family: microsoft yahei;font-size: 14.0px;">笔事务，</span><span style="font-family: microsoft yahei;font-size: 14.0px;">TPS</span><span style="font-family: microsoft yahei;font-size: 14.0px;">就是</span><span style="font-family: microsoft yahei;font-size: 14.0px;">1000</span><span style="font-family: microsoft yahei;font-size: 14.0px;">了；如果某笔业务响应时间是</span><span style="font-family: microsoft yahei;font-size: 14.0px;">1s,</span><span style="font-family: microsoft yahei;font-size: 14.0px;">那么</span><span style="font-family: microsoft yahei;font-size: 14.0px;">1</span><span style="font-family: microsoft yahei;font-size: 14.0px;">个用户在</span><span style="font-family: microsoft yahei;font-size: 14.0px;">1</span><span style="font-family: microsoft yahei;font-size: 14.0px;">秒内只能完成</span><span style="font-family: microsoft yahei;font-size: 14.0px;">1</span><span style="font-family: microsoft yahei;font-size: 14.0px;">笔事务，要想达到</span><span style="font-family: microsoft yahei;font-size: 14.0px;">1000TPS</span><span style="font-family: microsoft yahei;font-size: 14.0px;">，至少需要</span><span style="font-family: microsoft yahei;font-size: 14.0px;">1000</span><span style="font-family: microsoft yahei;font-size: 14.0px;">个用户；因此可以说</span><span style="font-family: microsoft yahei;font-size: 14.0px;">1</span><span style="font-family: microsoft yahei;font-size: 14.0px;">个用户可以产生</span><span style="font-family: microsoft yahei;font-size: 14.0px;">1000TPS</span><span style="font-family: microsoft yahei;font-size: 14.0px;">，</span><span style="font-family: microsoft yahei;font-size: 14.0px;">1000</span><span style="font-family: microsoft yahei;font-size: 14.0px;">个用户也可以产生</span><span style="font-family: microsoft yahei;font-size: 14.0px;">1000TPS</span><span style="font-family: microsoft yahei;font-size: 14.0px;">，无非是看响应时间快慢。</span><span></span> 
</p>
<p style="margin-left: 21.0pt;text-indent: 0.0cm;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">&nbsp;</span> 
</p>
<p style="margin-left: 21.0pt;text-indent: -21.0pt;">
<span style="font-family: wingdings;"><span><span style="font-family: microsoft yahei;font-size: 14.0px;">&#216;</span><span style="font-family: microsoft yahei;font-size: 14.0px;">&nbsp; </span></span></span><strong><span style="font-family: microsoft yahei;font-size: 14.0px;">复杂公式：</span></strong><span></span> 
</p>
<p style="margin-left: 21.0pt;text-indent: 0.0cm;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">试想一下复杂场景，多个脚本，每个脚本里面定义了多个事务（例如一个脚本里面有</span><span style="font-family: microsoft yahei;font-size: 14.0px;">100</span><span style="font-family: microsoft yahei;font-size: 14.0px;">个请求，我们把这</span><span style="font-family: microsoft yahei;font-size: 14.0px;">100</span><span style="font-family: microsoft yahei;font-size: 14.0px;">个连续请求叫做</span><span style="font-family: microsoft yahei;font-size: 14.0px;">Action,</span><span style="font-family: microsoft yahei;font-size: 14.0px;">只有第</span><span style="font-family: microsoft yahei;font-size: 14.0px;">10</span><span style="font-family: microsoft yahei;font-size: 14.0px;">个请求，第</span><span style="font-family: microsoft yahei;font-size: 14.0px;">20</span><span style="font-family: microsoft yahei;font-size: 14.0px;">个请求分别定义了事务</span><span style="font-family: microsoft yahei;font-size: 14.0px;">10</span><span style="font-family: microsoft yahei;font-size: 14.0px;">和事务</span><span style="font-family: microsoft yahei;font-size: 14.0px;">20</span><span style="font-family: microsoft yahei;font-size: 14.0px;">）具体公式如下：</span><span></span> 
</p>
<p style="margin-left: 21.0pt;text-indent: 0.0cm;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">符号代表意义：</span><span></span> 
</p>
<p style="margin-left: 21.0pt;text-indent: 0.0cm;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">Vui</span><span style="font-family: microsoft yahei;font-size: 14.0px;">表示的是第</span><span style="font-family: microsoft yahei;font-size: 14.0px;">i</span><span style="font-family: microsoft yahei;font-size: 14.0px;">个脚本使用的并发用户数</span><span></span> 
</p>
<p style="margin-left: 21.0pt;text-indent: 0.0cm;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">Rtj</span><span style="font-family: microsoft yahei;font-size: 14.0px;">表示的是第</span><span style="font-family: microsoft yahei;font-size: 14.0px;">i</span><span style="font-family: microsoft yahei;font-size: 14.0px;">个脚本第</span><span style="font-family: microsoft yahei;font-size: 14.0px;">j</span><span style="font-family: microsoft yahei;font-size: 14.0px;">个事务花费的时间，此时间会影响整个</span><span style="font-family: microsoft yahei;font-size: 14.0px;">Action</span><span style="font-family: microsoft yahei;font-size: 14.0px;">时间</span><span></span> 
</p>
<p style="margin-left: 21.0pt;text-indent: 0.0cm;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">Rti</span><span style="font-family: microsoft yahei;font-size: 14.0px;">表示的是第</span><span style="font-family: microsoft yahei;font-size: 14.0px;">i</span><span style="font-family: microsoft yahei;font-size: 14.0px;">个脚本一次完成所有操作的时间，即</span><span style="font-family: microsoft yahei;font-size: 14.0px;">Action</span><span style="font-family: microsoft yahei;font-size: 14.0px;">时间</span><span></span> 
</p>
<p style="margin-left: 21.0pt;text-indent: 0.0cm;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">n </span><span style="font-family: microsoft yahei;font-size: 14.0px;">表示的是第</span><span style="font-family: microsoft yahei;font-size: 14.0px;">n</span><span style="font-family: microsoft yahei;font-size: 14.0px;">个脚本</span><span></span> 
</p>
<p style="margin-left: 21.0pt;text-indent: 0.0cm;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">m </span><span style="font-family: microsoft yahei;font-size: 14.0px;">表示的是每个脚本中</span><span style="font-family: microsoft yahei;font-size: 14.0px;">m</span><span style="font-family: microsoft yahei;font-size: 14.0px;">个事务</span><span></span> 
</p>
<p style="margin-left: 21.0pt;text-indent: 0.0cm;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">&nbsp;</span> 
</p>
<p style="margin-left: 21.0pt;text-indent: 0.0cm;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">那么第</span><span style="font-family: microsoft yahei;font-size: 14.0px;">j</span><span style="font-family: microsoft yahei;font-size: 14.0px;">个事务的</span><span style="font-family: microsoft yahei;font-size: 14.0px;">TPS = Vui/Rti</span> 
</p>
<p style="margin-left: 21.0pt;text-indent: 0.0cm;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">总的</span><span><span style="font-family: microsoft yahei;font-size: 14.0px;">TPS= </span><span></span></span><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALIAAAAtCAIAAACF2KapAAAgAElEQVR4nO18d3hVxfb2wX71WsGOUkMHKYKIAopYKYIFUJSiIGJD8HrFBiJyFaUjcqUqIIgUhUiRXiIdAkEIPSEJ6afuNm3N+/0x+5wEiN7yk/vPx3rOkyfJ2Wf27FnvrPWuMicQstyQ5QZjjgQUoAANaACgMl8apMt8K/6xhOg/fP15cvZkzsv/VQLnYXFezpZAyPJClheKOerfU1gZsPgdbf/Z6v89OQ+IP1/Ow+K8lCFxWETd/woW/r/+FSzOqZE/D4g/X/4LWODfhwWAc+/7z8Piz5dAyOIhi5cBiz/ih/+RGsqmrv/nmZ+XcyjnYXFeypBAOMbDsbNhQQBpkgCBtHlDCv89KTkArbWUvnaplJallEQSIPPTHwSkSRKR+eAfTIhKjXX2lVrrMj8upQSglDr7/+Z685OISl9DRH88mf9vpUxYEECkREKdWp2Rlih7NYVIrDgJwRKGQQhG8jSFldb9HwgRMcaEEGe/pbU2Oj5jJkKI0jgwopQqfUfOued5BknnpUzxYRGJuqVWlwBpXpy5JgTVirgntIJWBBARSSmJwJgQssTbCCGklJx7ZhAhWGJ3a4ALJST9S2KrlDp73//BziY6U/HmSsZYad1rrYjOhEKZ2DovBhZeJOqUch8SkFK4gAQIWiX8CDQE42cwAw2QhlQlS6uUAEhwByANKEBIqFIJDiF/11oktJswFURkMJEwA7/nSsxnE64qcU0cHGTsnME05/xs8J0XI4FwzCsLFgIQmhggoYUmKbnw9a+hScaF4JsBrQGP+dZeawWQJq61UgZl2s+sS0Bo/E4wTAD9m6pKqFxrEEFK0hpncJcEnoikUkL5brGMoc5bizPkbFj4mACE4LbRqc8z4qZCx02xEIpKKKlvAxhjAHHhAAIgBTCCBDwFT/jg+ANYACCiBJ8wmxuldJy4utRbpYaII4MxdtbI/vjGSRk0nPcgZcrvwYJp7QJMCmfliuQXevfs//JLvXv26vLU0926Pt25U8euXbs+8cQTzzzTvWfP3r1feOkfn34RjthSaQCLFy/u1avHzG+mKumuX7/2mR4vDHp3aNrhDA5wDU+B0x/BopQZKGMTJ6CQ+NOftDT61oZnAOCcAxCCGSPBDEkqNX5pOnKefp4hgXDMC1tuKBbVSJBBATBAQHnEYisWz6t43WWXBAK3VqzSu+8brw54s1//l95447VXX3n5tVf7tb2v9aXlrrjx+qrHsgsYsH79xhHDhjzU+q7OHR8dOvwfHwz79Lnuveo3aPzRF+NzolzG0UBxP2L+LomAtIRWCZuhAdeJrl/509DBg4Z88OHbf3//tdcH9X359X4vv97/lTf6v/ryK/37DHzt5RHDPv5qyuyiGAMImv34w5zB77y1NHmFK2jdujVvDHhl4qQJRcHivLyCIR8Mffvtd9au2yA0NMAlSxBqlEZq/LfTJyagfXatAA5Is1aaQQtoSIDHRzgtF1x6KI34fwgQQMmAcd/pm7T4TAQgdNy+xj/FoCU0oYTyQZeywWVsuZL7xu9CDFqoUnM+DRYhi4csN2gXSwjpT04CTJOElrDDEMG5owZeFQg0vOvRXSfcGMAADQntAeEj+3a0bfxIjcr3puVEIsDS5GWZ+3f/NH1M+/vvub/Di8vWH4plner9ZKceAwcXAczcgKAE+fdSAPlhD7QECSgOEiCtAQnF3IKfZo64/sLAxYGLyt+Q1Llrvw5P9WnfuU+XZ1/s+GT7bl0evqvmTVeUC9xYq0V6IYd29mxaOOztnnc1Snry2RfGTp71wQfvtXvswaQGdQe99+Gnn4zt0a1PpcpJvfq9fjiryCUoCA1PMwGCBkmQii+gISG+yyMGbUWy0udOHDtn0rSxY74Z8/WCPaeCFgBEd69ZOGXU0K8nffnpV/Pn/bIv6kEDXAtl9Kc8oyUfRopAEgRoCYRDhRnLFq5dtGBjoQfHIElLaKm15hoaAA/lHU1dunL5riNHOaDBNIpiwcPzvh73zYQJY0ZNHv7phOGffjbk4xGfjp6+afthATCtOIiDlNIGN1IBRCAJTVqRBqBF7NDO5G8nrd25J19BolRcobXW2tRE3JAVViDuYyeuJiEhGZxcFOzo1bF5IPDXh7u+eTisggAnDTAg7Bad+mzg6Lq3tdqbVVwABTCo6Cdv9q1ftfKUuWs8YMfPK7q0bTNp4dIjDNJATpVeJkDB3BfaLJmE9jNgAhKwIhmbJw596YpA4IH722eHEFLwgBiHAgOCaWt/uKNqxWp3PX7EAZGVPHtkXtqymROH39mmw32de2/esDo747eHO3e6vWa9sSMnOkH28YhRjz35XMruYx7ANQMYCNrTCsQhZQIWqgQWgAQryk/f2rlp7asCgUDg5pad3lh3MMsBwHPnTR5S/7arLgwELr6h4aBP54YcaEBAKUPRtB+DWQocACkwB0JCM8j8rRuXXfOXW++9t8uJYscGuHTNR7TWttIAIZw16r03GrdsvXDjFheQ2gGKC3N29e3U+qpA4JK/3FK1fut77nugxb33VK1S8667H1yVsscGbGgJguIgcA1pLIXjEndNbAjmzB/1wXWBwKsfDD8Zh4UGlKa4E7HccMyLhZTZtRwwmwYaIEhmgYqh81M3/Vj9lmuvvPL6ETOXnxDgBvhgUHxn8s7BfT7MKQjaiAH5Iny0a8fOL/bqn10UdBxn8eTpD9x5z57cwgL484NQWhEHcUhjDKUPCxMGxW0GpCvMQ4XzD2/q2Oz2KwOBFweMPOHABjjAtQcdQtHBt156/oYaLQ+FYDk2VAH4saGvda/S7NEpydvBwxuSZ1WvVbf/m3/XwnMiwW7dX3j97Y+Pn2Ker3IyFkuDJGQpa0G+LdPwPAdwwfLTFn9Z7YpytZo/u/YQPEDDA+VI5+jwdwdcdskV/d4ZUyBhgOUR51pAGcMAIX3eDQjABXmQNnR009oVT3TqMeLz6UGmGEiDKRWDlkoJDgCyeN+27g898MCTvY7Y8SXSAhTNSJnfuNI1Ldv33FcABkDbq+dPuuGvFzR9pMuBCMLmMZQVzc3clnogPSeozEaD1JBaA5L/NH3sUw+3mr9qU66CyzW0eWbflQWiMS8WkbGQvz5mxyhAa2gNBaFgkQ5B5H076t1rLytXoc79035JjwkoZVwUgQE2uMcAC+LI0b2rGjW9/8N/TI5ZRU4w87O/vX1f05ZHwvYhm9lKQ4M4AySD4H7IQyZwjXtT35AaXEtoQCgne0/ypMpXBC7+a6V/LtgV1HAATzHAgnPy53kznuvzTkbIwC6KzG09H2nRrvffUwsJFPz+q4+bNr9/TUoqYBVlH2ze/L5v5q2KMDgK0mT0uQ8LhXguVhO01IntAQAMMh/HVrZOqtCgTd/NWfAUoF0gN1yU1vel3s1aPpyWEXFMOKa5MAgjyFLxkAYYmAaDioGFQRYU4wQGxAR52tNwNRwQA6SCVDy2+MuJHVq0+vK7ZYWAJeKswQvnpCxqeNtVXd8Yku7BAcALoqnJ3R5qXL5+q21FYACkRCxn7qQvajS5Z/L3K4UyDIaE8qA0FIFszqwYEIsTSilcgAxVD1hhikUoEjZuVWpIDWgNpeFKcAgOW8MGwsjd+9xj9wb+cm2LJ/ut3JHpmQflLijOxaQDlbF68dRaLTqOnLkc2ouc3DOgd7cuT3Resnn3sMlzCiKMewIQBI9BMuPAtU+XJKDiyTTDAeH3CALaEUW7Phrw9F8Cl957/9Pr9ucWAY4gaBcUJrtIMDAJCSg7VrB9zYMNag2dMLsQgHVszOAX73/omWIPmmWtWTq5Zo0Gi5ZuC3uIMvOoBpnQkMrsZw1oAnxYSAFNUCoGnRvZ+0PrWjc0e7T/r1nwAHg2ePZP341v3f6JKYvW+AuimXKCebk5OXnFlguhAQjFgsoJ5+Rk5bquDQAWnPzcQ6lWUUGRTQ4SNsbScMmP7e1wUdaLnbp0fvDJnYdzi2GsApRnQdq/zp5S58byI2b9kAFwSKhivndV19ZNbrnr0ZQCcAUv63ju1mVP3Hdn5YYtJyzYeCLHzssLS4AgZCRUkHEiK/uUA4QAx0xbemYrRiIRrbUPi2BUxU2cgPZhoQBbWhK2oBhggeelb0xOqnpb4LJr+74/4UTEWCoXsACmBMGxIU7Nnz62bZfXZi7bDUgvdHzcZ++Xr3B1o9aPbD+czxQACG4TOPOpa0kwIgEOklAEpQ1MSMOnIgLILzy26YHGdS4KXPDos6+l5jIOSMEAG+RAgQQ8AWismT2tbaP6//x+hQ0UpK8f9Pxjz/T+e1BAsxNzvn6/edN7V6xJmzJr2ZqUfZogPChuJiA1hO/IYGDhT08JAC5Ejs5cc0+N8g3u77k5AzEOkOucPDigT4/ebw/JFD5rFpG8MZ+837RezWpVa46esigoAdigwtR1y5s3btxn8LDjDgfc1LU/Ptn6zluuuar7ywO3HDylfOqtpE/sXFBh6tZVDZOaDHhtaJjDBhggSQGWKDz+wXM9m1Wtu3jLjlxAwoWTu27yhFpXX9+x/3vZgBJyzODXH6x+7VWBQODKitfUa1OhYu0ePfscz862nfDi6ROb1a52dcWkd0ZPzYgwn9VJBi0FdwoK8ogoEIt64ZhXFBPSmEq4PgcgsyoCsAEbyoIVhheeO+rDm66+7JJbG475fqMnAAiJqAfb2EyQ5YTyDx0uinrgAINXUJi17+DefceyXIBr+GVVgJeERuYWrgQMVqSZqCKziQSUhCARhQ6u+mFc9Zsuu/iKm0eMX2ADNkFqDxAm1oMGKTFt9GePt22zfN32sKsObv35yYeaDRg80gHAstcu+brizVUrV71r8syFQRc+vyBoQjzwK4knjYOWvumWOpaF7HXPtW+adPdTK/bFAAEre/zHI9s93OWnlNQg4EkVPJX17pv9Z074/IevRidVvO2BZ97clesAYXhHlkz+vFL56z+asuAUICBV6OT344c3qHTT030HFZFvLRVgkVYAKAZ2YvroDx986NkfV+2VAIMXU1JBALmiIP2p5m17tOux4+DBCIREdMkPs+66rdlDTTpvP5oXAkiGCw9vn/PpO3VurdD9zWE/7jy5ZXf6wYOHjIqt49s+eat/ufI1h3+7OgQIbZiAiQFkfn6uoZyxkOUWxUz1UwAuIOLqAyQHOVJ7gISUYBZO7undoc0tdVtOXbZHAqSEBGOQ3OwvCCgGAa3hALE4gbUEeILigaSUsoRPMGgbcE1sYwOWBkj5sCAwaG6ciwzBO/jRoG6XX1b+9qTWc5K3OWZMrUxISUSkWO6xI4fS0kJRVwOxgiOH07ZlFXqWBHRUhk/+umnnkp8350U8BmhjGzRMZQ1wTfSoSwImAFCCQICyRNaaHp2aVbrz8RV7gqBQ/tFtPZ9942/vflUoTXgpmRVO37uj6NgB+9CuFnVrtev7wVEJiXxZvPOT/j0aVquzZOuxPN8dWFsXzbinXtKwid8WAdoCOGwPHuCRBCz72IZH7kp6/uUPMmNgxAGLQ3oUBTKLjqa0qt389muT6tav1bhF3aZ3132y81NTxi7Zs6WIAZZmGkXQ+WvnTWlSs/b4OcvyzONIrgFoG86RKSPfvfGOh+fvKrbMvjOrpxggi4oKAASK3EixY0ciAmT2u5DGy2oBySEZSHDAU4BkcELH1yQ/2vTOQe+NPhmF0tCADenBL58AEsKGYIC0gSjgAVL5BJY0tNYgBrgKtjKmwRgGppgrORADQhSvzCiC9q/TEJAFoAyWv6/VPW2q1mk9d9kOx6hWJzabBAS4AJGJBY3xYwpKAiShBBSkBgM4oKRPigiayAJsEAORIJhHVqaHwxg3YSO05W+vtq921+Or9xTDzR3+1ovtnxyw5SAzu5Arx5+AtNdOH1fnxvIDRkzLBIDi3EOrn3novjpV6+/LigUBB5p4aO64Ec3r1Pxq/soQAA/gUIClIUHQkZWzPm9W4+bh4749Jcx2shUEIQp5ePncsfWqNOr2VN9ZMyaOGz3kphtubdW6c14YroYiKKWBXODkq92731H9zu+Wbwv5m0do4qAoCve81aNDnbbPLz3IbGMLSGtOhsm5riuECBQ7dshyoxEG32sQN9RPC3AbJJSQvmHnkXD67o4t7n7jxVf3ped5AAjMIw64kA6UAojZIJdFTg0bPviDLz7JZ56Ese3w3HgBHgJkA7ZQURgXwSUEgtnF77338aYDh6PmKpcbWHjaxAoxoBgia/+W5c3vafO3oeOzQ3B9CgJHehxCgkvlQSgIobWt4caUbYwjGeskCASh4UFyQ3jJtCwrwAUs8AgEk4ADcJN/A7RJXxDTxSnDBnet17LD2t25e7es7dWlw+ipy4qUWbaoIeyACx78+oO/1b+l4rRFG4sAUM7R3ckPtGrTqctLmcXMAzRcYef3eaJjuzYPr913LGhsqEsOM1MNg4KDXnj66Q6Prdtzwl8NZQlyAQvuwQkfv3pN+epzFqyDjME69fFbg+vUaDp39a5TCooAgtDHI9G0h1q0bduq269p2THTCqMFNAMFi3cs7nxv3effHr0jjAggyDV6OZGZ8f0P8+fOnQsgEI0gGpXRqJWoLiaoliZplp2BABdFR9549vG77rp/1ebfmHEZfjTMOBxmIMldSJtkeMqsyd/8ML8gasejT7P9iZRQzDMuXEqpIQAvM33PhwNee7BJ66svu2neyk0Rs1MZN+kkAUgQEIXMy07b1KFty64vDkzNjHHEjQpBgHG43ESYGiABhE/lp4+d+vW3P61g5v6GSQitAQ7paVdJbiyNgFQ8BhGGikbzsz8fNyNlX5ZltqmOkw+yKLj9/Tc71bij2YqU9IED3ntzwDuHMyPGvxK8eGa6WEUznmnX7sGWj+387RTXAMtcOP2z62s0G/jFHM+EIZRddGx7m+b39eg1IMtmIcAQGNIAXKj8oztX165d993hY4s4bOU7Xq01yEXWjv5PPXB1labJu3M1ABn9ftRHt19z5csfT8wBLAIpDzh54vDmejXv+fvbk4psP4SB8CDDEHn7k6c0uPXKoRNmn4TxfcbAICv71Ozv5gwcOFBKGXCCsMI6ErWUmVUiNPDTGOCQAkWKZcz7cnibJg1mLPwlT8E15SUCFMXyM37dsCo7FLMU4EWPbN8459spySuWR5n282vcNTGO3wWjoTm09AOQ4uCpb6eN7NOtfftmbSpdV33Jxj1BEzXBzzYqmIRmoQofG9iv75133rtu1+GY8f1M+T0hIEt5LuBCgRhEFBQMFp34+vsFY+b8GBJQOlEbVgBJSAkBSJLKFPoBFsk9NvnTdwb1fyFw6c2jpyUzgCsoAWgoAmDB3j/q/Z7X3XDz0y+89fjTry5buV0BTEkPTEIAgGbwjp88uKFOUr0+L7yTk8dAKNi94on7GwVuqDduWVpUAaoI6kjKT5Mr3lLrzcFjCzzmAOYltQcdhHdi6mfv3pzUZHryDgfgyu9YIabArdDOFffWuLV194Hrc8AByPDO70e1rHV9p1fePwZEAA0XOLlu+bc1q907ZNgcS4BpzQ3uYOnoiWlDX691w1/nr0rJB+x4N4xpl4lErQULFhBRwA3CClMwxuKUUEIzEGkC1+CAQBQ4uCtlev3bb/xkyGe5DLna5PgYwMBiB9f+8sxDj6zYvC8MANa6pXOSbritab2Wa39NY0AsnLvsx9lTp0789tuZU6ZO/+fkaTOnTpvx9czZMxdv+/Vg1KbMrIx9e9dAFh5cvaHerXUXrd+db0gZCJz7lFC6sA5/O2FovTvumzpvfUxC+NkuAR7zwsW7dhwoCJPjGzYLFDy4acXP8+f9sjM9x2e+gIRf2gcc6dnCNczC5B+dSHD90vnPPdbszjpVLrmq2uS5m51ESUuDA1rHEDuwdMpHf722whUVG4yfviy3yNQtmAfPBQcAYtAnd2yYV6P6He8O+TIcQzg3L3nchw1vufrGJo8sOWzl2rR1/VIEt80Z9WblKk0mz15baFtrd2w8FrYs35Dk0pGU5x5s+cjzgzZnK9sPigiWAyIoN23JNzUrXPnsu5P2cHgAeEFeyozWSX9t0rbLziBCAIcNdmjJrNGVKjaaPOUXRoi5zq/b0wqKo0KEWOT4wO4dmtaotP23I7/lRnalHw1ZLle+iyBo13UBBKyIjEZlMMbi2SQB7ZqcejxBHjx5YFHfZ1u88Hzv/CCiQBjg4C4LgqJwIwvHf9WkSv1Fq3YXAUAQMr/Xk316d3vraI7lAAfTtr/Rr2uDBlXrN67XsFGTRo2bNW3SrHHDpk3uaDV+zEzpp1uDEPmbZs9veGu9ub9sywUcw/WU4bwS5O5Y/X3j2pU/+mLmKcu4fOlxF2DgeVvWLO3ydL8tu/OKOTxIIAx2aupHb1etUKHe/U9sOmmFCEzaqSnrNib/tGzhouXLVyb/8suSFcuWLflp+dLk3WmHmES4oGD76qXwsg7v3lij4aPjv90UYuAmdS2EBLSMIXxg7qi3AxdcfE/HngdypEuAJiKLQTCTgiMGkXk8bU2lW6q0vu+JeT+u+vyzkV8Nfn1I3x7lkxq9OXb2F9MWjhgxXOZuXTpjxG2V6r3y91EjJ076dMKo7YeOemYd7OMbvplUs/z1o2etyAFss1GJoCSEcyBlzZtPPXLthYHbW3aetzfXASCKkb2x56ONLr+66kcTl+zJKvLAgexta+ZedflN7Tu8sGTp8hEjPxvy6bhf9xzQEE745LCBfepWvmX0hK+Gjpowbsq0Q5lZpk+KCZ7oRwkUO7GQbUeirkmOqngPDrjh7WEra++HL3e96YqLv5y+cOvh4K9pR9KPH/1t/54T6amZh/dtX7+he8eeNSq3+DW1MKpBOiMS3t+uY+93h850AEaAknAjQFTC9hTzQz4JaDgOScDTnkIUIrTj++V33tJk4fq9eYDl8xsJssHzMlI3Pd+9V7vOz2cXMZ9SkKnihkHZ00Z9WLVmy3W7i6MGZGTDyUPR0b7dnniw18DUGBhw6sShAf2eql356no1q1etUrNyUu3a9RvWrFa1fu067w35tCjMoAAegXcidfOyW5Pu+2LqWjceV0gS0IBicE4kzxjZ6qFH/zn/l6AwJg2OG5GQElIJCS2AMLk57/fvV6dKjSp3NH/ro38gEt6/alnLu5vVbXZvv8ET8h2AQnkZu7p26Z5U9+6+g97bdyxTaGjtAoV2Qfo7L/R/vM2TKWkZEYABXAuT3bFyD/4weWSLmtWSqlS98Y5Gn8yaUxhzQAJu5vxpo2pXadiqVZdvflhuaSEprzhvX78ePRvWblgjqVq/11/df7LQMglDN7hu+fy2LZvWrddw5Liv8qIR5pM+YwJM1z4ChV6k2IlFI04cFlKbChYJiBjCJ5fOHH/rJRdeGrggcOmNgQuvK3fppReUC1x20YUXBQKXBQKXlrvwwkCFqlVb7T8a4wBw8lD66vvaPzd6xpqIggLgeNaprFO5BzPz0rPyTmbmnDqRkZ2bV5ydUxCNuUKTghA6AhHduWB5w5vrz1u108BCAVAcIipz9w1++ZmKFWvMmr86Ky94KrfwVFZRYV4oNz+7MP9oRurK7p0frtzg0Y0HXIugtQLZkEF2dPtLz3R+/bOpOT4XtsBywPOUHVMclkuWK7XwXNuJ2FAamglQFOLEnk0/V6/7yOipmzzAhRImi8MUpISXD1UcsjzHb0iBJKUhuRYE5dexwMBC8CJkxbKibti4AM8SkbyYbRVyU4OQJEOe4wYjXth3PwBsyMyM/ZtbNHngH8NnBF1ElOIA00JCCC8CiiJWwMMRz+NFwiqUjvA7RWywCGwdynVckYjaohC2GyoOhwotz7UBf5dCAq4dLgiHozFHcCAmhV9ZUwqQWisAgZBthy07EnXiXDPRPCJB4lDqjq7tH7k8ECh/+ZWXXHxFoNyFFwUCf7kkECh3eSBw5WWXXFouELjy8lsbNX7ocFaRgoTOmTn545btnvpm+U4b4AoHdm7v/VT7WlVurFHj9qSkatVq1rqtao1K1evUrNPo4xGfC0nQCsKGsDd8P7dB1RqL1+0sisOChAOy5k3+rMIlgcsvvuCqq66pUOGGChVuuPaa66+7pvx11113fYWrb7r6snIXXHJL46cOxGApAAwyDFV8aO0PL3XtNGrWCh8WIoJoNpwixGJgsFyKeUKpmOtEozHT+qOAIChzx4afq1V79KvpOy0CB6l44QaaoBk016X6Dg0xLtXGEk+5xCvD0v+sKf7FWxb8CMr/BEltMhMI7Zk57v0bbm+yLCXbFO2kH4VZgI1SDTanFRcTV5U0NEm/0mMa0k6bcDx4Q8l4p88f8AvrlhuJWmc+mybiTNj20QMHUrdvP3rgQPq+fScOHzj229bjh9JS007uTMtJP3Rk//79+/edyMqJOgQNBidz6FsvtuvWa+rSTYtWb9u+5zdw69CelNQt63du2ZSSkrJlx+7N23Zt3fPbrzv2Hjme5U9KCRnK/37y2OuvvHziN/PzBOLpS7Fz48qH7m549QWBSwOBiwKBiy648IILLipX7sJy5S68IFDugkC5coFAoNwV1e59Nj0Kl6BVBAgDxd9N+OTpdo/9uOG3ICCB/IyDA3t1a55UqXH16jUqV69SvXatBg2q17i1bp0aH74/LlQMTRwoBrJ3pfxSt3bHiZNTQixeWz13ogFFmglPKsAOHV7V9ZEmDzzRb9dJk6YjBShIIArYCpD6nM6mRHxYhGJlwALKdIb5L+IM0oOMmuqxqwwASXIIAQFwEQMVTxr14c3V69zRptOMhSuCMRfCBdnQDIobOPulznh2xInGfpj1zT0N61W+9vJLAoErb6na6IHHZy1KFpJAnIVz921du2H5oi3rf9m8fs369evXrtuwfv3GjRs3b1y/Yf3adevWbdi0JXVDalbM5M/hQhfKyIlXX+zVocPT237LCim4SrlOJHXLxtWLFq5YsGjVzyt/XvnLkhXLlsP4jSUAAAUDSURBVCYvSk5O3puaITgAAZkP7+TqpQsqVmw+evzPDHChlT6XJ880lMtM7sR1i3+ePbJ+5WvGTF1QpEqytwrCL0aeZiHOrZTAorRVBIg48wGhpBY8DhEJsqGljrdwKfjHP/ySCi/KP3Fg8bLVk79berwwxn37yUBcMceHhYICuAJpvyCXkX7gm6++XDRrxs8/Lvx69sLJ3y3efySTjKsmFzwCcqHFaU2OQKKZ0SQX/fSDduCetPMPtW77WIcu/XIKXTNPj7sAQQhTG3MFt4Xrt6ZIc6TA+nXTkmc6ta5R6eZA4Lprb2zUtNXDM+fNl+q0puI/WeJFGQFJZGWlbVq5YFYxRxhQfmGZdEmhqrTnOrfif0lSAhZx9+O/EkcO4523EhCapA9wxRh55vGUSRiRC26p0rVQEJQX78MD4PcMqoR1NuhgLpTQgnMg6JncEIQXg3SgXQgbJLTWpE+HhUleKHNWxBxvdEGFB3dtatiywyvvjWcSiCOYmTuWNN0QACWhTBMhDx9J3/blqGFfDB82Zty0L8bPHPbZhHWbt55rWBAXgnFtUgM8AumaeqHylSH9ht6SBuz/hZQJCySgcNpJVJJK8kQVQftFVen/R0MxDyRB5DrSZEg9s6A6nr+VUkqZwAQRlJAgDVPblRLaz6H5tVYtoRi0IO4i3q1juJjWpkuGuCF8xOBGoBjIAS/4fPiHSc0em7tin9aAUh73yxx+cYSgQYx4vGhu6sUuYEPY0NKUxhwVr9ad04Mkpg4lmSJmGpoc8tP0cViIc81wzpbf/Uq1eGXdnK1QJRUTY/kVaa2433gnYSJ7DWY7/ofie5SgzeGOM859+P0cOl4MiP80vkBKgzZh2kMS7uNsWBC01grKgbLBI6uXzv/HB2/d2bjJy++MOlwAzs2dpAZcIMxM+z+IZLzuA621Kc2AbNP1T1Bm8ran6BzrQ5qdBlJKQIOkijeqlQoc4nY1oYVzLX/0TXtScq2VLrXXNeLtjpqghQDnYBocWkIIvwYbhwUnlXi8hMswB7kAHwT+Gcb4S+vTQan96po5M0Jx0MTFR60iBs0gYzycO2bEkHYP3PfWoMGHsp0IQZt7Cw+QHGDGFsdVraRJ4xA0BwQ0BwlooSEZcVWWLz8HloNK61tK0nGfXcpyJ36RZQxwDsT/kqQ//gLG0gFuvJxmOjOE9JuaBBTF2ad/uAIgBTp9zMTjURnY12VecFq7VMJalHGZn7ZnBl4GBKUKqqcflSmZEMWzCae9dKmZn2MpecbST3cWk0jM838h/zEs4oElAUL5sBCADwuVOBSkCJD/ESxKFHbWBboULMoaJzHhkoNffveXb3wkSGhI5X8fXNw4lVyY6AWR/mGvMhRzjiQ+n4TaS2ZSmmZKQ7H/N3P6t76AsWxYaBnvlpb+IZnE+TAqsRZnmpk/HD/+x5lf/lqGuSr9Rul9Fr9IlZgKHxb+MfxEmpEQD/9KblfS6Kv/xZz/NEk40MQBRjNnCEOJTHLIh8X/Cqr/NSwQNyTx72MsRTMTsPhddf7O+EiM/DuYKEPIB4EsPYI+HSjmiF8ZsJBnwEL5DYuJPXzuKd7ZsCCzysIQuXiILf7FIv6pctqJ9X9TeWe4Z50AiQYHlZwP+zdA9kdvx/8qJWd6FsTvq4EzHEQcFgQiKDJOTSeu8T9VCgS+GadSisH/gvnHXYY2bdKJuytpEvJ+HyvY/xIW/w9qA7JPZ0JepAAAAABJRU5ErkJggg=="  alt="" /> 
</p>
<p>
<span style="font-family: microsoft yahei;font-size: 14.0px;">&nbsp;</span> 
</p>
<h1 style="margin-left: 21.0pt;text-indent: -21.0pt;">
<span><span><span style="font-family: microsoft yahei;font-size: 14.0px;">4.</span><span style="font-family: microsoft yahei;font-size: 14.0px;">&nbsp; </span></span></span><span style="font-family: microsoft yahei;font-size: 14.0px;">如何获取</span><span style="font-family: microsoft yahei;font-size: 14.0px;">Vu</span><span style="font-family: microsoft yahei;font-size: 14.0px;">和</span><span style="font-family: microsoft yahei;font-size: 14.0px;">TPS</span> 
</h1>
<p style="margin-left: 21.0pt;text-indent: -21.0pt;">
<span style="font-family: wingdings;"><span><span style="font-family: microsoft yahei;font-size: 14.0px;">&#216;</span><span style="font-family: microsoft yahei;font-size: 14.0px;">&nbsp; </span></span></span><strong><span style="font-family: microsoft yahei;font-size: 14.0px;">并发用户数</span><span style="font-family: microsoft yahei;font-size: 14.0px;">(Vu)</span></strong><strong><span style="font-family: microsoft yahei;font-size: 14.0px;">获取</span><span></span></strong> 
</p>
<p style="margin-left: 42.0pt;text-indent: 0.0cm;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">新系统：没有历史数据作参考，只能通过业务部门进行评估。</span><span></span><span style="font-family: wingdings;"><span><span style="font-family: microsoft yahei;font-size: 14.0px;"></span></span></span><span style="font-family: microsoft yahei;font-size: 14.0px;"><br />
</span> 
</p>
<p style="margin-left: 42.0pt;text-indent: 0.0cm;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">旧系统：对于已经上线的系统，可以选取高峰时刻，在一定时间内使用系统的人数，这些人数认为属于在线用户数，并发用户数取</span><span style="font-family: microsoft yahei;font-size: 14.0px;">10%</span><span style="font-family: microsoft yahei;font-size: 14.0px;">就可以了，例如在半个小时内，使用系统的用户数为</span><span style="font-family: microsoft yahei;font-size: 14.0px;">10000</span><span style="font-family: microsoft yahei;font-size: 14.0px;">，那么取</span><span style="font-family: microsoft yahei;font-size: 14.0px;">10%</span><span style="font-family: microsoft yahei;font-size: 14.0px;">作为并发用户数基本就够了。</span><span></span> 
</p>
<p style="margin-left: 42.0pt;text-indent: 0.0cm;">
<strong><span style="font-family: microsoft yahei;font-size: 14.0px;">&nbsp;</span></strong> 
</p>
<p style="margin-left: 21.0pt;text-indent: -21.0pt;">
<span style="font-family: wingdings;"><span><span style="font-family: microsoft yahei;font-size: 14.0px;">&#216;</span><span style="font-family: microsoft yahei;font-size: 14.0px;">&nbsp; </span></span></span><strong><span style="font-family: microsoft yahei;font-size: 14.0px;">TPS</span></strong><strong><span style="font-family: microsoft yahei;font-size: 14.0px;">获取</span><span></span></strong> 
</p>
<p style="margin-left: 42.0pt;text-indent: -21.0pt;">
<span style="font-family: wingdings;"><span><span style="font-family: microsoft yahei;font-size: 14.0px;"></span><span style="font-family: microsoft yahei;font-size: 14.0px;"></span></span></span><span style="font-family: microsoft yahei;font-size: 14.0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 新系统：没有历史数据作参考，只能通过业务部门进行评估。</span><span></span> 
</p>
<p style="margin-left: 42.0pt;text-indent: -21.0pt;">
<span style="font-family: wingdings;"><span><span style="font-family: microsoft yahei;font-size: 14.0px;"></span><span style="font-family: microsoft yahei;font-size: 14.0px;"></span></span></span><span style="font-family: microsoft yahei;font-size: 14.0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 旧系统：对于已经上线的系统，可以选取高峰时刻，在</span><span style="font-family: microsoft yahei;font-size: 14.0px;">5</span><span style="font-family: microsoft yahei;font-size: 14.0px;">分钟或</span><span style="font-family: microsoft yahei;font-size: 14.0px;">10</span><span style="font-family: microsoft yahei;font-size: 14.0px;">分钟内，获取系统每笔交易的业务量和总业务量，按照单位时间内完成的笔数计算出</span><span style="font-family: microsoft yahei;font-size: 14.0px;">TPS</span><span style="font-family: microsoft yahei;font-size: 14.0px;">，即业务笔数</span><span style="font-family: microsoft yahei;font-size: 14.0px;">/</span><span style="font-family: microsoft yahei;font-size: 14.0px;">单位时间（</span><span style="font-family: microsoft yahei;font-size: 14.0px;">5*60</span><span style="font-family: microsoft yahei;font-size: 14.0px;">或</span><span style="font-family: microsoft yahei;font-size: 14.0px;">10*60</span><span style="font-family: microsoft yahei;font-size: 14.0px;">）</span><span></span> 
</p>
<h1 style="margin-left: 21.0pt;text-indent: -21.0pt;">
<span><span><span style="font-family: microsoft yahei;font-size: 14.0px;">5.</span><span style="font-family: microsoft yahei;font-size: 14.0px;">&nbsp; </span></span></span><span style="font-family: microsoft yahei;font-size: 14.0px;">如何评价系统的性能</span><span></span> 
</h1>
<p style="margin-left: 21.0pt;text-indent: 21.0pt;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">针对服务器端的性能，以</span><span style="font-family: microsoft yahei;font-size: 14.0px;">TPS</span><span style="font-family: microsoft yahei;font-size: 14.0px;">为主来衡量系统的性能，并发用户数为辅来衡量系统的性能，如果必须要用并发用户数来衡量的话，需要一个前提，那就是交易在多长时间内完成，因为在系统负载不高的情况下，将思考时间</span><span style="font-family: microsoft yahei;font-size: 14.0px;">(</span><span style="font-family: microsoft yahei;font-size: 14.0px;">思考时间的值等于交易响应时间</span><span style="font-family: microsoft yahei;font-size: 14.0px;">)</span><span style="font-family: microsoft yahei;font-size: 14.0px;">加到脚本中，并发用户数基本可以增加一倍，因此用并发用户数来衡量系统的性能没太大的意义。</span><span></span> 
</p>
<p style="margin-left: 21.0pt;text-indent: 21.0pt;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">&nbsp;</span> 
</p>
<h1 style="margin-left: 21.0pt;text-indent: -21.0pt;">
<span><span><span style="font-family: microsoft yahei;font-size: 14.0px;">6.</span><span style="font-family: microsoft yahei;font-size: 14.0px;">&nbsp; </span></span></span><span style="font-family: microsoft yahei;font-size: 14.0px;">相关案例</span><span></span> 
</h1>
<p style="text-indent: 21.0pt;">
<span style="color: #333333;font-size: 14.0px;font-style: normal;font-weight: normal;line-height: 21.5938px;background-color: #ffffff;font-family: microsoft yahei;">通过大量性能测试我们</span><span style="font-size: 14.0px;font-family: microsoft yahei;">发现不需</span><span style="font-size: 14.0px;font-family: microsoft yahei;">要用上万的用户并发</span><span style="font-family: microsoft yahei;font-size: 14.0px;">去进行测试，只要系统处理业务时间足够快，几百个用户甚至几十个用户就可以达到目的。另外咨询很多专家做过的性能测试项目，基本都没有超过</span><span style="font-family: microsoft yahei;font-size: 14.0px;">5000</span><span style="font-family: microsoft yahei;font-size: 14.0px;">用户并发。</span><span></span> 
</p>
<p style="text-indent: 21.0pt;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">因此对于大型系统、业务量非常高、硬件配置足够多的情况下，</span><span style="font-family: microsoft yahei;font-size: 14.0px;">5000</span><span style="font-family: microsoft yahei;font-size: 14.0px;">用户并发就足够了；对于中小型系统，</span><span style="font-family: microsoft yahei;font-size: 14.0px;">1000</span><span style="font-family: microsoft yahei;font-size: 14.0px;">用户并发就足够了。</span><span></span> 
</p>
<p>
<span style="font-family: microsoft yahei;font-size: 14.0px;">&nbsp;</span> 
</p>
<h1 style="margin-left: 21.0pt;text-indent: -21.0pt;">
<span><span><span style="font-family: microsoft yahei;font-size: 14.0px;">7.</span><span style="font-family: microsoft yahei;font-size: 14.0px;">&nbsp; </span></span></span><span style="font-family: microsoft yahei;font-size: 14.0px;">性能测试策略</span><span></span> 
</h1>
<p style="margin-left: 21.0pt;text-indent: 21.0pt;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">做性能测试需要一套标准化流程及测试策略，并发用户数只是指标考虑的一个，在做负载测试的时候，一般都是按照梯度施压的方式去加用户数，而不是在没有预估的情况下，一次加几万个用户，，交易失败率非常高，响应时间非常长，已经超过了使用者忍受范围内，这样做没有多大的意义，这就好比&#8220;有多少钱可以干多少事&#8221;一样，需要选择相关的策略。</span><span></span> 
</p>
<h1 style="margin-left: 21.0pt;text-indent: -21.0pt;">
<span><span><span style="font-family: microsoft yahei;font-size: 14.0px;">8.</span><span style="font-family: microsoft yahei;font-size: 14.0px;">&nbsp; </span></span></span><span style="font-family: microsoft yahei;font-size: 14.0px;">Loadrunner VS PTS</span> 
</h1>
<p style="margin-left: 21.0pt;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">从下图对比项可以看出，</span><span style="font-family: microsoft yahei;font-size: 14.0px;">PTS</span><span style="font-family: microsoft yahei;font-size: 14.0px;">比</span><span style="font-family: microsoft yahei;font-size: 14.0px;">Loadrunner(LR)</span><span style="font-family: microsoft yahei;font-size: 14.0px;">更能让客户接受。</span><span></span> 
</p>
<table style="border-collapse: collapse;border: none;" border="1" cellpadding="0" cellspacing="0">
<tbody>
<tr>
<td style="border: solid windowtext 1.0pt;background: #a6a6a6;" valign="top" width="113">
<p style="text-indent: 0.0cm;">
<strong><span style="font-size: 14.0px;font-family: microsoft yahei;">方向</span></strong><strong><span style="font-size: 14.0pt;"></span></strong> 
</p>
</td>
<td style="border: solid windowtext 1.0pt;background: #a6a6a6;" valign="top" width="122">
<p style="text-indent: 0.0cm;">
<strong><span style="font-size: 14.0px;font-family: microsoft yahei;">对比项</span></strong><strong><span style="font-size: 14.0pt;"></span></strong> 
</p>
</td>
<td style="border: solid windowtext 1.0pt;background: #a6a6a6;" valign="top" width="141">
<p style="text-indent: 0.0cm;">
<strong><span style="font-size: 14.0px;font-family: microsoft yahei;">Loadrunner</span></strong><strong><span style="font-size: 14.0pt;"></span></strong> 
</p>
</td>
<td style="border: solid windowtext 1.0pt;background: #a6a6a6;" valign="top" width="118">
<p style="text-indent: 0.0cm;">
<strong><span style="font-size: 14.0px;font-family: microsoft yahei;">PTS</span></strong><strong><span style="font-size: 14.0pt;"></span></strong> 
</p>
</td>
<td style="border: solid windowtext 1.0pt;background: #a6a6a6;" valign="top" width="181">
<p style="text-indent: 0.0cm;">
<strong><span style="font-size: 14.0px;font-family: microsoft yahei;">备注</span></strong><strong><span style="font-size: 14.0pt;"></span></strong> 
</p>
</td>
</tr>
<tr>
<td rowspan="2" style="border: solid windowtext 1.0pt;" width="113">
<p style="text-align: left;text-indent: 0.0cm;" align="left">
<span style="font-family: microsoft yahei;font-size: 14.0px;">基础设施</span><span style="font-family: 宋体;"></span> 
</p>
</td>
<td valign="top" width="122">
<p style="text-indent: 0.0cm;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">被测系统软硬件环境需要额外购买？</span><span></span> 
</p>
</td>
<td valign="top" width="141">
<p style="text-indent: 0.0cm;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">需要</span><span></span> 
</p>
</td>
<td valign="top" width="118">
<p style="text-indent: 0.0cm;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">不需要</span><span></span> 
</p>
</td>
<td valign="top" width="181">
<p style="text-indent: 0.0cm;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">基础设施软硬件由阿里云提供，只需要购买服务</span><span></span> 
</p>
</td>
</tr>
<tr>
<td valign="top" width="122">
<p style="text-indent: 0.0cm;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">压力机环境需要额外购买？</span><span style="font-family: 宋体;"></span> 
</p>
</td>
<td valign="top" width="141">
<p style="text-indent: 0.0cm;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">需要</span><span style="font-family: 宋体;"></span> 
</p>
</td>
<td valign="top" width="118">
<p style="text-indent: 0.0cm;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">不需要</span><span style="font-family: 宋体;"></span> 
</p>
</td>
<td valign="top" width="181">
<p style="text-indent: 0.0cm;">
<span style="font-family: 宋体;"><span style="font-family: microsoft yahei;font-size: 14.0px;">基础设施软硬件由</span><span style="font-family: microsoft yahei;font-size: 14.0px;">PTS</span><span style="font-family: microsoft yahei;font-size: 14.0px;">提供，只需要购买服务</span></span><span style="font-family: 宋体;"></span> 
</p>
</td>
</tr>
<tr>
<td style="border: solid windowtext 1.0pt;" valign="top" width="113">
<p style="text-align: left;text-indent: 0.0cm;" align="left">
<span style="font-family: microsoft yahei;font-size: 14.0px;">费用</span><span style="font-family: 宋体;"></span> 
</p>
</td>
<td valign="top" width="122">
<p style="text-indent: 0.0cm;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">费用</span><span></span> 
</p>
</td>
<td valign="top" width="141">
<p style="text-indent: 0.0cm;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">非常贵</span><span></span> 
</p>
</td>
<td valign="top" width="118">
<p style="text-indent: 0.0cm;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">便宜，按需收费</span><span></span> 
</p>
</td>
<td valign="top" width="181">
<p style="text-indent: 0.0cm;">
<span style="font-family: 宋体;"><span style="font-family: microsoft yahei;font-size: 14.0px;">商业化工具</span><span style="font-family: microsoft yahei;font-size: 14.0px;">License</span><span style="font-family: microsoft yahei;font-size: 14.0px;">非常贵</span></span><span></span> 
</p>
</td>
</tr>
<tr>
<td style="border: solid windowtext 1.0pt;" valign="top" width="113">
<p style="text-align: left;text-indent: 0.0cm;" align="left">
<span style="font-family: 宋体;"><span style="font-family: microsoft yahei;font-size: 14.0px;">功能</span><span></span></span> 
</p>
</td>
<td valign="top" width="122">
<p style="text-indent: 0.0cm;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">功能</span><span></span> 
</p>
</td>
<td valign="top" width="141">
<p style="text-indent: 0.0cm;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">强大</span><span></span> 
</p>
</td>
<td valign="top" width="118">
<p style="text-indent: 0.0cm;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">较强大</span><span></span> 
</p>
</td>
<td valign="top" width="181">
<p style="text-indent: 0.0cm;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">LR</span><span style="font-family: microsoft yahei;font-size: 14.0px;">很多功能基本上用不到，没必要大马拉小车</span><span></span> 
</p>
</td>
</tr>
<tr>
<td style="border: solid windowtext 1.0pt;" valign="top" width="113">
<p style="text-align: left;text-indent: 0.0cm;" align="left">
<span style="font-family: microsoft yahei;font-size: 14.0px;">易用性</span><span></span> 
</p>
</td>
<td valign="top" width="122">
<p style="text-indent: 0.0cm;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">操作、学习等</span><span></span> 
</p>
</td>
<td valign="top" width="141">
<p style="text-indent: 0.0cm;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">困难</span><span></span> 
</p>
</td>
<td valign="top" width="118">
<p style="text-indent: 0.0cm;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">容易</span><span></span> 
</p>
</td>
<td valign="top" width="181">
<p style="text-indent: 0.0cm;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">LR</span><span style="font-family: microsoft yahei;font-size: 14.0px;">不易上手</span><span></span> 
</p>
</td>
</tr>
<tr>
<td style="border: solid windowtext 1.0pt;" valign="top" width="113">
<p style="text-align: left;text-indent: 0.0cm;" align="left">
<span style="font-family: microsoft yahei;font-size: 14.0px;">稳定性</span><span></span> 
</p>
</td>
<td valign="top" width="122">
<p style="text-indent: 0.0cm;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">系统稳定性</span><span></span> 
</p>
</td>
<td valign="top" width="141">
<p style="text-indent: 0.0cm;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">较稳定</span><span></span> 
</p>
</td>
<td valign="top" width="118">
<p style="text-indent: 0.0cm;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">非常稳定</span><span></span> 
</p>
</td>
<td valign="top" width="181">
<p style="text-indent: 0.0cm;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">LR</span><span style="font-family: microsoft yahei;font-size: 14.0px;">压测过程中经常出现莫名其妙错误</span><span></span> 
</p>
</td>
</tr>
<tr>
<td style="border: solid windowtext 1.0pt;" valign="top" width="113">
<p style="text-align: left;text-indent: 0.0cm;" align="left">
<span style="font-family: microsoft yahei;font-size: 14.0px;">场景模拟</span><span></span> 
</p>
</td>
<td valign="top" width="122">
<p style="text-indent: 0.0cm;">
<span style="font-family: 宋体;"><span style="font-family: microsoft yahei;font-size: 14.0px;">场景模拟</span><span></span></span> 
</p>
<p style="text-indent: 0.0cm;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">条件</span><span style="font-family: 宋体;"></span> 
</p>
</td>
<td valign="top" width="141">
<p style="text-indent: 0.0cm;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">较真实</span><span style="font-family: 宋体;"></span> 
</p>
</td>
<td valign="top" width="118">
<p style="text-indent: 0.0cm;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">非常真实</span><span style="font-family: 宋体;"></span> 
</p>
</td>
<td valign="top" width="181">
<p style="text-indent: 0.0cm;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">PTS</span><span style="font-family: 宋体;"><span style="font-family: microsoft yahei;font-size: 14.0px;">分布在全国各地的分布式集群可以真实模拟出现实场景，而</span><span style="font-family: microsoft yahei;font-size: 14.0px;">LR</span><span style="font-family: microsoft yahei;font-size: 14.0px;">不太容易模拟，即使可以的话，控制机和压力机通信经常掉线</span></span><span style="font-family: 宋体;"></span> 
</p>
</td>
</tr>
</tbody>
</table>
<p style="margin-left: 21.0pt;text-indent: 0.0cm;">
<span style="font-family: microsoft yahei;font-size: 14.0px;">&nbsp;</span> 
</p>
<h1 style="margin-left: 21.0pt;text-indent: -21.0pt;">
<span><span><span style="font-family: microsoft yahei;font-size: 14.0px;">9.</span><span style="font-family: microsoft yahei;font-size: 14.0px;">&nbsp; </span></span></span><span style="font-family: microsoft yahei;font-size: 14.0px;">总结</span><span></span> 
</h1>
<p style="margin-left: 42.0pt;text-indent: -21.0pt;">
<span style="font-family: wingdings;"><span><span style="font-family: microsoft yahei;font-size: 14.0px;">&#216;</span><span style="font-family: microsoft yahei;font-size: 14.0px;">&nbsp; </span></span></span><span style="font-family: microsoft yahei;font-size: 14.0px;">系统的性能由</span><span style="font-family: microsoft yahei;font-size: 14.0px;">TPS</span><span style="font-family: microsoft yahei;font-size: 14.0px;">决定，跟并发用户数没有多大关系。在同样的</span><span style="font-family: microsoft yahei;font-size: 14.0px;">TPS</span><span style="font-family: microsoft yahei;font-size: 14.0px;">下，可以由不同的用户数去压（通过加思考时间设置）。</span><span></span> 
</p>
<p style="margin-left: 42.0pt;text-indent: -21.0pt;">
<span style="font-family: wingdings;"><span><span style="font-family: microsoft yahei;font-size: 14.0px;">&#216;</span><span style="font-family: microsoft yahei;font-size: 14.0px;">&nbsp; </span></span></span><span style="font-family: microsoft yahei;font-size: 14.0px;">系统的最大</span><span style="font-family: microsoft yahei;font-size: 14.0px;">TPS</span><span style="font-family: microsoft yahei;font-size: 14.0px;">是一定的（在一个范围内），但并发用户数不一定，可以调整。</span><span></span> 
</p>
<p style="margin-left: 42.0pt;text-indent: -21.0pt;">
<span style="font-family: wingdings;"><span><span style="font-family: microsoft yahei;font-size: 14.0px;">&#216;</span><span style="font-family: microsoft yahei;font-size: 14.0px;">&nbsp; </span></span></span><span style="font-family: microsoft yahei;font-size: 14.0px;">建议性能测试的时候，不要设置过长的思考时间，以最坏的情况下对服务器施压。</span><span></span> 
</p>
<p style="margin-left: 42.0pt;text-indent: -21.0pt;">
<span style="font-family: wingdings;"><span><span style="font-family: microsoft yahei;font-size: 14.0px;">&#216;</span><span style="font-family: microsoft yahei;font-size: 14.0px;">&nbsp; </span></span></span><span style="font-family: microsoft yahei;font-size: 14.0px;">一般情况下，大型系统（业务量大、机器多）做压力测试，</span><span style="font-family: microsoft yahei;font-size: 14.0px;">5000</span><span style="font-family: microsoft yahei;font-size: 14.0px;">个用户并发就够了，中小型系统做压力测试，</span><span style="font-family: microsoft yahei;font-size: 14.0px;">1000</span><span style="font-family: microsoft yahei;font-size: 14.0px;">个用户并发就足够了。</span><span></span> 
</p> </div>
<img src ="http://www.cnitblog.com/stomic/aggbug/90345.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2016-01-14 00:42 <a href="http://www.cnitblog.com/stomic/archive/2016/01/14/90345.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转）Servlet调用流程</title><link>http://www.cnitblog.com/stomic/archive/2016/01/04/90334.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Mon, 04 Jan 2016 08:14:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2016/01/04/90334.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/90334.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2016/01/04/90334.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/90334.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/90334.html</trackback:ping><description><![CDATA[<div id="article_content" class="article_content">
<p><span style="font-size:14px">首先说说我们的<strong>Tomcat7.0的目录结构</strong>：</span></p>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 包括目录：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bin </span></p>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conf</span></p>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lib</span></p>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logs</span></p>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp</span></p>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;webapps</span></p>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; work</span></p>
<p><span style="font-size:14px">&nbsp;</span></p>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bin文件：</span></p>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 存放各种平台下启动和关闭Tomcat的脚本文件。</span></p>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;startup.bat是windows下启动tomcat的文件。</span></p>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shutdown.bat是关闭tomcat的文件。</span></p>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conf目录：</span></p>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Tomcat的各种配置文件，tomcat启动时需要读取的配置文件：server.xml</span></p>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lib目录：</span></p>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 存放Tomcat所需的各种jar文件。</span></p>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logs目录：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 存放Tomcat的日志文件。</span></p>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp目录：</span></p>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 临时文件目录，用于存放Tomcat运行时的临时文件。</span></p>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; webapps目录：</span></p>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;web应用的发布目录，把java编写的web应用或打包成的war格式的web应用文件放入该目录下，就能通过Tomcat服务器访问了。</span></p>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;work目录：</span></p>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Tomcat把JSP文件编译生成Servlet文件存放在这个目录下。</span></p>
<p><span style="font-size:14px">&nbsp;</span></p>
<p><span style="font-size:14px">数据传送流程：</span></p>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img alt="" src="http://img.blog.csdn.net/20130527165449283" /></span></p>
<p><span style="font-size:14px">&nbsp;&nbsp; </span></p>
<p><span style="font-size:14px"><strong>java servlet</strong>：</span></p>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们要在webapps目录下建立一个我们javaweb项目的目录结构test_servlet：</span></p>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WEB-INF/classes web.xml lib&nbsp; </span></p>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lib文件：存放java包，数据库驱动程序等等。</span></p>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; classes文件：存放已编译好的类。</span></p>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Web.Xml：配置一些信息，例如Servlet的配置，名字，路径等，告诉我们的Tomcat我们使用的哪个Servlet。</span></p>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们依次来写：</span></p>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; servlet代码：</span></p>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<div class="dp-highlighter bg_java"><div class="bar" style="display: block;"><div class="tools"><strong>[java]</strong> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a><div style="position: absolute; left: 465px; top: 2369px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_1" align="center" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=1&amp;width=27&amp;height=15" wmode="transparent"></div></div></div><ol start="1" class="dp-j"><li class="alt"><span><span>&lt;span&nbsp;style=</span><span class="string">"font-size:14px;"</span><span>&gt;</span><span class="comment">//引入java的包。</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span><span class="keyword">import</span><span>&nbsp;javax.servlet.http.*;&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="keyword">import</span><span>&nbsp;java.io.*;&nbsp;&nbsp;</span></span></li><li class=""><span><span class="keyword">import</span><span>&nbsp;javax.servlet.*;&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="comment">//第一个Servlet程序。</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;LoginServlet&nbsp;</span><span class="keyword">extends</span><span>&nbsp;HttpServlet&nbsp;&nbsp;</span></span></li><li class="alt"><span>{&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//指定调用哪个servlet。</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//get提交和post提交两种方式。</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;doGet(HttpServletRequest&nbsp;request,HttpServletResponse&nbsp;response)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;ServletException,IOException&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//取得客户端的数据。</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;username&nbsp;=&nbsp;request.getParameter(<span class="string">"username"</span><span>);&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;password&nbsp;=&nbsp;request.getParameter(<span class="string">"password"</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">"username"</span><span>&nbsp;+&nbsp;username);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">"password"</span><span>&nbsp;+&nbsp;password);&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//向浏览器上写数据。可以有流。字符流。</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//setContext设置响应的内容类型。设置为html类型或者中文。</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.setContentType(<span class="string">"text/html;charset=GB18030"</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//response.getWriter().println("Login&nbsp;Success!!!");</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//response.getWriter().println("登录成功!!!");</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.getWriter().println(<span class="string">"&lt;html&gt;"</span><span>);&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.getWriter().println(<span class="string">"&lt;head&gt;"</span><span>);&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.getWriter().println(<span class="string">"&lt;title&gt;登录信息&lt;/title&gt;"</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.getWriter().println(<span class="string">"&lt;/head&gt;"</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.getWriter().println(<span class="string">"&lt;body&gt;"</span><span>);&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.getWriter().println(<span class="string">"欢迎【"</span><span>&nbsp;+&nbsp;username&nbsp;+&nbsp;</span><span class="string">"】登录成功！！！"</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.getWriter().println(<span class="string">"&lt;/body&gt;"</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.getWriter().println(<span class="string">"&lt;/html&gt;"</span><span>);&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//采用post的提交方式。</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;doPost(HttpServletRequest&nbsp;request,HttpServletResponse&nbsp;response)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;ServletException,IOException&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doGet(request,response);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>}&lt;/span&gt;&nbsp;&nbsp;</span></li></ol></div><pre class="java" name="code" style="display: none;"><span style="font-size:14px;">//引入java的包。
import javax.servlet.http.*;
import java.io.*;
import javax.servlet.*;
//第一个Servlet程序。
public class LoginServlet extends HttpServlet
{
//指定调用哪个servlet。
//get提交和post提交两种方式。
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException
{
//取得客户端的数据。
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("username" + username);
System.out.println("password" + password);
//向浏览器上写数据。可以有流。字符流。
//setContext设置响应的内容类型。设置为html类型或者中文。
response.setContentType("text/html;charset=GB18030");
//response.getWriter().println("Login Success!!!");
//response.getWriter().println("登录成功!!!");
response.getWriter().println("&lt;html&gt;");
response.getWriter().println("&lt;head&gt;");
response.getWriter().println("&lt;title&gt;登录信息&lt;/title&gt;");
response.getWriter().println("&lt;/head&gt;");
response.getWriter().println("&lt;body&gt;");
response.getWriter().println("欢迎【" + username + "】登录成功！！！");
response.getWriter().println("&lt;/body&gt;");
response.getWriter().println("&lt;/html&gt;");
}
//采用post的提交方式。
public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException
{
doGet(request,response);
}
}</span></pre>
<p><br />
<span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 虽然我们引入了jar包，但是程序是否能从找到tomcat的servlet&nbsp; jar包，我们需要配置一下用户的环境变量，把lib\servlet-api.jar包配置到classpath变量。当然tomcat也是java编码的，所以我们也配置一下JAVA_HOME变量，可以在tomcat的批处理命令startup.bat中进行配置，set JAVA_HOME=C:\Program Files\Java\jdk1.6.0_43。</span></p>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后把这个java文件编译成.class 文件，放到classes文件夹中。</span></p>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; html代码：</span></p>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<div class="dp-highlighter bg_html"><div class="bar" style="display: block;"><div class="tools"><strong>[html]</strong> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a><div style="position: absolute; left: 467px; top: 3219px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_2" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_2" align="center" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=2&amp;width=27&amp;height=15" wmode="transparent"></div></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">span</span><span>&nbsp;</span><span class="attribute">style</span><span>=</span><span class="attribute-value">"font-size:14px;"</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">html</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">head</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">title</span><span class="tag">&gt;</span><span>登录</span><span class="tag">&lt;/</span><span class="tag-name">title</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">head</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comments">&lt;!--这是绝对路径--&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comments">&lt;!--相对路径写法:action="LoginServlet"--&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">form</span><span>&nbsp;</span><span class="attribute">action</span><span>=</span><span class="attribute-value">"http://127.0.0.1:8080/test_servlet/LoginServlet"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用户：<span class="tag">&lt;</span><span class="tag-name">input</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">"text"</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"username"</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">br</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;密码：<span class="tag">&lt;</span><span class="tag-name">input</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">"password"</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"password"</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">br</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">input</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">"submit"</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">"登录"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">form</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span><span class="tag">&lt;/</span><span class="tag-name">html</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">span</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li></ol></div><pre class="html" name="code" style="display: none;"><span style="font-size:14px;">&lt;html&gt;
&lt;head&gt;
&lt;title&gt;登录&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;!--这是绝对路径--&gt;
&lt;!--相对路径写法:action="LoginServlet"--&gt;
&lt;form action="http://127.0.0.1:8080/test_servlet/LoginServlet"&gt;
用户：&lt;input type="text" name="username"&gt;&lt;br&gt;
密码：&lt;input type="password" name="password"&gt;&lt;br&gt;
&lt;input type="submit" value="登录"&gt;
&lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</span></pre>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Web.Xml :</span></p>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<div class="dp-highlighter bg_html"><div class="bar" style="display: block;"><div class="tools"><strong>[html]</strong> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a><div style="position: absolute; left: 467px; top: 3543px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_3" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_3" align="center" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=3&amp;width=27&amp;height=15" wmode="transparent"></div></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">span</span><span>&nbsp;</span><span class="attribute">style</span><span>=</span><span class="attribute-value">"font-size:14px;"</span><span class="tag">&gt;</span><span class="tag">&lt;?</span><span class="tag-name">xml</span><span>&nbsp;</span><span class="attribute">version</span><span>=</span><span class="attribute-value">"1.0"</span><span>&nbsp;</span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">"ISO-8859-1"</span><span class="tag">?&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">web-app</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">"http://java.sun.com/xml/ns/javaee"</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;<span class="attribute">xmlns:xsi</span><span>=</span><span class="attribute-value">"http://www.w3.org/2001/XMLSchema-instance"</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;<span class="attribute">xsi:schemaLocation</span><span>="http://java.sun.com/xml/ns/javaee&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;<span class="attribute">version</span><span>=</span><span class="attribute-value">"3.0"</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;<span class="attribute">metadata-complete</span><span>=</span><span class="attribute-value">"true"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">servlet</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">servlet-name</span><span class="tag">&gt;</span><span>MyServlet</span><span class="tag">&lt;/</span><span class="tag-name">servlet-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">servlet-class</span><span class="tag">&gt;</span><span>LoginServlet</span><span class="tag">&lt;/</span><span class="tag-name">servlet-class</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">servlet</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">servlet-mapping</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">servlet-name</span><span class="tag">&gt;</span><span>MyServlet</span><span class="tag">&lt;/</span><span class="tag-name">servlet-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">url-pattern</span><span class="tag">&gt;</span><span>/LoginServlet</span><span class="tag">&lt;/</span><span class="tag-name">url-pattern</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">servlet-mapping</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">web-app</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">span</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li></ol></div><pre class="html" name="code" style="display: none;"><span style="font-size:14px;">&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;
&lt;web-app xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  version="3.0"
  metadata-complete="true"&gt;
    &lt;servlet&gt;
&lt;servlet-name&gt;MyServlet&lt;/servlet-name&gt;
&lt;servlet-class&gt;LoginServlet&lt;/servlet-class&gt;
&lt;/servlet&gt;
&lt;servlet-mapping&gt;
&lt;servlet-name&gt;MyServlet&lt;/servlet-name&gt;
&lt;url-pattern&gt;/LoginServlet&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;
&lt;/web-app&gt;</span></pre>
<p><br />
<span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 启动Tomcat就可以执行成功。</span></p>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面是servlet的调用过程,也可以用HTTPLook软件来跟踪：</span></p>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img alt="" src="http://img.blog.csdn.net/20130527165907754" /></span></p>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src="http://img.blog.csdn.net/20130527173727374" alt="" /></span></p>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;作为一个java的初学者来说，开始一个servlet让我很模糊，什么是servlet呢？有道上说是servlet（小服务程序），学过了发现，也是26个英文字母的组合，其实说白了就是java代码，但是因为他的用途，人们给他抽象总结了一个层次，叫做servlet，。就相当于县长首先是人，再是县长~，貌似搞得这儿复杂~不也是个干活的么~</span></p>
<p><span style="font-size:14px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 同样是网页，.net开发的网页和java开发的有什么区别呢？.net中有没有servlet？据说.cs文件写&#8220;servlet&#8221;就相当于servlet了。呵呵，有待更深的研究，加油！</span></p>
<p><span style="font-size:14px">&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;&nbsp;&nbsp;&nbsp; </span><span style="font-size:18px"></span></p>
</div>
<img src ="http://www.cnitblog.com/stomic/aggbug/90334.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2016-01-04 16:14 <a href="http://www.cnitblog.com/stomic/archive/2016/01/04/90334.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转）初学Redis（4）——简单实现Redis缓存中的排序功能</title><link>http://www.cnitblog.com/stomic/archive/2015/12/25/90330.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Thu, 24 Dec 2015 18:02:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2015/12/25/90330.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/90330.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2015/12/25/90330.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/90330.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/90330.html</trackback:ping><description><![CDATA[<div id="article_content" class="article_content">
<p><span style="font-size:18px">&nbsp; &nbsp; &nbsp; &nbsp; 在实现缓存排序功能之前，必须先明白这一功能的合理性。不妨思考一下，既然可以在数据库中排序，为什么还要把排序功能放在缓存中实现呢？这里简单总结了两个原因：首先，排序会增加数据库的负载，难以支撑高并发的应用；其次，在缓存中排序不会遇到表锁定的问题。Redis恰好提供了排序功能，使我们可以方便地实现缓存排序。</span></p>
<p><span style="font-size:18px">&nbsp; &nbsp; &nbsp; &nbsp; Redis中用于实现排序功能的是SORT命令。该命令提供了多种参数，可以对列表，集合和有序集合进行排序。SORT命令格式如下：</span></p>
<p><span style="font-size:18px"></span></p>
<div class="dp-highlighter bg_plain"><div class="bar"><div class="tools"><strong>[plain]</strong> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a><div style="position: absolute; left: 444px; top: 674px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_1" align="center" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=1&amp;width=18&amp;height=18" wmode="transparent"></div></div></div><ol start="1"><li class="alt"><span><span>SORT&nbsp;key&nbsp;[BY&nbsp;pattern]&nbsp;[LIMIT&nbsp;offset&nbsp;count]&nbsp;[GET&nbsp;pattern&nbsp;[GET&nbsp;pattern&nbsp;...]]&nbsp;[ASC&nbsp;|&nbsp;DESC]&nbsp;[ALPHA]&nbsp;[STORE&nbsp;destination]&nbsp;&nbsp;</span></span></li></ol></div><pre name="code" class="plain" style="display: none;">SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC | DESC] [ALPHA] [STORE destination]</pre><br />
&nbsp; &nbsp; &nbsp; &nbsp; BY参数用于指定排序字段，功能类似于SQL中的order by。对于列表和集合而言，仅按照它们的值进行排序往往没有实际意义。以函数Cache2Hash返回的集合为例（实际上返回的是集合键），该集合中存储的是一系列完整的哈希键，只按照这些键进行排序，结果无非是按照数字或字典顺序排列，其用处显然不大。这是因为真正存储行数据的是哈希结构本身，而非哈希键。假设集合键为"resultset.hash:123456"，集合中每个哈希键对应的哈希结构中都有一个名为&#8220;timestamp&#8221;的字段，现在要把集合中的所有哈希键按照timestamp字段进行排序，这时，只需执行以下命令：
<p>&nbsp;</p>
<p><span style="font-size:18px"></span></p>
<div class="dp-highlighter bg_plain"><div class="bar"><div class="tools"><strong>[plain]</strong> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a><div style="position: absolute; left: 444px; top: 891px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_2" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_2" align="center" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=2&amp;width=18&amp;height=18" wmode="transparent"></div></div></div><ol start="1"><li class="alt"><span><span>SORT&nbsp;resultset.hash:123456&nbsp;BY&nbsp;*-&gt;timestamp&nbsp;&nbsp;</span></span></li></ol></div><pre name="code" class="plain" style="display: none;">SORT resultset.hash:123456 BY *-&gt;timestamp</pre><br />
&nbsp; &nbsp; &nbsp; &nbsp; 从上例可以看出，BY的真正威力在于它可以让SORT命令按照一个指定的外部键的外部字段进行排序。SORT用集合<span style="font-size:18px">resultset.hash:123456中的每个值（即每个哈希键）替换BY参数后的第一个&#8220;*&#8221;，并依据&#8220;-&gt;&#8221;后面给出的字段获取其值，最后根据这些字段值对哈希键进行排序。</span>
<p>&nbsp;</p>
<p><span style="font-size:18px"><span style="font-size:18px">&nbsp; &nbsp; &nbsp; &nbsp; LIMIT参数用于限制排序以后返回元素的数量，功能类似于SQL中的limit。该参数接受另外两个参数，即offset和count，LIMIT offset count表示跳过前offset个元素，返回之后的连续count个元素。可见，LIMIT参数可以用于实现分页功能。</span></span></p>
<p><span style="font-size:18px"><span style="font-size:18px">&nbsp; &nbsp; &nbsp; &nbsp; GET参数用于返回指定的字段值。以集合<span style="font-size:18px">resultset.hash:123456为例，使用BY参数对集合中的所有哈希键按照哈希结构中的timestamp字段排序后，SORT命令返回所有排序之后的哈希键。如果某个请求需要不是键而是某些字段值，这时就要使用GET参数，使SORT命令返回指定字段值。假设除timestamp字段以外，<span style="font-size:18px">集合中每个哈希键对应的哈希结构中还有一个名为&#8220;id&#8221;的字段，通过以下命令可以使SORT返回按照timestamp排序以后的每个哈希键对应的哈希结构中的timestamp和id值：</span></span></span></span></p>
<p><span style="font-size:18px"><span style="font-size:18px"><span style="font-size:18px"><span style="font-size:18px"></span></span></span></span></p>
<div class="dp-highlighter bg_plain"><div class="bar"><div class="tools"><strong>[plain]</strong> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a><a href="https://code.csdn.net/snippets/475033" target="_blank" title="在CODE上查看代码片" style="text-indent:0;"><img src="https://code.csdn.net/assets/CODE_ico.png" width="12" height="12" alt="在CODE上查看代码片" style="position:relative;top:1px;left:2px;" /></a><a href="https://code.csdn.net/snippets/475033/fork" target="_blank" title="派生到我的代码片" style="text-indent:0;"><img src="https://code.csdn.net/assets/ico_fork.svg" width="12" height="12" alt="派生到我的代码片" style="position:relative;top:2px;left:2px;" /></a><div style="position: absolute; left: 444px; top: 1291px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_3" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_3" align="center" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=3&amp;width=18&amp;height=18" wmode="transparent"></div></div></div><ol start="1"><li class="alt"><span><span>SORT&nbsp;resultset.hash:123456&nbsp;BY&nbsp;*-&gt;timestamp&nbsp;GET&nbsp;*-&gt;timestamp&nbsp;GET&nbsp;*-&gt;id&nbsp;&nbsp;</span></span></li></ol></div><pre code_snippet_id="475033" snippet_file_name="blog_20140925_3_4745967" name="code" class="plain" style="display: none;">SORT resultset.hash:123456 BY *-&gt;timestamp GET *-&gt;timestamp GET *-&gt;id</pre><br />
&nbsp; &nbsp; &nbsp; &nbsp; SORT用<span style="font-size:18px">集合</span><span style="font-size:18px">resultset.hash:123456中的每个值（即每个哈希键）替换GET参数之后的第一个&#8220;*&#8221;，并将其作为返回值。值得注意的是，利用GET #能够得到集合中的哈希键本身。</span>
<p>&nbsp;</p>
<p><span style="font-size:18px"><span style="font-size:18px"><span style="font-size:18px"><span style="font-size:18px"><span style="font-size:18px">&nbsp; &nbsp; &nbsp; &nbsp; ASC和DESC参数用于指定排序顺序（默认为ASC，即从低到高），ALPHA参数用于按照字典顺序排列非数字元素。</span></span></span></span></span></p>
<p><span style="font-size:18px"><span style="font-size:18px"><span style="font-size:18px"><span style="font-size:18px"><span style="font-size:18px">&nbsp; &nbsp; &nbsp; &nbsp; STORE参数用于将SORT命令的返回值，即排序结果存入一个指定的列表。加上STORE参数后，SORT命令的返回值就变为排序结果的个数。</span></span></span></span></span></p>
<p><span style="font-size:18px"><span style="font-size:18px"><span style="font-size:18px"><span style="font-size:18px"><span style="font-size:18px">&nbsp; &nbsp; &nbsp; &nbsp; 下面的代码实现了按照哈希的某个字段对集合中的哈希键排序，并将结果存入列表的过程：</span></span></span></span></span></p>
<p><span style="font-size:18px"><span style="font-size:18px"><span style="font-size:18px"><span style="font-size:18px"><span style="font-size:18px"></span></span></span></span></span></p>
<div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><strong>[cpp]</strong> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a><a href="https://code.csdn.net/snippets/475033" target="_blank" title="在CODE上查看代码片" style="text-indent:0;"><img src="https://code.csdn.net/assets/CODE_ico.png" width="12" height="12" alt="在CODE上查看代码片" style="position:relative;top:1px;left:2px;" /></a><a href="https://code.csdn.net/snippets/475033/fork" target="_blank" title="派生到我的代码片" style="text-indent:0;"><img src="https://code.csdn.net/assets/ico_fork.svg" width="12" height="12" alt="派生到我的代码片" style="position:relative;top:2px;left:2px;" /></a><div style="position: absolute; left: 434px; top: 1587px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_4" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_4" align="center" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=4&amp;width=18&amp;height=18" wmode="transparent"></div></div></div><ol start="1" class="dp-cpp"><li class="alt"><span><span class="comment">//&nbsp;该函数对集合中的所有HASH键进行排序，排序依据是HASH键所对应的HASH中的某个字段，</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span><span class="comment">//&nbsp;排序结果被存入一个LIST结构，LIST键应当包含结果集标识符和排序字段标识符，</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="comment">//&nbsp;形如&#8220;sorted:123456:1234&#8221;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>string&nbsp;SortHash(sql::Connection&nbsp;*mysql_connection,&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redisContext&nbsp;*redis_connection,&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">const</span><span>&nbsp;string&nbsp;&amp;resultset_id,&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">const</span><span>&nbsp;string&nbsp;&amp;sort_field,&nbsp;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="datatypes">int</span><span>&nbsp;offset,&nbsp;</span><span class="datatypes">int</span><span>&nbsp;count,&nbsp;</span><span class="datatypes">int</span><span>&nbsp;order,&nbsp;</span><span class="datatypes">int</span><span>&nbsp;ttl)&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;<span class="comment">//&nbsp;只考虑存储HASH键的SET</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;string&nbsp;redis_row_set_key&nbsp;=&nbsp;<span class="string">"resultset.hash:"</span><span>&nbsp;+&nbsp;resultset_id;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;redisReply&nbsp;*reply;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;<span class="comment">//&nbsp;检测SET是否存在</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;reply&nbsp;=&nbsp;<span class="keyword">static_cast</span><span>&lt;redisReply*&gt;(redisCommand(redis_connection,&nbsp;&nbsp;&nbsp;</span></span></li><li class=""><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"EXISTS&nbsp;%s"</span><span>,&nbsp;&nbsp;</span></span></li><li class="alt"><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_row_set_key.c_str()));&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(reply-&gt;integer&nbsp;==&nbsp;0)&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;freeReplyObject(reply);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">throw</span><span>&nbsp;runtime_error(</span><span class="string">"FAILURE&nbsp;-&nbsp;no&nbsp;resultsets"</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;}&nbsp;<span class="keyword">else</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;freeReplyObject(reply);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;string&nbsp;field_md5&nbsp;=&nbsp;md5(sort_field);&nbsp;&nbsp;<span class="comment">//&nbsp;利用MD5排除排序字段中空格造成的影响&nbsp;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;<span class="comment">//&nbsp;将排序结果存入该LIST</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;string&nbsp;redis_sorted_list_key&nbsp;=&nbsp;<span class="string">"sorted:"</span><span>&nbsp;+&nbsp;resultset_id&nbsp;+&nbsp;</span><span class="string">":"</span><span>&nbsp;+&nbsp;field_md5;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;string&nbsp;by(<span class="string">"*-&gt;"</span><span>&nbsp;+&nbsp;sort_field);&nbsp;&nbsp;</span><span class="comment">//确定排序字段</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;string&nbsp;ord&nbsp;=&nbsp;(order&nbsp;==&nbsp;1)&nbsp;?&nbsp;<span class="string">"ASC"</span><span>&nbsp;:&nbsp;</span><span class="string">"DESC"</span><span>;&nbsp;&nbsp;</span><span class="comment">//order==1时按照升序排列；否则为降序</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;stringstream&nbsp;ofsstream,&nbsp;cntstream;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;ofsstream&nbsp;&lt;&lt;&nbsp;offset;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;cntstream&nbsp;&lt;&lt;&nbsp;count;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;<span class="comment">//&nbsp;执行排序命令，并把排序结果存入LIST</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;reply&nbsp;=&nbsp;<span class="keyword">static_cast</span><span>&lt;redisReply*&gt;(redisCommand(&nbsp;&nbsp;</span></span></li><li class=""><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_connection,&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"SORT&nbsp;%s&nbsp;BY&nbsp;%s&nbsp;LIMIT&nbsp;%s&nbsp;%s&nbsp;GET&nbsp;%s&nbsp;ALPHA&nbsp;STORE&nbsp;%s"</span><span>,&nbsp;&nbsp;</span></span></li><li class=""><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_row_set_key.c_str(),&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;by.c_str(),&nbsp;&nbsp;&nbsp;</span></li><li class=""><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ofsstream.str().c_str(),&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cntstream.str().c_str(),&nbsp;&nbsp;&nbsp;</span></li><li class=""><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"#"</span><span>,&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_sorted_list_key.c_str()));&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;freeReplyObject(reply);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;stringstream&nbsp;ttlstream;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;ttlstream&nbsp;&lt;&lt;&nbsp;ttl;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;<span class="comment">//&nbsp;设置LIST的过期时间</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;reply&nbsp;=&nbsp;<span class="keyword">static_cast</span><span>&lt;redisReply*&gt;(redisCommand(redis_connection,&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"EXPIRE&nbsp;%s&nbsp;%s"</span><span>,&nbsp;&nbsp;</span></span></li><li class=""><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_sorted_list_key.c_str(),&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ttlstream.str().c_str()));&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;freeReplyObject(reply);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;redis_sorted_list_key;&nbsp;&nbsp;</span><span class="comment">//&nbsp;返回LIST键，以便于其他函数获取该LIST中的内容</span><span>&nbsp;&nbsp;</span></span></li></ol></div><pre code_snippet_id="475033" snippet_file_name="blog_20140925_4_6633341" name="code" class="cpp" style="display: none;">// 该函数对集合中的所有HASH键进行排序，排序依据是HASH键所对应的HASH中的某个字段，
// 排序结果被存入一个LIST结构，LIST键应当包含结果集标识符和排序字段标识符，
// 形如&#8220;sorted:123456:1234&#8221;
string SortHash(sql::Connection *mysql_connection,
                redisContext *redis_connection, 
                const string &amp;resultset_id, 
                const string &amp;sort_field, 
                int offset, int count, int order, int ttl) {
  // 只考虑存储HASH键的SET
  string redis_row_set_key = "resultset.hash:" + resultset_id;
  redisReply *reply;
  // 检测SET是否存在
  reply = static_cast&lt;redisReply*&gt;(redisCommand(redis_connection, 
                                               "EXISTS %s",
                                               redis_row_set_key.c_str()));
  if (reply-&gt;integer == 0) {
    freeReplyObject(reply);
    throw runtime_error("FAILURE - no resultsets");
  } else {
    freeReplyObject(reply);
  }
  string field_md5 = md5(sort_field);  // 利用MD5排除排序字段中空格造成的影响 
  // 将排序结果存入该LIST
  string redis_sorted_list_key = "sorted:" + resultset_id + ":" + field_md5;
  string by("*-&gt;" + sort_field);  //确定排序字段
  string ord = (order == 1) ? "ASC" : "DESC";  //order==1时按照升序排列；否则为降序
  stringstream ofsstream, cntstream;
  ofsstream &lt;&lt; offset;
  cntstream &lt;&lt; count;
  // 执行排序命令，并把排序结果存入LIST
  reply = static_cast&lt;redisReply*&gt;(redisCommand(
                                      redis_connection, 
                                      "SORT %s BY %s LIMIT %s %s GET %s ALPHA STORE %s",
                                      redis_row_set_key.c_str(), 
                                      by.c_str(), 
                                      ofsstream.str().c_str(), 
                                      cntstream.str().c_str(), 
                                      "#", 
                                      redis_sorted_list_key.c_str()));
  freeReplyObject(reply);
  stringstream ttlstream;
  ttlstream &lt;&lt; ttl;
  // 设置LIST的过期时间
  reply = static_cast&lt;redisReply*&gt;(redisCommand(redis_connection, 
                                               "EXPIRE %s %s",
                       redis_sorted_list_key.c_str(), 
                                               ttlstream.str().c_str()));
  freeReplyObject(reply);
  return redis_sorted_list_key;  // 返回LIST键，以便于其他函数获取该LIST中的内容</pre><br />
&nbsp; &nbsp; &nbsp; &nbsp; 显然，对结果集中的哈希键进行排序要比对字符串键排序更加直观和方便。借助于排序函数，可以方便地实现在Redis中查询排序后的结果集，代码如下：
<p>&nbsp;</p>
<p><span style="font-size:18px"><span style="font-size:18px"><span style="font-size:18px"><span style="font-size:18px"><span style="font-size:18px"></span></span></span></span></span></p>
<div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><strong>[cpp]</strong> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a><a href="https://code.csdn.net/snippets/475033" target="_blank" title="在CODE上查看代码片" style="text-indent:0;"><img src="https://code.csdn.net/assets/CODE_ico.png" width="12" height="12" alt="在CODE上查看代码片" style="position:relative;top:1px;left:2px;" /></a><a href="https://code.csdn.net/snippets/475033/fork" target="_blank" title="派生到我的代码片" style="text-indent:0;"><img src="https://code.csdn.net/assets/ico_fork.svg" width="12" height="12" alt="派生到我的代码片" style="position:relative;top:2px;left:2px;" /></a><div style="position: absolute; left: 434px; top: 2616px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_5" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_5" align="center" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=5&amp;width=18&amp;height=18" wmode="transparent"></div></div></div><ol start="1" class="dp-cpp"><li class="alt"><span><span class="comment">//&nbsp;该函数根据sql语句和排序参数，在Redis中查询相应的结果集并进行排序，最后返回</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span><span class="comment">//&nbsp;排序之后的HASH键</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>vector&lt;string&gt;&nbsp;GetSortedCache(sql::Connection&nbsp;*mysql_connection,&nbsp;&nbsp;</span></li><li class=""><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;&nbsp;&nbsp;&nbsp;&nbsp;redisContext&nbsp;*redis_connection,&nbsp;&nbsp;</span></li><li class="alt"><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;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">const</span><span>&nbsp;string&nbsp;&amp;sql,&nbsp;</span><span class="keyword">const</span><span>&nbsp;string&nbsp;&amp;sort_field,&nbsp;&nbsp;&nbsp;</span></span></li><li class=""><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;&nbsp;&nbsp;&nbsp;&nbsp;<span class="datatypes">int</span><span>&nbsp;offset,&nbsp;</span><span class="datatypes">int</span><span>&nbsp;count,&nbsp;</span><span class="datatypes">int</span><span>&nbsp;order,&nbsp;</span><span class="datatypes">int</span><span>&nbsp;ttl)&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;vector&lt;string&gt;&nbsp;redis_row_key_vector;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;redisReply&nbsp;*reply;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;string&nbsp;resultset_id&nbsp;=&nbsp;md5(sql);&nbsp;&nbsp;<span class="comment">//&nbsp;结果集标识符</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;string&nbsp;field_md5&nbsp;=&nbsp;md5(sort_field);&nbsp;&nbsp;<span class="comment">//&nbsp;排序字段标识符</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;<span class="comment">//&nbsp;尝试获取LIST中的所有HASH键</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;string&nbsp;redis_sorted_list_key&nbsp;=&nbsp;<span class="string">"sorted:"</span><span>&nbsp;+&nbsp;resultset_id&nbsp;+&nbsp;</span><span class="string">":"</span><span>&nbsp;+&nbsp;field_md5;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;<span class="comment">//&nbsp;尝试获取LIST中的所有HASH键</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;reply&nbsp;=&nbsp;<span class="keyword">static_cast</span><span>&lt;redisReply*&gt;(redisCommand(redis_connection,&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"LRANGE&nbsp;%s&nbsp;%s&nbsp;%s"</span><span>,&nbsp;&nbsp;</span></span></li><li class=""><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_sorted_list_key.c_str(),&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"0"</span><span>,&nbsp;&nbsp;&nbsp;</span></span></li><li class=""><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"-1"</span><span>));&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(reply-&gt;type&nbsp;==&nbsp;REDIS_REPLY_ARRAY)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;如果LIST不存在，调用Cache2Hash函数从Mysql中拉取数据到Redis，然后调用SortHash函数</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;对结果集进行排序并将排序后的HASH键存入LIST</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(reply-&gt;elements&nbsp;==&nbsp;0)&nbsp;{&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;freeReplyObject(reply);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql::Statement&nbsp;*stmt&nbsp;=&nbsp;mysql_connection-&gt;createStatement();&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql::ResultSet&nbsp;*resultset&nbsp;=&nbsp;stmt-&gt;executeQuery(sql);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cache2Hash(mysql_connection,&nbsp;redis_connection,&nbsp;resultset,&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resultset_id,&nbsp;ttl);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_sorted_list_key&nbsp;=&nbsp;SortHash(mysql_connection,&nbsp;redis_connection,&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resultset_id,&nbsp;sort_field,&nbsp;offset,&nbsp;&nbsp;&nbsp;</span></li><li class=""><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count,&nbsp;order,&nbsp;ttl);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;再次尝试获取LIST中的所有HASH键</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reply&nbsp;=&nbsp;<span class="keyword">static_cast</span><span>&lt;redisReply*&gt;(redisCommand(&nbsp;&nbsp;</span></span></li><li class="alt"><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_connection,&nbsp;&nbsp;&nbsp;</span></li><li class=""><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"LRANGE&nbsp;%s&nbsp;%s&nbsp;%s"</span><span>,&nbsp;&nbsp;</span></span></li><li class="alt"><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_sorted_list_key.c_str(),&nbsp;&nbsp;&nbsp;</span></li><li class=""><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"0"</span><span>,&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"-1"</span><span>));&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">delete</span><span>&nbsp;resultset;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">delete</span><span>&nbsp;stmt;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;将LIST中的所有HASH键存入redis_row_key_vector中</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;redis_row_key;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(</span><span class="datatypes">int</span><span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;reply-&gt;elements;&nbsp;++i)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_row_key&nbsp;=&nbsp;reply-&gt;element[i]-&gt;str;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_row_key_vector.push_back(redis_row_key);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;freeReplyObject(reply);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;}&nbsp;<span class="keyword">else</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;freeReplyObject(reply);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">throw</span><span>&nbsp;runtime_error(</span><span class="string">"FAILURE&nbsp;-&nbsp;LRANGE&nbsp;error"</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;redis_row_key_vector;&nbsp;&nbsp;</span></span></li><li class="alt"><span>}&nbsp;&nbsp;</span></li></ol></div><pre code_snippet_id="475033" snippet_file_name="blog_20140925_5_1409871" name="code" class="cpp" style="display: none;">// 该函数根据sql语句和排序参数，在Redis中查询相应的结果集并进行排序，最后返回
// 排序之后的HASH键
vector&lt;string&gt; GetSortedCache(sql::Connection *mysql_connection,
                              redisContext *redis_connection,
                              const string &amp;sql, const string &amp;sort_field, 
                              int offset, int count, int order, int ttl) {
  vector&lt;string&gt; redis_row_key_vector;
  redisReply *reply;
  string resultset_id = md5(sql);  // 结果集标识符
  string field_md5 = md5(sort_field);  // 排序字段标识符
  // 尝试获取LIST中的所有HASH键
  string redis_sorted_list_key = "sorted:" + resultset_id + ":" + field_md5;
  // 尝试获取LIST中的所有HASH键
  reply = static_cast&lt;redisReply*&gt;(redisCommand(redis_connection, 
                                               "LRANGE %s %s %s",
                                               redis_sorted_list_key.c_str(), 
                                               "0", 
                                               "-1"));
  if (reply-&gt;type == REDIS_REPLY_ARRAY) {
    // 如果LIST不存在，调用Cache2Hash函数从Mysql中拉取数据到Redis，然后调用SortHash函数
    // 对结果集进行排序并将排序后的HASH键存入LIST
    if (reply-&gt;elements == 0) { 
      freeReplyObject(reply);
      sql::Statement *stmt = mysql_connection-&gt;createStatement();
      sql::ResultSet *resultset = stmt-&gt;executeQuery(sql);
      Cache2Hash(mysql_connection, redis_connection, resultset, 
                 resultset_id, ttl);
      redis_sorted_list_key = SortHash(mysql_connection, redis_connection, 
                                       resultset_id, sort_field, offset, 
                                       count, order, ttl);
      // 再次尝试获取LIST中的所有HASH键
      reply = static_cast&lt;redisReply*&gt;(redisCommand(
                                          redis_connection, 
                                          "LRANGE %s %s %s",
                                          redis_sorted_list_key.c_str(), 
                                          "0", 
                                          "-1"));
      delete resultset;
      delete stmt;
    }
    // 将LIST中的所有HASH键存入redis_row_key_vector中
    string redis_row_key;
    for (int i = 0; i &lt; reply-&gt;elements; ++i) {
      redis_row_key = reply-&gt;element[i]-&gt;str;
      redis_row_key_vector.push_back(redis_row_key);
    }
    freeReplyObject(reply);
  } else {
    freeReplyObject(reply);
    throw runtime_error("FAILURE - LRANGE error");
  }
  return redis_row_key_vector;
}</pre><br />
&nbsp; &nbsp; &nbsp; &nbsp; 这样，在Redis中对结果集进行简单排序操作的功能就实现了。
<p>&nbsp;</p>
</div>
<img src ="http://www.cnitblog.com/stomic/aggbug/90330.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2015-12-25 02:02 <a href="http://www.cnitblog.com/stomic/archive/2015/12/25/90330.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转）初学Redis（3）——用Redis作为Mysql数据库的缓存</title><link>http://www.cnitblog.com/stomic/archive/2015/12/25/90329.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Thu, 24 Dec 2015 17:47:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2015/12/25/90329.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/90329.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2015/12/25/90329.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/90329.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/90329.html</trackback:ping><description><![CDATA[<div id="article_content" class="article_content">
<p><span style="font-size:18px">&nbsp; &nbsp; &nbsp; &nbsp; 把Mysql结果集缓存到Redis的字符串或哈希结构中以后，我们面临一个新的问题，即如何为这些字符串或哈希命名，也就是如何确定它们的键。因为这些数据结构所对应的行都属于某个结果集，假如可以找到一种唯一标识结果集的方法，那么只需为这些数据结构分配一个唯一的序号，然后把结果集标识符与该序号结合起来，就能唯一标识一个数据结构了。于是，为字符串和哈希命名的问题就转化为确定结果集标识符的问题。</span></p>
<p><span style="font-size:18px">&nbsp; &nbsp; &nbsp; &nbsp; 经过调研，发现一种较为通用的确定结果集标识符的方法。正如我们所知道的，缓存在Redis中的结果集数据都是利用select等sql语句从Mysql中获取的。同样的查询语句会生成同样的结果集（这里暂时不讨论结果集中每条记录的顺序问题），这一性质刚好可以用来确定结果集的唯一标识符。当然，简单地把整个sql语句作为结果集标识符是不可取的，一个显而易见的理由是，未经处理的sql查询语句均包含若干空格，而Redis的键是不允许存在空格的。这时，我们需要一个可以把sql语句转换为唯一标识符的函数。通常，这一功能由散列函数完成，包括MD5，SHA系列等加密散列函数在内的很多算法均可达到这一目的。</span></p>
<p><span style="font-size:18px">&nbsp; &nbsp; &nbsp; &nbsp; 确定结果集标识符之后，从Redis读数据或向Redis写数据的思路就很清晰了。对于一个sql语句格式的数据请求，首先计算该语句的MD5并据此得到结果集标识符，然后利用该标识符在Redis中查找该结果集。注意，结果集中的每一行都有一个相应的键，这些键都存储在一个Redis集合结构中。这个集合恰好对应了所需的结果集，所以，该集合的键必须包含结果集标识符。如果Redis中不存在这样一个集合，说明要找的结果集不在Redis中，所以需要执行相应的sql语句，在Mysql中查询到相应的结果集，然后按照上面所说的办法把结果集中的每一行以字符串或哈希的形式存入Redis。在Redis中查找相应结果集的代码如下：</span></p>
<p><span style="font-size:18px"></span></p><div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><strong>[cpp]</strong> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a><div style="position: absolute; left: 434px; top: 960px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_1" align="center" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=1&amp;width=18&amp;height=18" wmode="transparent"></div></div></div><ol start="1" class="dp-cpp"><li class="alt"><span><span class="comment">//&nbsp;该函数根据sql语句在Redis中查询相应的结果集，并返回结果集中每一行所对应的数据结构的键</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>vector&lt;string&gt;&nbsp;GetCache(sql::Connection&nbsp;*mysql_connection,&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redisContext&nbsp;*redis_connection,&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">const</span><span>&nbsp;string&nbsp;&amp;sql,&nbsp;</span><span class="datatypes">int</span><span>&nbsp;ttl,&nbsp;</span><span class="datatypes">int</span><span>&nbsp;type)&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;vector&lt;string&gt;&nbsp;redis_row_key_vector;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;string&nbsp;resultset_id&nbsp;=&nbsp;md5(sql);&nbsp;&nbsp;<span class="comment">//&nbsp;计算sql语句的md5，这是唯一标识结果集的关键</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;<span class="comment">//&nbsp;type==1时，该函数将查询相应的STRING集合或将结果集写入若干STRING</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;string&nbsp;cache_type&nbsp;=&nbsp;(type&nbsp;==&nbsp;1)&nbsp;?&nbsp;<span class="string">"string"</span><span>&nbsp;:&nbsp;</span><span class="string">"hash"</span><span>;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;<span class="comment">//&nbsp;根据type信息和结果集标识符合成SET键</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;string&nbsp;redis_row_set_key&nbsp;=&nbsp;<span class="string">"resultset."</span><span>&nbsp;+&nbsp;cache_type&nbsp;+&nbsp;</span><span class="string">":"</span><span>&nbsp;+&nbsp;resultset_id;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;redisReply&nbsp;*reply;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;<span class="comment">//&nbsp;尝试从reply中获取SET中保存的所有键</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;reply&nbsp;=&nbsp;<span class="keyword">static_cast</span><span>&lt;redisReply*&gt;(redisCommand(redis_connection,&nbsp;&nbsp;&nbsp;</span></span></li><li class=""><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"SMEMBERS&nbsp;%s"</span><span>,&nbsp;&nbsp;</span></span></li><li class="alt"><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_row_set_key.c_str()));&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(reply-&gt;type&nbsp;==&nbsp;REDIS_REPLY_ARRAY)&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;如果要找的SET不存在，说明Redis中没有相应的结果集，需要调用Cache2String或</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;Cache2Hash函数把数据从Mysql拉取到Redis中</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(reply-&gt;elements&nbsp;==&nbsp;0)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;freeReplyObject(reply);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql::Statement&nbsp;*stmt&nbsp;=&nbsp;mysql_connection-&gt;createStatement();&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql::ResultSet&nbsp;*resultset&nbsp;=&nbsp;stmt-&gt;executeQuery(sql);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(type&nbsp;==&nbsp;1)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_row_set_key&nbsp;=&nbsp;Cache2String(mysql_connection,&nbsp;redis_connection,&nbsp;&nbsp;</span></li><li class="alt"><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resultset,&nbsp;resultset_id,&nbsp;ttl);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">else</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_row_set_key&nbsp;=&nbsp;Cache2Hash(mysql_connection,&nbsp;redis_connection,&nbsp;&nbsp;&nbsp;</span></li><li class=""><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resultset,&nbsp;resultset_id,&nbsp;ttl);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;再次尝试从reply中获取SET中保存的所有键</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reply&nbsp;=&nbsp;<span class="keyword">static_cast</span><span>&lt;redisReply*&gt;(redisCommand(redis_connection,&nbsp;&nbsp;&nbsp;</span></span></li><li class=""><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;&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 class="string">"SMEMBERS&nbsp;%s"</span><span>,&nbsp;&nbsp;</span></span></li><li class="alt"><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;&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;redis_row_set_key.c_str()));&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">delete</span><span>&nbsp;resultset;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">delete</span><span>&nbsp;stmt;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;把SET中的每个STRING或HASH键存入redis_row_key_vector中</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;redis_row_key;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(</span><span class="datatypes">int</span><span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;reply-&gt;elements;&nbsp;++i)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_row_key&nbsp;=&nbsp;reply-&gt;element[i]-&gt;str;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_row_key_vector.push_back(redis_row_key);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;freeReplyObject(reply);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;}&nbsp;<span class="keyword">else</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;freeReplyObject(reply);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">throw</span><span>&nbsp;runtime_error(</span><span class="string">"FAILURE&nbsp;-&nbsp;SMEMBERS&nbsp;error"</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;redis_row_key_vector;&nbsp;&nbsp;</span></span></li><li class="alt"><span>}&nbsp;&nbsp;</span></li></ol></div><pre name="code" class="cpp" style="display: none;">// 该函数根据sql语句在Redis中查询相应的结果集，并返回结果集中每一行所对应的数据结构的键
vector&lt;string&gt; GetCache(sql::Connection *mysql_connection,
                      redisContext *redis_connection,
                      const string &amp;sql, int ttl, int type) {
  vector&lt;string&gt; redis_row_key_vector;
  string resultset_id = md5(sql);  // 计算sql语句的md5，这是唯一标识结果集的关键
  // type==1时，该函数将查询相应的STRING集合或将结果集写入若干STRING
  string cache_type = (type == 1) ? "string" : "hash";
  // 根据type信息和结果集标识符合成SET键
  string redis_row_set_key = "resultset." + cache_type + ":" + resultset_id;
  redisReply *reply;
  // 尝试从reply中获取SET中保存的所有键
  reply = static_cast&lt;redisReply*&gt;(redisCommand(redis_connection, 
                                               "SMEMBERS %s",
                                               redis_row_set_key.c_str()));
  if (reply-&gt;type == REDIS_REPLY_ARRAY) {
// 如果要找的SET不存在，说明Redis中没有相应的结果集，需要调用Cache2String或
// Cache2Hash函数把数据从Mysql拉取到Redis中
    if (reply-&gt;elements == 0) {
      freeReplyObject(reply);
      sql::Statement *stmt = mysql_connection-&gt;createStatement();
      sql::ResultSet *resultset = stmt-&gt;executeQuery(sql);
      if (type == 1) {
        redis_row_set_key = Cache2String(mysql_connection, redis_connection,
                                         resultset, resultset_id, ttl);
      } else {
        redis_row_set_key = Cache2Hash(mysql_connection, redis_connection, 
                                       resultset, resultset_id, ttl);
      }
  // 再次尝试从reply中获取SET中保存的所有键
      reply = static_cast&lt;redisReply*&gt;(redisCommand(redis_connection, 
                                                   "SMEMBERS %s",
                                                   redis_row_set_key.c_str()));
      delete resultset;
      delete stmt;
    }
// 把SET中的每个STRING或HASH键存入redis_row_key_vector中
    string redis_row_key;
    for (int i = 0; i &lt; reply-&gt;elements; ++i) {
      redis_row_key = reply-&gt;element[i]-&gt;str;
      redis_row_key_vector.push_back(redis_row_key);
    }
    freeReplyObject(reply);
  } else {
    freeReplyObject(reply);
    throw runtime_error("FAILURE - SMEMBERS error");
  }
  return redis_row_key_vector;
}</pre><br />
&nbsp; &nbsp; &nbsp; &nbsp; 现在我们已经掌握了确定Redis中的结果集标识符以及各数据结构的键的方法。下一篇文章将研究结果集在Redis中的排序和分页问题。<p>&nbsp;</p>
</div><img src ="http://www.cnitblog.com/stomic/aggbug/90329.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2015-12-25 01:47 <a href="http://www.cnitblog.com/stomic/archive/2015/12/25/90329.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转）初学Redis（2）——用Redis作为Mysql数据库的缓存</title><link>http://www.cnitblog.com/stomic/archive/2015/12/24/90328.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Thu, 24 Dec 2015 15:46:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2015/12/24/90328.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/90328.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2015/12/24/90328.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/90328.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/90328.html</trackback:ping><description><![CDATA[<div id="article_content" class="article_content">
<p><span style="font-size:18px">&nbsp; &nbsp; &nbsp; &nbsp; 用Redis作Mysql数据库缓存，必须解决2个问题。首先，应该确定用何种数据结构存储来自<span style="font-size:18px">Mysql的数据；在</span>确定数据结构之后，还要考虑用什么标识作为该数据结构的键。</span></p>
<p><span style="font-size:18px">&nbsp; &nbsp; &nbsp; &nbsp; 直观上看，Mysql中的数据都是按表存储的；更微观地看，这些表都是按行存储的。每执行一次select查询，Mysql都会返回一个结果集，这个结果集由若干行组成。所以，一个自然而然的想法就是在Redis中找到一种对应于Mysql行的数据结构。Redis中提供了五种基本数据结构，即字符串（string）、列表（list）、哈希（hash）、集合（set）和有序集合（sorted set）。经过调研，发现适合存储行的数据结构有两种，即string和hash。</span></p>
<p><span style="font-size:18px">&nbsp; &nbsp; &nbsp; &nbsp; 要把Mysql的行数据存入string，首先需要对行数据进行格式化。事实上，结果集的每一行都可以看做若干由字段名和其对应值组成的键值对集合。这种键值对结构很容易让我们想起Json格式。因此，这里选用Json格式作为结果集每一行的格式化模板。根据这一想法，我们可以实现将结果集格式化为若干Json对象，并将Json对象转化为字符串存入Redis的代码：</span></p>
<p><span style="font-size:18px"></span></p><div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><strong>[cpp]</strong> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a><a href="https://code.csdn.net/snippets/474440" target="_blank" title="在CODE上查看代码片" style="text-indent:0;"><img src="https://code.csdn.net/assets/CODE_ico.png" width="12" height="12" alt="在CODE上查看代码片" style="position:relative;top:1px;left:2px;" /></a><a href="https://code.csdn.net/snippets/474440/fork" target="_blank" title="派生到我的代码片" style="text-indent:0;"><img src="https://code.csdn.net/assets/ico_fork.svg" width="12" height="12" alt="派生到我的代码片" style="position:relative;top:2px;left:2px;" /></a><div style="position: absolute; left: 434px; top: 804px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_1" align="center" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=1&amp;width=18&amp;height=18" wmode="transparent"></div></div></div><ol start="1" class="dp-cpp"><li class="alt"><span><span class="comment">//&nbsp;该函数把结果集中的每一行转换为一个Json格式的字符串并存入Redis的STRING结构中，</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span><span class="comment">//&nbsp;STRING键应该包含结果集标识符和STRING编号，形式如&#8220;cache.string:123456:1&#8221;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>string&nbsp;Cache2String(sql::Connection&nbsp;*mysql_connection,&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redisContext&nbsp;*redis_connection,&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql::ResultSet&nbsp;*resultset,&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">const</span><span>&nbsp;string&nbsp;&amp;resultset_id,&nbsp;</span><span class="datatypes">int</span><span>&nbsp;ttl)&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(resultset-&gt;rowsCount()&nbsp;==&nbsp;0)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">throw</span><span>&nbsp;runtime_error(</span><span class="string">"FAILURE&nbsp;-&nbsp;no&nbsp;rows"</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;<span class="comment">//&nbsp;STRING键的前缀，包含了结果集的标识符</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;string&nbsp;prefix(<span class="string">"cache.string:"</span><span>&nbsp;+&nbsp;resultset_id&nbsp;+&nbsp;</span><span class="string">":"</span><span>);&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;unsigned&nbsp;<span class="datatypes">int</span><span>&nbsp;num_row&nbsp;=&nbsp;1;&nbsp;&nbsp;</span><span class="comment">//&nbsp;STRING编号，附加于STRING键的末尾，从1开始</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;sql::ResultSetMetaData&nbsp;*meta&nbsp;=&nbsp;resultset-&gt;getMetaData();&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;unsigned&nbsp;<span class="datatypes">int</span><span>&nbsp;num_col&nbsp;=&nbsp;meta-&gt;getColumnCount();&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;<span class="comment">//&nbsp;将结果集中所有行对应的所有STRING键存入该SET，SET键包含了结果集的标识符</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;string&nbsp;redis_row_set_key(<span class="string">"resultset.string:"</span><span>&nbsp;+&nbsp;resultset_id);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;redisReply&nbsp;*reply;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;string&nbsp;ttlstr;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;stringstream&nbsp;ttlstream;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;ttlstream&nbsp;&lt;&lt;&nbsp;ttl;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;ttlstr&nbsp;=&nbsp;ttlstream.str();&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;resultset-&gt;beforeFirst();&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;<span class="comment">//&nbsp;将结果集中的每一行转为Json格式的字符串，将这些Json字符串存入STRING，</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;<span class="comment">//&nbsp;每个STRING对应结果集中的一行</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;<span class="keyword">while</span><span>&nbsp;(resultset-&gt;next())&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;redis_row_key;&nbsp;&nbsp;<span class="comment">//&nbsp;STRING键名，由前缀和STRING编号组成</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;stringstream&nbsp;keystream;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;keystream&nbsp;&lt;&lt;&nbsp;prefix&nbsp;&lt;&lt;&nbsp;num_row;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;redis_row_key&nbsp;=&nbsp;keystream.str();&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;Json::Value&nbsp;row;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(</span><span class="datatypes">int</span><span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;=&nbsp;num_col;&nbsp;++i)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;col_label&nbsp;=&nbsp;meta-&gt;getColumnLabel(i);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;col_value&nbsp;=&nbsp;resultset-&gt;getString(col_label);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;row[col_label]&nbsp;=&nbsp;col_value;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;Json::FastWriter&nbsp;writer;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;redis_row_value&nbsp;=&nbsp;writer.write(row);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;将STRING键及Json格式的对应值对存入Redis</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;reply&nbsp;=&nbsp;<span class="keyword">static_cast</span><span>&lt;redisReply*&gt;(redisCommand(redis_connection,&nbsp;&nbsp;&nbsp;</span></span></li><li class=""><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"SET&nbsp;%s&nbsp;%s"</span><span>,&nbsp;&nbsp;</span></span></li><li class="alt"><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_row_key.c_str(),&nbsp;&nbsp;&nbsp;</span></li><li class=""><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_row_value.c_str()));&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;freeReplyObject(reply);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;将STRING键加入SET中</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;reply&nbsp;=&nbsp;<span class="keyword">static_cast</span><span>&lt;redisReply*&gt;(redisCommand(redis_connection,&nbsp;&nbsp;&nbsp;</span></span></li><li class=""><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"SADD&nbsp;%s&nbsp;%s"</span><span>,&nbsp;&nbsp;</span></span></li><li class="alt"><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_row_set_key.c_str(),&nbsp;&nbsp;&nbsp;</span></li><li class=""><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_row_key.c_str()));&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;freeReplyObject(reply);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;设置STRING的过期时间</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;reply&nbsp;=&nbsp;<span class="keyword">static_cast</span><span>&lt;redisReply*&gt;(redisCommand(redis_connection,&nbsp;&nbsp;&nbsp;</span></span></li><li class=""><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"EXPIRE&nbsp;%s&nbsp;%s"</span><span>,&nbsp;&nbsp;</span></span></li><li class="alt"><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_row_key.c_str(),&nbsp;&nbsp;&nbsp;</span></li><li class=""><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ttlstr.c_str()));&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;freeReplyObject(reply);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;++num_row;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;<span class="comment">//&nbsp;设置SET的过期时间</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;reply&nbsp;=&nbsp;<span class="keyword">static_cast</span><span>&lt;redisReply*&gt;(redisCommand(redis_connection,&nbsp;&nbsp;&nbsp;</span></span></li><li class=""><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"EXPIRE&nbsp;%s&nbsp;%s"</span><span>,&nbsp;&nbsp;</span></span></li><li class="alt"><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_row_set_key.c_str(),&nbsp;&nbsp;&nbsp;</span></li><li class=""><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ttlstr.c_str()));&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;freeReplyObject(reply);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;redis_row_set_key;&nbsp;&nbsp;</span><span class="comment">//&nbsp;返回SET键，以便于其他函数获取该SET中的内容</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>}&nbsp;&nbsp;</span></li></ol></div><pre code_snippet_id="474440" snippet_file_name="blog_20140924_1_7066320" name="code" class="cpp" style="display: none;">// 该函数把结果集中的每一行转换为一个Json格式的字符串并存入Redis的STRING结构中，
// STRING键应该包含结果集标识符和STRING编号，形式如&#8220;cache.string:123456:1&#8221;
string Cache2String(sql::Connection *mysql_connection,
                    redisContext *redis_connection,
                    sql::ResultSet *resultset,
                    const string &amp;resultset_id, int ttl) {
  if (resultset-&gt;rowsCount() == 0) {
    throw runtime_error("FAILURE - no rows");
  }
  // STRING键的前缀，包含了结果集的标识符
  string prefix("cache.string:" + resultset_id + ":");
  unsigned int num_row = 1;  // STRING编号，附加于STRING键的末尾，从1开始
  sql::ResultSetMetaData *meta = resultset-&gt;getMetaData();
  unsigned int num_col = meta-&gt;getColumnCount();
  // 将结果集中所有行对应的所有STRING键存入该SET，SET键包含了结果集的标识符
  string redis_row_set_key("resultset.string:" + resultset_id);
  redisReply *reply;
  string ttlstr;
  stringstream ttlstream;
  ttlstream &lt;&lt; ttl;
  ttlstr = ttlstream.str();
  resultset-&gt;beforeFirst();
  // 将结果集中的每一行转为Json格式的字符串，将这些Json字符串存入STRING，
  // 每个STRING对应结果集中的一行
  while (resultset-&gt;next()) {
    string redis_row_key;  // STRING键名，由前缀和STRING编号组成
    stringstream keystream;
    keystream &lt;&lt; prefix &lt;&lt; num_row;
    redis_row_key = keystream.str();
    Json::Value row;
    for (int i = 1; i &lt;= num_col; ++i) {
      string col_label = meta-&gt;getColumnLabel(i);
      string col_value = resultset-&gt;getString(col_label);
      row[col_label] = col_value;
    }
    Json::FastWriter writer;
    string redis_row_value = writer.write(row);
// 将STRING键及Json格式的对应值对存入Redis
    reply = static_cast&lt;redisReply*&gt;(redisCommand(redis_connection, 
                                                 "SET %s %s",
                                                 redis_row_key.c_str(), 
                                                 redis_row_value.c_str()));
    freeReplyObject(reply);
    // 将STRING键加入SET中
    reply = static_cast&lt;redisReply*&gt;(redisCommand(redis_connection, 
                                                 "SADD %s %s",
                                                 redis_row_set_key.c_str(), 
                                                 redis_row_key.c_str()));
    freeReplyObject(reply);
    // 设置STRING的过期时间
    reply = static_cast&lt;redisReply*&gt;(redisCommand(redis_connection, 
                                                 "EXPIRE %s %s",
                                                 redis_row_key.c_str(), 
                                                 ttlstr.c_str()));
    freeReplyObject(reply);
    ++num_row;
  }
  // 设置SET的过期时间
  reply = static_cast&lt;redisReply*&gt;(redisCommand(redis_connection, 
                                               "EXPIRE %s %s",
                                               redis_row_set_key.c_str(), 
                                               ttlstr.c_str()));
  freeReplyObject(reply);
  return redis_row_set_key;  // 返回SET键，以便于其他函数获取该SET中的内容
}</pre><br />
<br />
<p>&nbsp;</p>
<p><span style="font-size:18px">&nbsp; &nbsp; &nbsp; &nbsp; 要把Mysql的行数据存入hash，过程要比把数据存入string直观很多。这是由hash的结构性质决定的&#8212;&#8212;hash本身就是一个键值对集合：<span style="font-size:18px">一个&#8220;父键&#8221;下面包含了很多&#8220;子键&#8221;，每个&#8220;子键&#8221;都对应一个值</span>。根据前面的分析可知，结果集中的每一行实际上也是键值对集合。用Redis键值对集合表示Mysql键值对集合应该再合适不过了：对于结果集中的某一行，字段对应于hash的&#8220;子键&#8221;，字段对应的值就是hash&#8220;子键&#8221;对应的值，即结果集的一行刚好对应一个hash。这一想法的实现代码如下：</span></p>
<p><span style="font-size:18px"></span></p><div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><strong>[cpp]</strong> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a><a href="https://code.csdn.net/snippets/474440" target="_blank" title="在CODE上查看代码片" style="text-indent:0;"><img src="https://code.csdn.net/assets/CODE_ico.png" width="12" height="12" alt="在CODE上查看代码片" style="position:relative;top:1px;left:2px;" /></a><a href="https://code.csdn.net/snippets/474440/fork" target="_blank" title="派生到我的代码片" style="text-indent:0;"><img src="https://code.csdn.net/assets/ico_fork.svg" width="12" height="12" alt="派生到我的代码片" style="position:relative;top:2px;left:2px;" /></a><div style="position: absolute; left: 434px; top: 2225px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_2" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_2" align="center" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=2&amp;width=18&amp;height=18" wmode="transparent"></div></div></div><ol start="1" class="dp-cpp"><li class="alt"><span><span class="comment">//&nbsp;该函数把结果集中的每一行都存入一个HASH结构。HASH键应当包括结果集标识符和HASH编号，</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span><span class="comment">//&nbsp;形如&#8220;cache.string:123456:1&#8221;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>string&nbsp;Cache2Hash(sql::Connection&nbsp;*mysql_connection,&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redisContext&nbsp;*redis_connection,&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql::ResultSet&nbsp;*resultset,&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">const</span><span>&nbsp;string&nbsp;&amp;resultset_id,&nbsp;</span><span class="datatypes">int</span><span>&nbsp;ttl)&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(resultset-&gt;rowsCount()&nbsp;==&nbsp;0)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">throw</span><span>&nbsp;runtime_error(</span><span class="string">"FAILURE&nbsp;-&nbsp;no&nbsp;rows"</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;<span class="comment">//&nbsp;HASH键的前缀，包含了结果集的标识符</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;string&nbsp;prefix(<span class="string">"cache.hash:"</span><span>&nbsp;+&nbsp;resultset_id&nbsp;+&nbsp;</span><span class="string">":"</span><span>);&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;unsigned&nbsp;<span class="datatypes">int</span><span>&nbsp;num_row&nbsp;=&nbsp;1;&nbsp;&nbsp;</span><span class="comment">//&nbsp;HASH编号，附加于HASH键的末尾，从1开始</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;sql::ResultSetMetaData&nbsp;*meta&nbsp;=&nbsp;resultset-&gt;getMetaData();&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;unsigned&nbsp;<span class="datatypes">int</span><span>&nbsp;num_col&nbsp;=&nbsp;meta-&gt;getColumnCount();&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;<span class="comment">//&nbsp;将结果集中所有行对应的所有HASH键存入该SET，SET键包含了结果集的标识符</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;string&nbsp;redis_row_set_key(<span class="string">"resultset.hash:"</span><span>&nbsp;+&nbsp;resultset_id);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;redisReply&nbsp;*reply;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;string&nbsp;ttlstr;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;stringstream&nbsp;ttlstream;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;ttlstream&nbsp;&lt;&lt;&nbsp;ttl;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;ttlstr&nbsp;=&nbsp;ttlstream.str();&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;<span class="comment">//&nbsp;结果集中的每一行对应于一个HASH，将结果集的所有行都存入相应HASH中</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;resultset-&gt;beforeFirst();&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;<span class="keyword">while</span><span>&nbsp;(resultset-&gt;next())&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;redis_row_key;&nbsp;&nbsp;<span class="comment">//&nbsp;HASH键名，由前缀和HASH编号组成</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;stringstream&nbsp;keystream;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;keystream&nbsp;&lt;&lt;&nbsp;prefix&nbsp;&lt;&lt;&nbsp;num_row;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;redis_row_key&nbsp;=&nbsp;keystream.str();&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(</span><span class="datatypes">int</span><span>&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;=&nbsp;num_col;&nbsp;++i)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;col_label&nbsp;=&nbsp;meta-&gt;getColumnLabel(i);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;col_value&nbsp;=&nbsp;resultset-&gt;getString(col_label);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;将结果集中一行的字段名和对应值存入HASH</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reply&nbsp;=&nbsp;<span class="keyword">static_cast</span><span>&lt;redisReply*&gt;(redisCommand(redis_connection,&nbsp;&nbsp;</span></span></li><li class=""><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;&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 class="string">"HSET&nbsp;%s&nbsp;%s&nbsp;%s"</span><span>,&nbsp;&nbsp;</span></span></li><li class="alt"><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;&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;redis_row_key.c_str(),&nbsp;&nbsp;&nbsp;</span></li><li class=""><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;&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;col_label.c_str(),&nbsp;&nbsp;</span></li><li class="alt"><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;&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;col_value.c_str()));&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;freeReplyObject(reply);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;将HASH键加入SET中</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;reply&nbsp;=&nbsp;<span class="keyword">static_cast</span><span>&lt;redisReply*&gt;(redisCommand(redis_connection,&nbsp;&nbsp;&nbsp;</span></span></li><li class=""><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"SADD&nbsp;%s&nbsp;%s"</span><span>,&nbsp;&nbsp;</span></span></li><li class="alt"><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_row_set_key.c_str(),&nbsp;&nbsp;&nbsp;</span></li><li class=""><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_row_key.c_str()));&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;freeReplyObject(reply);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;设置HASH的过期时间</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;reply&nbsp;=&nbsp;<span class="keyword">static_cast</span><span>&lt;redisReply*&gt;(redisCommand(redis_connection,&nbsp;&nbsp;&nbsp;</span></span></li><li class=""><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"EXPIRE&nbsp;%s&nbsp;%s"</span><span>,&nbsp;&nbsp;</span></span></li><li class="alt"><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_row_key.c_str(),&nbsp;&nbsp;&nbsp;</span></li><li class=""><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ttlstr.c_str()));&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;freeReplyObject(reply);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;++num_row;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;<span class="comment">//&nbsp;设置SET的过期时间</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;reply&nbsp;=&nbsp;<span class="keyword">static_cast</span><span>&lt;redisReply*&gt;(redisCommand(redis_connection,&nbsp;&nbsp;&nbsp;</span></span></li><li class=""><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">"EXPIRE&nbsp;%s&nbsp;%s"</span><span>,&nbsp;&nbsp;</span></span></li><li class="alt"><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redis_row_set_key.c_str(),&nbsp;&nbsp;&nbsp;</span></li><li class=""><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ttlstr.c_str()));&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;freeReplyObject(reply);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;redis_row_set_key;&nbsp;&nbsp;</span><span class="comment">//&nbsp;返回SET键，以便于其他函数获取该SET中的内容</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>}&nbsp;&nbsp;</span></li></ol></div><pre code_snippet_id="474440" snippet_file_name="blog_20140924_2_3239073" name="code" class="cpp" style="display: none;">// 该函数把结果集中的每一行都存入一个HASH结构。HASH键应当包括结果集标识符和HASH编号，
// 形如&#8220;cache.string:123456:1&#8221;
string Cache2Hash(sql::Connection *mysql_connection,
                  redisContext *redis_connection,
                  sql::ResultSet *resultset,
                  const string &amp;resultset_id, int ttl) {
  if (resultset-&gt;rowsCount() == 0) {
    throw runtime_error("FAILURE - no rows");
  }
  // HASH键的前缀，包含了结果集的标识符
  string prefix("cache.hash:" + resultset_id + ":");
  unsigned int num_row = 1;  // HASH编号，附加于HASH键的末尾，从1开始
  sql::ResultSetMetaData *meta = resultset-&gt;getMetaData();
  unsigned int num_col = meta-&gt;getColumnCount();
  // 将结果集中所有行对应的所有HASH键存入该SET，SET键包含了结果集的标识符
  string redis_row_set_key("resultset.hash:" + resultset_id);
  redisReply *reply;
  string ttlstr;
  stringstream ttlstream;
  ttlstream &lt;&lt; ttl;
  ttlstr = ttlstream.str();
  // 结果集中的每一行对应于一个HASH，将结果集的所有行都存入相应HASH中
  resultset-&gt;beforeFirst();
  while (resultset-&gt;next()) {
    string redis_row_key;  // HASH键名，由前缀和HASH编号组成
    stringstream keystream;
    keystream &lt;&lt; prefix &lt;&lt; num_row;
    redis_row_key = keystream.str();
    for (int i = 1; i &lt;= num_col; ++i) {
      string col_label = meta-&gt;getColumnLabel(i);
      string col_value = resultset-&gt;getString(col_label);
  // 将结果集中一行的字段名和对应值存入HASH
      reply = static_cast&lt;redisReply*&gt;(redisCommand(redis_connection,
                                                   "HSET %s %s %s",
                                                   redis_row_key.c_str(), 
                                                   col_label.c_str(),
                                                   col_value.c_str()));
      freeReplyObject(reply);
    }
// 将HASH键加入SET中
    reply = static_cast&lt;redisReply*&gt;(redisCommand(redis_connection, 
                                                 "SADD %s %s",
                                                 redis_row_set_key.c_str(), 
                                                 redis_row_key.c_str())); 
    freeReplyObject(reply);
// 设置HASH的过期时间
    reply = static_cast&lt;redisReply*&gt;(redisCommand(redis_connection, 
                                                 "EXPIRE %s %s",
                                                 redis_row_key.c_str(), 
                                                 ttlstr.c_str()));
    freeReplyObject(reply);
    ++num_row;
  }
  // 设置SET的过期时间
  reply = static_cast&lt;redisReply*&gt;(redisCommand(redis_connection, 
                                               "EXPIRE %s %s",
                                               redis_row_set_key.c_str(), 
                                               ttlstr.c_str()));
  freeReplyObject(reply);
  return redis_row_set_key;  // 返回SET键，以便于其他函数获取该SET中的内容
}</pre><br />
&nbsp; &nbsp; &nbsp; &nbsp; 至此，我们已经给出了两种存储Mysql结果集的方案，这就是我们在篇首提出的第一个问题，即选择何种数据结构存储Mysql结果集的答案。下一篇文章将研究第二个问题，即数据结构键的标识符选择问题。<p>&nbsp;</p>
</div><img src ="http://www.cnitblog.com/stomic/aggbug/90328.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2015-12-24 23:46 <a href="http://www.cnitblog.com/stomic/archive/2015/12/24/90328.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转）初学Redis（1）——认识Redis</title><link>http://www.cnitblog.com/stomic/archive/2015/12/24/90326.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Thu, 24 Dec 2015 15:12:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2015/12/24/90326.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/90326.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2015/12/24/90326.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/90326.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/90326.html</trackback:ping><description><![CDATA[<p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">&nbsp;Redis官网对Redis的定义是：&#8220;Redis is an open source, BSD licensed, advanced key-value cache and store&#8221;，可以看出，Redis是一种键值系统，可以用来缓存或存储数据。Redis是&#8220;Remote Dictionary Server&#8221;（远程字典服务）的缩写，提供了字符串（string），列表（list），哈希（hash），集合（set）和有序集合（sorted set）等5种数据结构，这些数据结构使它成为一种便于使用的键值系统。</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">&nbsp; &nbsp; &nbsp; &nbsp; 作为Redis提供的最简单的数据结构，字符串示意图及其常用命令如下图所示：</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;"><img src="http://img.blog.csdn.net/20140925184857911?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXR5bDE5ODg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" align="middle" width="450" height="265" alt="" style="border: none; max-width: 100%;" /><br /></span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">图1</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">&nbsp; &nbsp; &nbsp; &nbsp; 可见，Redis字符串类型实际上类似于C++中的map，一个键对应一个值。列表类型则是一种相对高级的数据结构，其示意图和常用命令如下图所示：</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;"><img src="http://img.blog.csdn.net/20140925185250133?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXR5bDE5ODg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" align="middle" width="391" height="283" alt="" style="border: none; max-width: 100%;" />&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">图2</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">&nbsp; &nbsp; &nbsp; &nbsp; 列表实际上由一个双向链表实现，所以在列表两端插入或删除数据效率极高，可以用于实现类似于微博、人人网上的&#8220;新鲜事&#8221;功能。 Redis提供的一个更有趣的结构称为哈希，其示意图和常用命令如下图所示：</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;"><img src="http://img.blog.csdn.net/20140925185805253?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXR5bDE5ODg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" align="middle" width="540" height="273" alt="" style="border: none; max-width: 100%;" /><br /></span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">图3</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">&nbsp; &nbsp; &nbsp; &nbsp; 一个哈希实际上是一组键值对的集合，哈希本身的键是&#8220;父键&#8221;，哈希中包含的若干字段是&#8220;子键&#8221;，每个&#8220;子键&#8221;都有相应的值。&#8220;子键&#8221;之间并没有一定的联系，但是它们共同组成了一个完整的哈希结构。我们可以把一个哈希看做关系数据库中的一行，哈希的每个子键对应行的一个字段。因此，当把关系数据库中的数据缓存至Redis时，使用哈希结构可能会带来方便。需要注意的是，哈希结构内部的子键之间是没有顺序关系的。Redis提供的另一个无顺序关系的结构是集合，其示意图和常用命令如下图所示：</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;"><img src="http://img.blog.csdn.net/20140925190618635?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXR5bDE5ODg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" align="middle" width="600" height="296" alt="" style="border: none; max-width: 100%;" /><br /></span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">图4</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">&nbsp; &nbsp; &nbsp; &nbsp; 集合中的数据满足唯一性和无序性。集合在Redis内部是用哈希表实现的，所以插入和删除操作的时间复杂度均为O(1)。Redis为集合提供了求交并差等运算命令，使用起来非常方便。与集合密切相关的另一个数据结构是有序集合，其示意图和常用命令如下图所示：</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;"><img src="http://img.blog.csdn.net/20140925191134083?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXR5bDE5ODg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" align="middle" width="486" height="313" alt="" style="border: none; max-width: 100%;" /><br /></span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">图5</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">&nbsp; &nbsp; &nbsp; &nbsp; 有序集合与集合的最大差异在于有序集合中的每个数据都有一个对应的分数，集合中的元素就是按照这些分数进行排序的。从结构功能和使用方法上来看，有序集合可能是Redis提供的5种数据结构中最高级的一种。</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">&nbsp; &nbsp; &nbsp; &nbsp; Redis是一种内存数据库，这使其在数据存取效率方面表现突出。由于内存中的数据时刻面临丢失的危险，Redis提供了两种持久化机制，及时将内存中的数据写入硬盘。第一种机制为RDB，利用存储快照的方式把内存数据定期写入硬盘；第二种机制为AOF，利用写日志的方式，每执行一条更改Redis数据的命令，就在日志里附加上该命令并保存在硬盘上。Redis默认开启RDB模式，关闭AOF模式，这是因为AOF更加耗时。但是，如果对数据安全要求极高，无法承担任何数据丢失的后果，AOF模式就变成了持久化的首选。</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">&nbsp; &nbsp; &nbsp; &nbsp; 当然，即使Redis具备持久化机制，但是一旦本地硬盘损坏，数据丢失依然在所难免。所以，Redis又提供了复制功能，作用是将一个主数据库（master）的数据自动同步到多个从数据库（slave），从而尽可能防止数据丢失。Redis主从机制可以简单描述为：从数据库启动后，先向主数据库发送SYNC命令；主数据库接到SYNC命令后就开始保存快照，在此期间，所有发给主数据库的命令都被缓存起来；快照保存完成后，主数据库把快照和缓存的命令一起发给从数据库；从数据库保存主数据库发来的快照文件，并依次执行主数据库发来的缓存命令。在同步过程中，从数据库不会阻塞，它默认使用同步之前的数据继续响应客户端发来的命令。</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">&nbsp; &nbsp; &nbsp; &nbsp; 事务是Redis提供的特性之一。首先利用MULTI命令通知Redis，接下来的若干命令属于同一事务；然后输入若干命令，这些命令都被放入命令队列而不会被立即执行；最后，利用EXEC命令通知Redis，属于同一事务的所有命令均已输入完成，现在开始执行该事物。属于同一个事务的所有有效命令或者全部被执行，或者全部不执行，且在执行过程中不会插入其他命令。</span><span style="font-size: 18px;">管道（pipeline）是Redis提供的另一个特性。该特性使Redis能够一次性接收多个命令，执行之后再一次性返回结果。这样能够减少客户端与Redis服务器的通信次数，从而降低往返时延。</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">&nbsp; &nbsp; &nbsp; &nbsp; 除事务和管道以外，Redis还提供了很多其他特性，如设置键的过期时间，利用BLPOP/BRPOP命令实现优先级队列，利用PUBLISH/SUBSCRIBE命令实现消息订阅和发布等，这里不再赘述。</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">&nbsp; &nbsp; &nbsp; &nbsp; Redis由ANSI C写成，能够运行在包括Linux和OS X在内的大部分POSIX系统上，官方推荐的操作系统为Linux。Redis没有官方的Windows版本，但是微软移植并维护了一个能够运行在Windows上的Redis并放在github上（https://github.com/MSOpenTech/redis）。</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">&nbsp; &nbsp; &nbsp; &nbsp; Redis的编程接口被称为客户端（clients），绝大部分主流编程语言都有官方推荐的客户端。下图中，具有Redis官方推荐客户端的语言标为绿色，没有官方推荐客户端的标为蓝色：</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;"><img src="http://img.blog.csdn.net/20140925175354168?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXR5bDE5ODg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" style="border: none; max-width: 100%;" /><br /></span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">图6</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">&nbsp; &nbsp; &nbsp; &nbsp; 由于Redis没有官方推荐的C++客户端，因此可以使用C客户端予以代替。官方推荐的C客户端是hiredis，可以从github上找到（https://github.com/redis/hiredis）。</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">&nbsp; &nbsp; &nbsp; &nbsp; 作为一款功能强大，效率极高的NoSQL数据库，Redis已被包括新浪微博，知乎，Stackoverflow，暴雪和Flickr在内的多家公司成功用于实战。</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">注：图1-5均来自《Redis in Action》,Josiah L.Carlson, Manning Publications, 2013</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">参考文献：</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">1. 李子骅，Redis入门指南，人民邮电出版社，2013年5月第1版</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">2.Josiah L.Carlson, Redis in Action, Manning Publications, 2013</span></p><p style="padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">3. Redis官方网站http://www.redis.io</span></p><img src ="http://www.cnitblog.com/stomic/aggbug/90326.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2015-12-24 23:12 <a href="http://www.cnitblog.com/stomic/archive/2015/12/24/90326.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转+分析】JAVA: 为什么要使用"抽象类"? 使用"抽象类"有什么好处?</title><link>http://www.cnitblog.com/stomic/archive/2015/11/04/90273.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Wed, 04 Nov 2015 07:04:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2015/11/04/90273.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/90273.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2015/11/04/90273.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/90273.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/90273.html</trackback:ping><description><![CDATA[<pre class="reply-text mb10" id="best-answer-content" name="code">问你个问题，你知道什么是&#8220;东西&#8221;吗？什么是&#8220;物体&#8221;吗？ 
&#8220;麻烦你，小王。帮我把那个东西拿过来好吗&#8221; 
在生活中，你肯定用过这个词－－东西。 
小王：&#8220;你要让我帮你拿那个水杯吗？&#8221; 
你要的是水杯类的对象。而东西是水杯的父类。通常东西类没有实例对象，但我们有时需要东西的引用指向它的子类实例。 
你看你的房间乱成什么样子了，以后不要把东西乱放了，知道么？ 
又是东西，它是一个数组。而数组中的元素都是其子类的实例。 
--------- 
上面讲的只是子类和父类。而没有说明抽象类的作用。抽象类是据有一个或多个抽象方法的类，必须声明为抽象类。抽象类的特点是，不能创建实例。 
这些该死的抽象类，也不知道它有什么屁用。我非要把它改一改不可。把抽象类中的抽象方法都改为空实现。也就是给抽象方法加上一个方法体，不过这个方法体是空的。这回抽象类就没有抽象方法了。它就可以不在抽象了。 
当你这么尝试之后，你发现，原来的代码没有任何变化。大家都还是和原来一样，工作的很好。你这回可能更加相信，抽象类根本就没有什么用。但总是不死心，它应该有点用吧，不然创造Java的这伙传说中的天才不成了傻子了吗？ 
接下来，我们来写一个小游戏。俄罗斯方块！我们来分析一下它需要什么类？
我知道它要在一个矩形的房子里完成。这个房子的上面出现一个方块，慢慢的下落，当它接触到地面或是其它方块的尸体时，它就停止下落了。然后房子的上面又会出现一个新的方块，与前一个方块一样，也会慢慢的下落。在它还没有死亡之前，我可以尽量的移动和翻转它。这样可以使它起到落地时起到一定的作用，如果好的话，还可以减下少几行呢。这看起来好象人生一样，它在为后来人努力着。
当然，我们不是真的要写一个游戏。所以我们简化它。我抽象出两个必须的类，一个是那个房间，或者就它地图也行。另一个是方块。我发现方块有很多种，数一下，共6种。它们都是四个小矩形构成的。但是它们还有很多不同，例如：它们的翻转方法不同。先把这个问题放到一边去，我们回到房子这个类中。
房子上面总是有方块落下来，房子应该有个属性是方块。当一个方块死掉后，再创建一个方块，让它出现在房子的上面。当玩家要翻转方法时，它翻转的到底是哪个方块呢？当然，房子中只有一个方块可以被翻转，就是当前方块。它是房子的一个属性。那这个属性到底是什么类型的呢？方块有很多不同啊，一共有6种之多，我需要写六个类。一个属性不可能有六种类型吧。当然一个属性只能有一种类型。
我们写一个方块类，用它来派生出6个子类。而房子类的当前方块属性的类型是方块类型。它可以指向任何子类。但是，当我调用当前方块的翻转方法时，它的子类都有吗？如果你把翻转方法写到方块类中，它的子类自然也就有了。可以这六种子类的翻转方法是不同的。我们知道'田'方块，它只有一种状态，无论你怎么翻转它。而长条的方块有两种状态。一种是&#8216;－&#8217;，另一种是&#8216;｜&#8217;。这可怎么办呢？我们知道Java的多态性，你可以让子类来重写父类的方法。也就是说，在父类中定义这个方法，子类在重写这个方法。
那么在父类的这个翻转方法中，我写一些什么代码呢？让它有几种状态呢？因为我们不可能实例化一个方块类的实例，所以它的翻转方法中的代码并不重要。而子类必须去重写它。那么你可以在父类的翻转方法中不写任何代码，也就是空方法。
我们发现，方法类不可能有实例，它的翻转方法的内容可以是任何的代码。而子类必须重写父类的翻转方法。这时，你可以把方块类写成抽象类，而它的抽象方法就是翻转方法。当然，你也可以把方块类写为非抽象的，也可以在方块类的翻转方法中写上几千行的代码。但这样好吗？难道你是微软派来的，非要说Java中的很多东西都是没有用的吗？
<span style="color:#CC0000;">当我看到方块类是抽象的，我会很关心它的抽象方法。我知道它的子类一定会重写它，而且，我会去找到抽象类的引用。它一定会有多态性的体现</span>。
<span style="color:#FF0000;">但是，如果你没有这样做，我会认为可能会在某个地方，你会实例化一个方块类的实例，但我找了所有的地方都没有找到。最后我会大骂你一句，你是来欺骗我的吗，你这个白痴。</span>
把那些和&#8220;东西&#8221;差不多的类写成抽象的。而水杯一样的类就可以不是抽象的了。当然水杯也有几千块钱一个的和几块钱一个的。水杯也有子类，例如，我用的水杯都很高档，大多都是一次性的纸水杯。
记住一点，面向对象不是来自于Java，面向对象就在你的生活中。而Java的面向对象是方便你解决复杂的问题。这不是说面向对象很简单，虽然面向对象很复杂，但Java知道，你很了解面向对象，因为它就在你身边。</pre>
<img src ="http://www.cnitblog.com/stomic/aggbug/90273.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2015-11-04 15:04 <a href="http://www.cnitblog.com/stomic/archive/2015/11/04/90273.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转)Java+PHP整合</title><link>http://www.cnitblog.com/stomic/archive/2015/10/22/90236.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Thu, 22 Oct 2015 10:18:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2015/10/22/90236.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/90236.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2015/10/22/90236.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/90236.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/90236.html</trackback:ping><description><![CDATA[<p style="color: #333333; font-size: 14px; padding-top: 0px; padding-bottom: 15px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;">验证两种各自领域称王的语言（JAVA /PHP），不同语言、不同机制的组合在一起<strong><span style="color: #ff0000;">，PHP负责WEB层，Java负责业务和数据逻辑层</span></strong>，真是一对黄金组合（<span style="padding: 0px; margin: 0px;">Java+PHP整合=混血新宠儿</span>），发挥各自优势，适合开发B/S企业程序。</p><p style="color: #333333; font-size: 14px; padding-top: 0px; padding-bottom: 15px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><span style="padding: 0px; margin: 0px;"><span style="font-size: 32px; padding: 0px; margin: 0px;"><a name="_Toc296514494" style="color: #336699; padding: 0px; margin: 0px;"><span style="padding: 0px; margin: 0px;"><span style="font-size: 24px; padding: 0px; margin: 0px;">1</span>&nbsp;</span><span style="font-size: 24px; padding: 0px; margin: 0px;">技术问题</span></a></span></span></p><div align="left" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;">两种不同环境，不同机制的语言结合，首先要解决的是如何通讯？其次是通讯内容如何处理？最后是两者开发，部署环境整合？</div><div style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><span style="padding: 0px; margin: 0px;"><span style="font-size: 24px; padding: 0px; margin: 0px;"><a name="_Toc296514495" style="color: #336699; padding: 0px; margin: 0px;"><span style="padding: 0px; margin: 0px;"><span style="font-size: 14px; padding: 0px; margin: 0px;">1.1</span><span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;</span></span><span style="font-size: 14px; padding: 0px; margin: 0px;">两种语言对比</span></a></span></span></div><div align="left" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><span style="padding: 0px; margin: 0px;">Php</span>：直观，快速，简单，易学，开发动态网页效率高，草根文化气息浓重，是语言世界的平民英雄，注重于结果。</div><div align="left" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><span style="padding: 0px; margin: 0px;">Java</span>：强大而复杂，有众多高端功能，又有IMB、Oracle等企业大颚的追捧，是语言世界的贵族王子。</div><div style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><span style="padding: 0px; margin: 0px;"><span style="font-size: 24px; padding: 0px; margin: 0px;"><a name="_Toc296514496" style="color: #336699; padding: 0px; margin: 0px;"><span style="padding: 0px; margin: 0px;"><span style="font-size: 14px; padding: 0px; margin: 0px;">1.2</span><span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;</span></span><span style="font-size: 14px; padding: 0px; margin: 0px;">通讯问题</span></a></span></span></div><div style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><span style="padding: 0px; margin: 0px;"><span style="font-size: 18px; padding: 0px; margin: 0px;"><a name="_Toc296514497" style="color: #336699; padding: 0px; margin: 0px;"><span style="padding: 0px; margin: 0px;"><span style="font-size: 14px; padding: 0px; margin: 0px;">1.2.1</span><span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;</span></span><span style="font-size: 14px; padding: 0px; margin: 0px;">消息队列</span></a></span></span></div><div align="left" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;">从操作系统层面观察： PHP和Java是系统中运行的不同进程，他们之间沟通属于进程间通信技术(IPC)：</div><div align="left" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><span style="padding: 0px; margin: 0px; font-size: 12pt; line-height: 24px; font-family: Verdana, sans-serif;">&nbsp;<span style="padding: 0px; margin: 0px; font-size: 12pt;">&nbsp;<span style="padding: 0px; margin: 0px; font-size: 12pt;">&nbsp;&nbsp;</span></span></span></div><p style="color: #333333; font-size: 14px; padding-top: 0px; padding-bottom: 15px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><a href="http://img1.51cto.com/attachment/201106/233917104.jpg" target="_blank" style="color: #336699; text-decoration: initial; padding: 0px; margin: 0px;"><span style="color: #000000;"><img alt="" src="http://img1.51cto.com/attachment/201106/233917104.jpg" border="0" style="border: none; max-width: 100%; padding: 0px; margin: 0px; vertical-align: top;" /></span></a></p><div align="left" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><span style="padding: 0px; margin: 0px; font-size: 12pt; line-height: 24px; font-family: Verdana, sans-serif;"></span></div><div align="left" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;">在传统的Unix环境中，IPC技术有：管道、消息队列、共享内存、信号量等，但在同一个系统中，IPC通信比基于TCP的socket通信在性能、资源占用方面有相当大的优势。</div><div align="left" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;">在Unix/Linux中，PHP基本提供了所有IPC的访问接口，因为PHP可以看作是以C语言为核心的一个壳，而IPC是系统内核的组成部分，对外提供了一组C函数接口，因此PHP可以非常顺畅的运用IPC技术。而Java为了追求夸平台性(Windows的IPC技术和Unix的不同)，没有提供系统级的IPC访问，这也体现了Java的文化特色：为追求统一可牺牲效能。</div><div style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><span style="padding: 0px; margin: 0px;"><span style="font-size: 18px; padding: 0px; margin: 0px;"><a name="_Toc296514498" style="color: #336699; padding: 0px; margin: 0px;"><span style="padding: 0px; margin: 0px;"><span style="font-size: 14px; padding: 0px; margin: 0px;">1.2.2</span><span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="font-size: 14px; padding: 0px; margin: 0px;">Socket</span></a></span></span></div><div align="left" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><strong><span style="color: #ff0000;">消息队列技术只能适用于Unix/Linux系统，而SOCKET基于TCP/IP的通讯机制，从而适应各种平台。</span></strong></div><div align="left" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;">&nbsp;</div><p style="color: #333333; font-size: 14px; padding-top: 0px; padding-bottom: 15px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><a href="http://img1.51cto.com/attachment/201106/233935262.jpg" target="_blank" style="color: #336699; text-decoration: initial; padding: 0px; margin: 0px;"><span style="color: #000000;"><img alt="" src="http://img1.51cto.com/attachment/201106/233935262.jpg" border="0" style="border: none; max-width: 100%; padding: 0px; margin: 0px; vertical-align: top;" /></span></a></p><div align="left" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"></div><div align="left" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;">从上图中看出，PHP承担HTTP层的职责，而Java承担业务层的职责，他们通过System V Message Queue（消息队列，进程间通讯IPC中的一种）相互沟通，Java需要JNI的支持。</div><div align="left" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;">使用消息队列有以下好处：</div><p style="color: #333333; font-size: 14px; padding-top: 0px; padding-bottom: 15px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"></p><table cellspacing="0" cellpadding="0" width="612" border="1" style="color: #333333; line-height: 26px; padding: 0px; margin: 0px auto; font-size: 12px; font-family: 宋体, 'Arial Narrow', arial, serif;"><tbody style="padding: 0px; margin: 0px;"><tr style="padding: 0px; margin: 0px;"><td valign="top" width="612" style="padding: 0px; margin: 0px;"><div align="left" style="padding: 0px; margin: 0px;"><span style="padding: 0px; margin: 0px;">1.<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span>使php和java保持独立性</div><div align="left" style="padding: 0px; margin: 0px;"><span style="padding: 0px; margin: 0px;">2.<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span>有极高的传输速度，大于socket</div><div align="left" style="padding: 0px; margin: 0px;"><span style="padding: 0px; margin: 0px;">3.<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span>相对于socket方式，Java服务端只向本机提供服务(没有对外侦听端口)，相对安全，易于管理。</div></td></tr></tbody></table><p style="color: #333333; font-size: 14px; padding-top: 0px; padding-bottom: 15px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"></p><div style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><span style="padding: 0px; margin: 0px;"><span style="font-size: 24px; padding: 0px; margin: 0px;"><a name="_Toc296514499" style="color: #336699; padding: 0px; margin: 0px;"><span style="padding: 0px; margin: 0px;"><span style="font-size: 14px; padding: 0px; margin: 0px;">1.3</span><span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="font-size: 14px; padding: 0px; margin: 0px;">通讯内容问题</span></a></span></span></div><div align="left" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;">通信问题解决了，通信内容如何解决呢？</div><div align="left" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><span style="color: #ff0000;"><strong>PHP和Java各自语言内部定义的数据类型，当两种语言互相传输数据时，数据类型怎样进行转换呢？&nbsp;</strong></span></div><div align="left" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;">&nbsp; &nbsp; &nbsp;<strong><span style="color: #ff0000;">（1）</span></strong>Xml: xml确是一种夸平台、能够很好描述对象模型的数据封装技术，但xml体积大传输速率慢，通讯两端解析也比较麻烦。</div><div align="left" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;">&nbsp; &nbsp; &nbsp;<span style="color: #ff0000;">&nbsp;<strong>(2)</strong></span>&nbsp;序列化: 在传输过程中使用序列化和反序列化对象来传输数据是一种公认且比较合理的方式，且两种语言都支持。</div><div align="left" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;">&nbsp;</div><div style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><span style="padding: 0px; margin: 0px;"><span style="font-size: 32px; padding: 0px; margin: 0px;"><span style="font-weight: bold;"><a name="_Toc296514501" style="color: #336699; padding: 0px; margin: 0px;"><span style="padding: 0px; margin: 0px;"><span style="font-size: 24px; padding: 0px; margin: 0px;">2</span><span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;</span></span><span style="font-size: 24px; padding: 0px; margin: 0px;">Java</span></a><span style="font-size: 24px; padding: 0px; margin: 0px;"><span style="padding: 0px; margin: 0px;">与php&nbsp;</span><span style="padding: 0px; margin: 0px;">结合选型</span></span></span></span></span></div><div style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><strong><span style="color: #ff0000;">目前已知的PHP与Java在Web间整合技术可分成SOAP（Simple Object Access Protocol）、Quercus、PHP/Java Bridge三种，这些技术可以让PHP与Java在开发Web应用程序时互相使用彼此的程序库。</span></strong></div><p style="color: #333333; font-size: 14px; padding-top: 0px; padding-bottom: 15px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"></p><table cellspacing="0" cellpadding="0" width="621" border="1" style="color: #333333; line-height: 26px; padding: 0px; margin: 0px auto; font-size: 12px; font-family: 宋体, 'Arial Narrow', arial, serif;"><tbody style="padding: 0px; margin: 0px;"><tr style="padding: 0px; margin: 0px;"><td valign="top" width="111" style="padding: 0px; margin: 0px;"><div style="padding: 0px; margin: 0px;">SOAP</div></td><td valign="top" width="510" style="padding: 0px; margin: 0px;"><div align="left" style="padding: 0px; margin: 0px;">SOAP是IBM、Microsoft等公司开发、W3C推荐，用来实现分布式对象技术的协议。SOAP提供了一套以XML来包装程序调用、参数传递与信息回传的机制，借助XML纯文字的特性，可通过HTTP、HTTPS、SMTP等通信管道穿越企业的防火墙。比起CORBA、Java RMI及DCOM这些以专属binary格式传送数据的分布式对象技术协议，SOAP具有与程序语言、平台和硬件无关的特性。</div></td></tr><tr style="padding: 0px; margin: 0px;"><td valign="top" width="111" style="padding: 0px; margin: 0px;"><div style="padding: 0px; margin: 0px;">Quercus</div></td><td valign="top" width="510" style="padding: 0px; margin: 0px;"><div style="padding: 0px; margin: 0px;">Quercus是一个开源 PHP 5 引擎，它已经拥有了纯 Java 的完整实现。Quercus 在 Resin 应用服务器之上运行，利用了负载平衡、代理缓存等 Resin 特性。</div></td></tr><tr style="padding: 0px; margin: 0px;"><td valign="top" width="111" style="padding: 0px; margin: 0px;"><div style="padding: 0px; margin: 0px;">PHP/Java Bridge</div></td><td valign="top" width="510" style="padding: 0px; margin: 0px;"><div style="padding: 0px; margin: 0px;">开源产品有：Php-java-bridge&nbsp;与 LAJP</div></td></tr></tbody></table><p style="color: #333333; font-size: 14px; padding-top: 0px; padding-bottom: 15px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"></p><div style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><span style="padding: 0px; margin: 0px;"><span style="font-size: 24px; padding: 0px; margin: 0px;"><a name="_Toc296514502" style="color: #336699; padding: 0px; margin: 0px;"><span style="padding: 0px; margin: 0px;"><span style="font-size: 14px; padding: 0px; margin: 0px;">2.1</span><span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;</span></span><span style="font-size: 14px; padding: 0px; margin: 0px;">选择条件</span></a></span></span></div><div style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><span style="padding: 0px; margin: 0px;">&#252;&nbsp;</span>免费、开源</div><div style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><span style="padding: 0px; margin: 0px;">&#252;&nbsp;</span>简单易用</div><div style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><span style="padding: 0px; margin: 0px;">&#252;&nbsp;</span>高效稳定</div><div style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><span style="padding: 0px; margin: 0px;"><span style="font-size: 24px; padding: 0px; margin: 0px;"><a name="_Toc296514503" style="color: #336699; padding: 0px; margin: 0px;"><span style="padding: 0px; margin: 0px;"><span style="font-size: 14px; padding: 0px; margin: 0px;">2.2</span><span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="font-size: 14px; padding: 0px; margin: 0px;">LAJP</span></a></span></span></div><div style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><span style="padding: 0px; margin: 0px;"><span style="font-size: 18px; padding: 0px; margin: 0px;"><a name="_Toc296514504" style="color: #336699; padding: 0px; margin: 0px;"><span style="padding: 0px; margin: 0px;"><span style="font-size: 14px; padding: 0px; margin: 0px;">2.2.1</span><span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="font-size: 14px; padding: 0px; margin: 0px;">特点</span></a></span></span></div><div align="left" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><span style="padding: 0px; margin: 0px;">&#216;&nbsp;</span><span style="padding: 0px; margin: 0px;">优势互补:&nbsp;</span>PHP是非常流行的WEB编程脚本语言，有易学、易用、开发部署效率高的特点，<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>非常适合网页编程；JAVA适合编写具有复杂的业务功能和数据的程序，二者结合可发挥各自优势。</div><div align="left" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><span style="padding: 0px; margin: 0px;">&#216;&nbsp;</span><span style="padding: 0px; margin: 0px;">高效稳定</span>：Apache+PHP组合可带来优异的WEB服务稳定性，而JAVA可补充如连接池、事物管理、分布式、对象模型等高端特性。</div><div align="left" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><span style="padding: 0px; margin: 0px;">&#216;&nbsp;</span><span style="padding: 0px; margin: 0px;">创新的通信机制</span>: PHP和Java间的通讯方式采用系统消息队列和Socket两种机制，兼顾通讯效率和平台兼容性。</div><div align="left" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><span style="padding: 0px; margin: 0px;">&#216;&nbsp;</span><span style="padding: 0px; margin: 0px;">数据类型自动转换机制</span>： PHP数据和Java数据可准确地自动匹配和转换，无须程序员编写解析代码。</div><div align="left" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><span style="padding: 0px; margin: 0px;">&#216;&nbsp;</span><span style="padding: 0px; margin: 0px;">易用</span>：LAJP安装配置简单，PHP端和JAVA端编程符合各自的编程习惯。</div><div align="left" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><span style="padding: 0px; margin: 0px;">&#216;&nbsp;</span><span style="padding: 0px; margin: 0px;">轻量级</span>：LAJP架构非常轻量级，除了最基本的PHP和Java环境，不需要任何扩充的、第三方的组件、容器。</div><div style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><span style="padding: 0px; margin: 0px;">2.2.2<span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>数据类型转换</span></div><div align="left" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;">PHP和Java各有其语言内部定义的数据类型，当PHP数据传送到Java，或Java数据传送到PHP时，LAJP在内部自动地、准确地对他们进行转换，程序员无需进行任何的解码工作。</div><div align="left" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;">&nbsp;</div><p style="color: #333333; font-size: 14px; padding-top: 0px; padding-bottom: 15px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><a href="http://img1.51cto.com/attachment/201106/234017661.jpg" target="_blank" style="color: #336699; text-decoration: initial; padding: 0px; margin: 0px;"><span style="color: #000000;"><img alt="" src="http://img1.51cto.com/attachment/201106/234017661.jpg" border="0" style="border: none; max-width: 100%; padding: 0px; margin: 0px; vertical-align: top;" /></span></a></p><div style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><span style="padding: 0px; margin: 0px;"><a name="_Toc296514506" style="color: #336699; padding: 0px; margin: 0px;"><span style="padding: 0px; margin: 0px;"><span style="padding: 0px; margin: 0px;">2.2.3</span><span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="padding: 0px; margin: 0px;">LALP&nbsp;</span></a>运行环境</span></div><div align="left" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><span style="padding: 0px; margin: 0px;"><span style="color: #cc0000;"><strong>消息队列模式</strong></span></span></div><div align="left" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><span style="color: #cc0000;">环境需要满足System V消息队列的运行：</span></div><ul type="disc" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><li style="padding: 0px; margin: 0px 0px 0px 20px; list-style-type: none; list-style-position: initial;"><span style="color: #cc0000;"><span style="padding: 0px; margin: 0px;">系统</span>&nbsp;目前常见的Unix/Linux系统都可满足php(Apache)、java的运行，其中大部分默认支持System V消息队列。</span></li></ul><ul type="disc" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><li style="padding: 0px; margin: 0px 0px 0px 20px; list-style-type: none; list-style-position: initial;"><span style="color: #cc0000;"><span style="padding: 0px; margin: 0px;">php</span>&nbsp;php需要通过消息队列和java进程通信，按php的说明，php在4.3.0版本以后支持System V消息队列。</span></li></ul><ul type="disc" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><li style="padding: 0px; margin: 0px 0px 0px 20px; list-style-type: none; list-style-position: initial;"><span style="color: #cc0000;"><span style="padding: 0px; margin: 0px;">apache</span>&nbsp;无特殊要求，满足php要求即可。</span></li></ul><ul type="disc" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><li style="padding: 0px; margin: 0px 0px 0px 20px; list-style-type: none; list-style-position: initial;"><span style="color: #cc0000;"><span style="padding: 0px; margin: 0px;">java</span>&nbsp;java版本在1.5以后。</span></li></ul><ul type="disc" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><li style="padding: 0px; margin: 0px 0px 0px 20px; list-style-type: none; list-style-position: initial;"><span style="color: #cc0000;">在Unix/Linux环境中，推荐使用消息队列模式。</span></li></ul><div align="left" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><span style="padding: 0px; margin: 0px;"><span style="color: #cc0000;"><strong>socket模式</strong></span></span></div><ul type="disc" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><li style="padding: 0px; margin: 0px 0px 0px 20px; list-style-type: none; list-style-position: initial;"><span style="color: #cc0000;"><span style="padding: 0px; margin: 0px;">系统</span>&nbsp;没有限制，很难找到不支持TCP/IP的系统。</span></li></ul><ul type="disc" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><li style="padding: 0px; margin: 0px 0px 0px 20px; list-style-type: none; list-style-position: initial;"><span style="color: #cc0000;"><span style="padding: 0px; margin: 0px;">php</span>&nbsp;按php的说明，php版本&gt;=4.1.0支持socket</span></li></ul><ul type="disc" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><li style="padding: 0px; margin: 0px 0px 0px 20px; list-style-type: none; list-style-position: initial;"><span style="color: #cc0000;"><span style="padding: 0px; margin: 0px;">apache</span>&nbsp;无特殊要求，满足php要求即可。</span></li></ul><ul type="disc" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><li style="padding: 0px; margin: 0px 0px 0px 20px; list-style-type: none; list-style-position: initial;"><span style="color: #cc0000;"><span style="padding: 0px; margin: 0px;">java</span>&nbsp;java版本在1.5以后。</span></li></ul><ul type="disc" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><li style="padding: 0px; margin: 0px 0px 0px 20px; list-style-type: none; list-style-position: initial;"><span style="color: #cc0000;">Windows系统只能使用socket模式</span></li></ul><div align="left" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><span style="padding: 0px; margin: 0px;"><span style="color: #cc0000;">在开发过程中可以同时使用这两种模式，比如一般开发者使用Windows环境，而程序部署在Linux系统中，LAJP在模式的配置上和编码无关。</span></span></div><div style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><span style="padding: 0px; margin: 0px;"><span style="font-size: 18px; padding: 0px; margin: 0px;"><a name="_Toc296514507" style="color: #336699; padding: 0px; margin: 0px;"><span style="padding: 0px; margin: 0px;"><span style="font-size: 14px; padding: 0px; margin: 0px;">2.2.4</span><span style="padding: 0px; margin: 0px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="font-size: 14px; padding: 0px; margin: 0px;">部署</span></a></span></span></div><div style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><span style="padding: 0px; margin: 0px;">2.2.4.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;分布式架构</span></div><div align="left" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;">在重要的、关键性的业务场景中，用户交互层和业务层是分开部署的，LAJP在此类架构中可以这样使用：</div><div align="left" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><a href="http://img1.51cto.com/attachment/201106/234045687.jpg" target="_blank" style="color: #336699; text-decoration: initial; padding: 0px; margin: 0px;"><img alt="" src="http://img1.51cto.com/attachment/201106/234045687.jpg" border="0" style="border: none; max-width: 100%; padding: 0px; margin: 0px; vertical-align: top;" /></a>&nbsp;</div><div align="left" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;">WEB服务器中的Java是非常&#8220;薄&#8221;的一层，仅用来连接后面的EJB服务。</div><div style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><span style="padding: 0px; margin: 0px;">2.2.4.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;集群</span></div><div align="left" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;">随着用户访问量的增加，WEB服务往往成为系统中的瓶颈，下面是LAJP在集群中的架构参考：</div><div align="left" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;">&nbsp;</div><p style="color: #333333; font-size: 14px; padding-top: 0px; padding-bottom: 15px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><a href="http://img1.51cto.com/attachment/201106/234148580.jpg" target="_blank" style="color: #336699; text-decoration: initial; padding: 0px; margin: 0px;"><span style="color: #000000;"><img alt="" src="http://img1.51cto.com/attachment/201106/234148580.jpg" border="0" style="border: none; max-width: 100%; padding: 0px; margin: 0px; vertical-align: top;" /></span></a></p><div style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><span style="padding: 0px; margin: 0px;">2.2.4.3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;web集群</span></div><div align="left" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;">通过使用socket通讯模式的LAJP，可以搭建出简单的分布式的WEB集群架构：</div><div align="left" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;">&nbsp;</div><p style="color: #333333; font-size: 14px; padding-top: 0px; padding-bottom: 15px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><a href="http://img1.51cto.com/attachment/201106/234215946.jpg" target="_blank" style="color: #336699; text-decoration: initial; padding: 0px; margin: 0px;"><span style="color: #000000;"><img alt="" src="http://img1.51cto.com/attachment/201106/234215946.jpg" width="650" border="0" style="border: none; max-width: 100%; padding: 0px; margin: 0px; vertical-align: top;" /></span></a></p><div style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><span style="padding: 0px; margin: 0px;">2.2.4.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;复杂架构应用</span></div><div align="left" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;">LAJP使用的灵活性，架构的设计和选择更多在于我们自己的思想，下面的架构参考在WEB层、EJB层都使用了集群：</div><div align="left" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;">&nbsp;</div><p style="color: #333333; font-size: 14px; padding-top: 0px; padding-bottom: 15px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;"><a href="http://img1.51cto.com/attachment/201106/234232162.jpg" target="_blank" style="color: #336699; text-decoration: initial; padding: 0px; margin: 0px;"><span style="color: #000000;"><img alt="" src="http://img1.51cto.com/attachment/201106/234232162.jpg" width="650" border="0" style="border: none; max-width: 100%; padding: 0px; margin: 0px; vertical-align: top;" /></span></a></p><div align="left" style="color: #333333; font-size: 14px; padding: 0px; margin: 0px; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px;">memcache是分布式的内存对象缓存技术，在PHP中可以非常方便的将Session数据存储在其中，来同步WEB集群中各节点中的数据，从这里也可以体现到PHP在WEB领域相对于Java的&#8220;专业&#8221;。</div><img src ="http://www.cnitblog.com/stomic/aggbug/90236.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2015-10-22 18:18 <a href="http://www.cnitblog.com/stomic/archive/2015/10/22/90236.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转）Java基础学习总结——Java对象的序列化和反序列化</title><link>http://www.cnitblog.com/stomic/archive/2015/10/22/90235.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Thu, 22 Oct 2015 09:49:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2015/10/22/90235.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/90235.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2015/10/22/90235.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/90235.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/90235.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Java基础学习总结&#8212;&#8212;Java对象的序列化和反序列化    一、序列化和反序列化的概念　　把对象转换为字节序列的过程称为对象的序列化。　　把字节序列恢复为对象的过程称为对象的反序列化。　　对象的序列化主要有两种用途：　　1） 把对象的字节序列永久地保存到硬盘上，通常存放在一个文件中；　　2） 在网络上传送对象的字节序列。　　在很多应用中，需要对某些对象进行序列...&nbsp;&nbsp;<a href='http://www.cnitblog.com/stomic/archive/2015/10/22/90235.html'>阅读全文</a><img src ="http://www.cnitblog.com/stomic/aggbug/90235.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2015-10-22 17:49 <a href="http://www.cnitblog.com/stomic/archive/2015/10/22/90235.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转）缓存、缓存算法和缓存框架简介</title><link>http://www.cnitblog.com/stomic/archive/2015/09/16/90212.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Wed, 16 Sep 2015 09:52:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2015/09/16/90212.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/90212.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2015/09/16/90212.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/90212.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/90212.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 引言我们都听过 cache，当你问他们是什么是缓存的时候，他们会给你一个完美的答案，可是他们不知道缓存是怎么构建的，或者没有告诉你应该采用什么标准去选择缓存框架。在这边文章，我们会去讨论缓存，缓存算法，缓存框架以及哪个缓存框架会更好。面试&#8220;缓存就是存贮数据（使用频繁的数据）的临时地方，因为取原始数据的代价太大了，所以我可以取得快一些。&#8221;这就是 programmer one ...&nbsp;&nbsp;<a href='http://www.cnitblog.com/stomic/archive/2015/09/16/90212.html'>阅读全文</a><img src ="http://www.cnitblog.com/stomic/aggbug/90212.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2015-09-16 17:52 <a href="http://www.cnitblog.com/stomic/archive/2015/09/16/90212.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转）Dubbo框架探讨</title><link>http://www.cnitblog.com/stomic/archive/2015/08/25/90185.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Tue, 25 Aug 2015 09:33:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2015/08/25/90185.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/90185.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2015/08/25/90185.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/90185.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/90185.html</trackback:ping><description><![CDATA[<h2><span style="line-height: 1.5;">1. Dubbo是什么？</span></h2><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;"><span style="line-height: 1.5;">Dubbo是一个分布式服务框架，致力于提供高性能和透明化的RPC远程服务调用方案，以及SOA服务治理方案。简单的说，</span><span style="line-height: 1.5;"><span style="line-height: 1.5;">dubbo就是个服务框架，如果没有分布式的需求，其实是不需要用的，只有在分布式的时候，才有dubbo这样的分布式服务框架的需求，并且本质上是个服务调用的东东，<span style="line-height: 1.5; color: #ff0000;"><strong>说白了就是个远程服务调用的分布式框架（告别<span style="line-height: 1.5;">Web Service模式中的WSdl，以服务者与消费者的方式在dubbo上注册</span>）</strong></span></span></span><br /><span style="line-height: 1.5;">其核心部分包含:</span><br /><span style="line-height: 1.5;">1. 远程通讯: 提供对多种基于长连接的NIO框架抽象封装，包括多种线程模型，序列化，以及&#8220;请求-响应&#8221;模式的信息交换方式。</span><br /><span style="line-height: 1.5;">2. 集群容错: 提供基于接口方法的透明远程过程调用，包括多协议支持，以及软负载均衡，失败容错，地址路由，动态配置等集群支持。</span><br /><span style="line-height: 1.5;">3. 自动发现: 基于注册中心目录服务，使服务消费方能动态的查找服务提供方，使地址透明，使服务提供方可以平滑增加或减少机器。</span></p><h2><a name="t1"></a><span style="line-height: 1.5;">2. Dubbo能做什么？</span></h2><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;"><span style="line-height: 1.5;">1.透明化的远程方法调用，就像调用本地方法一样调用远程方法，只需简单配置，没有任何API侵入。 &nbsp; &nbsp; &nbsp;<br />2.软负载均衡及容错机制，可在内网替代F5等硬件负载均衡器，降低成本，减少单点。<br />3. 服务自动注册与发现，不再需要写死服务提供方地址，注册中心基于接口名查询服务提供者的IP地址，并且能够平滑添加或删除服务提供者。<br /><br /></span><span style="line-height: 1.5;">Dubbo采用全Spring配置方式，透明化接入应用，对应用没有任何API侵入，只需用Spring加载Dubbo的配置即可，Dubbo基于Spring的Schema扩展进行加载。</span><span style="line-height: 1.5;"><br /></span></p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;"><span style="line-height: 1.5; color: #ff0000;"><strong>之前使用Web Service，我想测试接口可以通过模拟消息的方式通过soapui或LR进行功能测试或性能测试。但现在使用Dubbo，接口之间不能直接交互，我尝试通过模拟消费者地址测试，结果不堪入目，再而使用jmeter通过junit进行测试，但还是需要往dubbo上去注册，如果再不给提供源代码的前提下，这个测试用例不好写啊....</strong></span></p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">&nbsp;</p><h2><a name="t2"></a>3. dubbo的架构</h2><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19.5px;"><span style="line-height: 1.5;">dubbo</span><span style="line-height: 1.5;">架构图如下所示：</span></div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19.5px;">&nbsp;</div><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;"><img src="http://img.blog.csdn.net/20131224140734734" alt="" style="border: 0px;" /></p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">&nbsp;</p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">&nbsp;</p><h4><a name="t3"></a>节点角色说明：</h4><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Provider:&nbsp;暴露服务的服务提供方。</p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Consumer:&nbsp;调用远程服务的服务消费方。</p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Registry:&nbsp;服务注册与发现的注册中心。</p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Monitor:&nbsp;统计服务的调用次调和调用时间的监控中心。</p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Container:&nbsp;服务运行容器。</p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;"><span style="line-height: 1.5; color: #ff0000;"><strong>这点我觉得非常好，角色分明，可以根据每个节点角色的状态来确定该服务是否正常。</strong></span></p><h4><a name="t4"></a></h4><h4><a name="t5"></a>调用关系说明：</h4><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;"><span style="line-height: 1.5;">0 服务容器负责启动，加载，运行服务提供者。</span></p><h4><a name="t6"></a><span style="line-height: 1.5;">1. 服务提供者在启动时，向注册中心注册自己提供的服务。</span></h4><h4><a name="t7"></a><span style="line-height: 1.5;">2. 服务消费者在启动时，向注册中心订阅自己所需的服务。</span></h4><h4><a name="t8"></a><span style="line-height: 1.5;">3. 注册中心返回服务提供者地址列表给消费者，如果有变更，注册中心将基于长连接推送变更数据给消费者。</span></h4><h4><a name="t9"></a><span style="line-height: 1.5;">4. 服务消费者，从提供者地址列表中，基于软负载均衡算法，选一台提供者进行调用，如果调用失败，再选另一台调用。</span></h4><h4><a name="t10"></a><span style="line-height: 1.5;">5. 服务消费者和提供者，在内存中累计调用次数和调用时间，定时每分钟发送一次统计数据到监控中心。</span></h4><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;"><span style="line-height: 1.5; color: #ff0000;"><strong>dubbo的容错性显而易见，性能方面还没有还得及测，我们系统某页面需要掉5次接口，本来想建议做个缓存，但业务关系不能采纳，还需要研究下dubbo的性能调优问题...</strong></span></p><h2><a name="t11"></a>4. dubbo使用方法。</h2><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;"><span style="line-height: 1.5;">Dubbo采用全Spring配置方式，透明化接入应用，对应用没有任何API侵入，只需用Spring加载Dubbo的配置即可，Dubbo基于Spring的Schema扩展进行加载。</span><span style="line-height: 1.5;">如果不想使用Spring配置，而希望通过API的方式进行调用（不推荐）</span></p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;"><span style="line-height: 1.5;">下面我们就来看看spring配置方式的写法:</span></p><h4><a name="t12"></a>服务提供者：</h4><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;"><span style="line-height: 1.5;">1.&nbsp;下载zookeeper注册中心，下载地址：<a href="http://www.apache.org/dyn/closer.cgi/zookeeper/" target="_blank" style="color: navy;"><span style="line-height: 1.5;">http://www.apache.org/dyn/closer.cgi/zookeeper/</span></a>&nbsp;&nbsp;下载后解压即可，进入D:\apach-zookeeper-3.4.5\bin，</span></p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;"><span style="line-height: 1.5;">双击zkServer.cmd启动注册中心服务。</span></p><h4><a name="t13"></a><span style="line-height: 1.5;">2.&nbsp;定义服务接口: (该接口需单独打包，在服务提供方和消费方共享)</span></h4><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">&nbsp;</p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">&nbsp;<strong><span style="line-height: 1.5; color: #ff0000;">下面这个例子不错，写的很详细可以做个model.</span></strong></p><div bg_html"="" style="word-break: break-word;"><ol start="1" style="padding-left: 50px;"><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;"><span style="line-height: 1.5;">package&nbsp;com.unj.dubbotest.provider;&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">import&nbsp;java.util.List;&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">public&nbsp;interface&nbsp;DemoService&nbsp;{&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;sayHello(String&nbsp;name);&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;List&nbsp;getUsers();&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">}&nbsp;&nbsp;</span></li></ol></div><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;"><br /><span style="line-height: 1.5;">在服务提供方实现接口：(对服务消费方隐藏实现)</span></p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">&nbsp;</p><div bg_html"="" style="word-break: break-word;"><ol start="1" style="padding-left: 50px;"><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;"><span style="line-height: 1.5;">package&nbsp;com.unj.dubbotest.provider;&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">import&nbsp;java.util.ArrayList;&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">import&nbsp;java.util.LinkedList;&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">import&nbsp;java.util.List;&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">public&nbsp;class&nbsp;DemoServiceImpl&nbsp;implements&nbsp;DemoService{&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;sayHello(String&nbsp;name)&nbsp;{&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"Hello&nbsp;"&nbsp;+&nbsp;name;&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;List&nbsp;getUsers()&nbsp;{&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;<span style="line-height: 1.5;">list</span><span style="line-height: 1.5;">&nbsp;=&nbsp;</span><span style="line-height: 1.5;">new</span><span style="line-height: 1.5;">&nbsp;ArrayList();&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;User&nbsp;<span style="line-height: 1.5;">u1</span><span style="line-height: 1.5;">&nbsp;=&nbsp;</span><span style="line-height: 1.5;">new</span><span style="line-height: 1.5;">&nbsp;User();&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u1.setName("jack");&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u1.setAge(20);&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u1.setSex("男");&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;User&nbsp;<span style="line-height: 1.5;">u2</span><span style="line-height: 1.5;">&nbsp;=&nbsp;</span><span style="line-height: 1.5;">new</span><span style="line-height: 1.5;">&nbsp;User();&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u2.setName("tom");&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u2.setAge(21);&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u2.setSex("女");&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;User&nbsp;<span style="line-height: 1.5;">u3</span><span style="line-height: 1.5;">&nbsp;=&nbsp;</span><span style="line-height: 1.5;">new</span><span style="line-height: 1.5;">&nbsp;User();&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u3.setName("rose");&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u3.setAge(19);&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u3.setSex("女");&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(u1);&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(u2);&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(u3);&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;list;&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">}&nbsp;&nbsp;</span></li></ol></div><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">&nbsp;</p><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19.5px;">用Spring配置声明暴露服务：</div><div bg_html"="" style="word-break: break-word;"><ol start="1" style="padding-left: 50px;"><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;"><span style="line-height: 1.5;">&lt;?</span><span style="line-height: 1.5;">xml</span>&nbsp;<span style="line-height: 1.5;">version</span><span style="line-height: 1.5;">=</span><span style="line-height: 1.5;">"1.0"</span>&nbsp;<span style="line-height: 1.5;">encoding</span><span style="line-height: 1.5;">=</span><span style="line-height: 1.5;">"UTF-8"</span><span style="line-height: 1.5;">?&gt;</span><span style="line-height: 1.5;">&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;"><span style="line-height: 1.5;">&lt;</span><span style="line-height: 1.5;">beans</span>&nbsp;<span style="line-height: 1.5;">xmlns</span><span style="line-height: 1.5;">=</span><span style="line-height: 1.5;">"http://www.springframework.org/schema/beans"</span><span style="line-height: 1.5;">&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="line-height: 1.5;">xmlns:xsi</span><span style="line-height: 1.5;">=</span><span style="line-height: 1.5;">"http://www.w3.org/2001/XMLSchema-instance"</span><span style="line-height: 1.5;">&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="line-height: 1.5;">xmlns:dubbo</span><span style="line-height: 1.5;">=</span><span style="line-height: 1.5;">"http://code.alibabatech.com/schema/dubbo"</span><span style="line-height: 1.5;">&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="line-height: 1.5;">xsi:schemaLocation</span><span style="line-height: 1.5;">="http://www.springframework.org/schema/beans&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/beans/spring-beans.xsd&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://code.alibabatech.com/schema/dubbo&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://code.alibabatech.com/schema/dubbo/dubbo.xsd&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"<span style="line-height: 1.5;">&gt;</span><span style="line-height: 1.5;">&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="line-height: 1.5;">&lt;!--&nbsp;具体的实现bean&nbsp;--&gt;</span><span style="line-height: 1.5;">&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="line-height: 1.5;">&lt;</span><span style="line-height: 1.5;">bean</span>&nbsp;<span style="line-height: 1.5;">id</span><span style="line-height: 1.5;">=</span><span style="line-height: 1.5;">"demoService"</span>&nbsp;<span style="line-height: 1.5;">class</span><span style="line-height: 1.5;">=</span><span style="line-height: 1.5;">"com.unj.dubbotest.provider.DemoServiceImpl"</span>&nbsp;<span style="line-height: 1.5;">/&gt;</span><span style="line-height: 1.5;">&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="line-height: 1.5;">&lt;!--&nbsp;提供方应用信息，用于计算依赖关系&nbsp;--&gt;</span><span style="line-height: 1.5;">&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="line-height: 1.5;">&lt;</span><span style="line-height: 1.5;">dubbo:application</span>&nbsp;<span style="line-height: 1.5;">name</span><span style="line-height: 1.5;">=</span><span style="line-height: 1.5;">"xixi_provider"</span><span style="line-height: 1.5;">&nbsp;&nbsp;</span><span style="line-height: 1.5;">/&gt;</span><span style="line-height: 1.5;">&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;使用multicast广播注册中心暴露服务地址&nbsp;&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="line-height: 1.5;">&lt;</span><span style="line-height: 1.5;">dubbo:registry</span>&nbsp;<span style="line-height: 1.5;">address</span><span style="line-height: 1.5;">=</span><span style="line-height: 1.5;">"multicast://224.5.6.7:1234"</span>&nbsp;<span style="line-height: 1.5;">/&gt;</span><span style="line-height: 1.5;">--</span><span style="line-height: 1.5;">&gt;</span><span style="line-height: 1.5;">&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="line-height: 1.5;">&lt;!--&nbsp;使用zookeeper注册中心暴露服务地址&nbsp;--&gt;</span><span style="line-height: 1.5;">&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="line-height: 1.5;">&lt;</span><span style="line-height: 1.5;">dubbo:registry</span>&nbsp;<span style="line-height: 1.5;">address</span><span style="line-height: 1.5;">=</span><span style="line-height: 1.5;">"zookeeper://127.0.0.1:2181"</span>&nbsp;<span style="line-height: 1.5;">/&gt;</span><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="line-height: 1.5;">&lt;!--&nbsp;用dubbo协议在20880端口暴露服务&nbsp;--&gt;</span><span style="line-height: 1.5;">&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="line-height: 1.5;">&lt;</span><span style="line-height: 1.5;">dubbo:protocol</span>&nbsp;<span style="line-height: 1.5;">name</span><span style="line-height: 1.5;">=</span><span style="line-height: 1.5;">"dubbo"</span>&nbsp;<span style="line-height: 1.5;">port</span><span style="line-height: 1.5;">=</span><span style="line-height: 1.5;">"20880"</span>&nbsp;<span style="line-height: 1.5;">/&gt;</span><span style="line-height: 1.5;">&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="line-height: 1.5;">&lt;!--&nbsp;声明需要暴露的服务接口&nbsp;--&gt;</span><span style="line-height: 1.5;">&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="line-height: 1.5;">&lt;</span><span style="line-height: 1.5;">dubbo:service</span>&nbsp;<span style="line-height: 1.5;">interface</span><span style="line-height: 1.5;">=</span><span style="line-height: 1.5;">"com.unj.dubbotest.provider.DemoService"</span>&nbsp;<span style="line-height: 1.5;">ref</span><span style="line-height: 1.5;">=</span><span style="line-height: 1.5;">"demoService"</span>&nbsp;<span style="line-height: 1.5;">/&gt;</span><span style="line-height: 1.5;">&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;"><span style="line-height: 1.5;">&lt;/</span><span style="line-height: 1.5;">beans</span><span style="line-height: 1.5;">&gt;</span><span style="line-height: 1.5;">&nbsp;&nbsp;</span></span></li></ol></div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19.5px;">加载Spring配置，启动服务：</div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19.5px;"><div bg_html"="" style="word-break: break-word;"><ol start="1" style="padding-left: 50px;"><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;"><span style="line-height: 1.5;">package&nbsp;com.unj.dubbotest.provider;&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">import&nbsp;org.springframework.context.support.ClassPathXmlApplicationContext;&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">public&nbsp;class&nbsp;Provider&nbsp;{&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;throws&nbsp;Exception&nbsp;{&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClassPathXmlApplicationContext&nbsp;<span style="line-height: 1.5;">context</span><span style="line-height: 1.5;">&nbsp;=&nbsp;</span><span style="line-height: 1.5;">new</span><span style="line-height: 1.5;">&nbsp;ClassPathXmlApplicationContext(new&nbsp;String[]&nbsp;{"applicationContext.xml"});&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context.start();&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.in.read();&nbsp;//&nbsp;为保证服务一直开着，利用输入流的阻塞来模拟&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">}&nbsp;&nbsp;</span></li></ol></div><br /><h4><a name="t14"></a>服务消费者：</h4><p style="line-height: 1.5; margin: 10px auto;"><strong><span style="line-height: 1.5; color: #ff0000;">&nbsp;applicationContext-dubbo.xml 中注册自己需要调用的接口，我刚开始测试的时候需要的接口很多，所以把这个文件写的满满的，后来熟悉了把接口按业务类型分开，写了N多个<strong><span style="line-height: 1.5;">&nbsp;applicationContext-dubbo-***.xml 简练多了 》。&nbsp;</span></strong></span></strong></p><p style="line-height: 1.5; margin: 10px auto;">&nbsp;</p></div><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19.5px;"><span style="line-height: 1.5;">1.通过Spring配置引用远程服务：</span><div><div bg_html"="" style="word-break: break-word;"><ol start="1" style="padding-left: 50px;"><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;"><span style="line-height: 1.5;">&lt;?</span><span style="line-height: 1.5;">xml</span>&nbsp;<span style="line-height: 1.5;">version</span><span style="line-height: 1.5;">=</span><span style="line-height: 1.5;">"1.0"</span>&nbsp;<span style="line-height: 1.5;">encoding</span><span style="line-height: 1.5;">=</span><span style="line-height: 1.5;">"UTF-8"</span><span style="line-height: 1.5;">?&gt;</span><span style="line-height: 1.5;">&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;"><span style="line-height: 1.5;">&lt;</span><span style="line-height: 1.5;">beans</span>&nbsp;<span style="line-height: 1.5;">xmlns</span><span style="line-height: 1.5;">=</span><span style="line-height: 1.5;">"http://www.springframework.org/schema/beans"</span><span style="line-height: 1.5;">&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="line-height: 1.5;">xmlns:xsi</span><span style="line-height: 1.5;">=</span><span style="line-height: 1.5;">"http://www.w3.org/2001/XMLSchema-instance"</span>&nbsp;<span style="line-height: 1.5;">xmlns:dubbo</span><span style="line-height: 1.5;">=</span><span style="line-height: 1.5;">"http://code.alibabatech.com/schema/dubbo"</span><span style="line-height: 1.5;">&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="line-height: 1.5;">xsi:schemaLocation</span><span style="line-height: 1.5;">="http://www.springframework.org/schema/beans&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/beans/spring-beans.xsd&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://code.alibabatech.com/schema/dubbo&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://code.alibabatech.com/schema/dubbo/dubbo.xsd&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"<span style="line-height: 1.5;">&gt;</span><span style="line-height: 1.5;">&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="line-height: 1.5;">&lt;!--&nbsp;消费方应用名，用于计算依赖关系，不是匹配条件，不要与提供方一样&nbsp;--&gt;</span><span style="line-height: 1.5;">&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="line-height: 1.5;">&lt;</span><span style="line-height: 1.5;">dubbo:application</span>&nbsp;<span style="line-height: 1.5;">name</span><span style="line-height: 1.5;">=</span><span style="line-height: 1.5;">"hehe_consumer"</span>&nbsp;<span style="line-height: 1.5;">/&gt;</span><span style="line-height: 1.5;">&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="line-height: 1.5;">&lt;!--&nbsp;使用zookeeper注册中心暴露服务地址&nbsp;--&gt;</span><span style="line-height: 1.5;">&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="line-height: 1.5;">&lt;!--&nbsp;&lt;dubbo:registry&nbsp;address="multicast://224.5.6.7:1234"&nbsp;/&gt;&nbsp;--&gt;</span><span style="line-height: 1.5;">&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="line-height: 1.5;">&lt;</span><span style="line-height: 1.5;">dubbo:registry</span>&nbsp;<span style="line-height: 1.5;">address</span><span style="line-height: 1.5;">=</span><span style="line-height: 1.5;">"zookeeper://127.0.0.1:2181"</span>&nbsp;<span style="line-height: 1.5;">/&gt;</span><span style="line-height: 1.5;">&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="line-height: 1.5;">&lt;!--&nbsp;生成远程服务代理，可以像使用本地bean一样使用demoService&nbsp;--&gt;</span><span style="line-height: 1.5;">&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="line-height: 1.5;">&lt;</span><span style="line-height: 1.5;">dubbo:reference</span>&nbsp;<span style="line-height: 1.5;">id</span><span style="line-height: 1.5;">=</span><span style="line-height: 1.5;">"demoService"</span><span style="line-height: 1.5;">&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="line-height: 1.5;">interface</span><span style="line-height: 1.5;">=</span><span style="line-height: 1.5;">"com.unj.dubbotest.provider.DemoService"</span>&nbsp;<span style="line-height: 1.5;">/&gt;</span><span style="line-height: 1.5;">&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;"><span style="line-height: 1.5;">&lt;/</span><span style="line-height: 1.5;">beans</span><span style="line-height: 1.5;">&gt;</span><span style="line-height: 1.5;">&nbsp;&nbsp;</span></span></li></ol></div><br /><div><span style="line-height: 1.5;">2.加载Spring配置，并调用远程服务：</span></div><div><div bg_html"="" style="word-break: break-word;"><ol start="1" style="padding-left: 50px;"><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;"><span style="line-height: 1.5;">package&nbsp;com.alibaba.dubbo.demo.pp;&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">import&nbsp;java.util.List;&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">import&nbsp;org.springframework.context.support.ClassPathXmlApplicationContext;&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">import&nbsp;com.unj.dubbotest.provider.DemoService;&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">public&nbsp;class&nbsp;Consumer&nbsp;{&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;throws&nbsp;Exception&nbsp;{&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClassPathXmlApplicationContext&nbsp;<span style="line-height: 1.5;">context</span><span style="line-height: 1.5;">&nbsp;=&nbsp;</span><span style="line-height: 1.5;">new</span><span style="line-height: 1.5;">&nbsp;ClassPathXmlApplicationContext(&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;String[]&nbsp;{&nbsp;"applicationContext.xml"&nbsp;});&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context.start();&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DemoService&nbsp;<span style="line-height: 1.5;">demoService</span><span style="line-height: 1.5;">&nbsp;=&nbsp;(DemoService)&nbsp;context.getBean("demoService");&nbsp;//&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;<span style="line-height: 1.5;">hello</span><span style="line-height: 1.5;">&nbsp;=&nbsp;</span><span style="line-height: 1.5;">demoService</span><span style="line-height: 1.5;">.sayHello("tom");&nbsp;//&nbsp;ִ&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(hello);&nbsp;//&nbsp;&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;<span style="line-height: 1.5;">list</span><span style="line-height: 1.5;">&nbsp;=&nbsp;</span><span style="line-height: 1.5;">demoService</span><span style="line-height: 1.5;">.getUsers();&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(list&nbsp;!=&nbsp;null&nbsp;&amp;&amp;&nbsp;list.size()&nbsp;<span style="line-height: 1.5;">&gt;</span><span style="line-height: 1.5;">&nbsp;0)&nbsp;{&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;<span style="line-height: 1.5;">i</span><span style="line-height: 1.5;">&nbsp;=&nbsp;</span><span style="line-height: 1.5;">0</span><span style="line-height: 1.5;">;&nbsp;i&nbsp;</span><span style="line-height: 1.5;">&lt;</span>&nbsp;<span style="line-height: 1.5;">list.size</span><span style="line-height: 1.5;">();&nbsp;i++)&nbsp;{&nbsp;&nbsp;</span></span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(list.get(i));&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;System.out.println(demoService.hehe());&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.in.read();&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">&nbsp;&nbsp;</span></li><li style="list-style-type: decimal; line-height: 1.6;"><span style="line-height: 1.5;">}&nbsp;&nbsp;</span></li></ol></div></div></div></div><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;"><span style="line-height: 1.5;">调用结果为：</span></p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">&nbsp;</p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;"><span style="line-height: 1.5;"><img src="http://img.blog.csdn.net/20131224152934546" alt="" style="border: 0px;" /><br /></span></p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;"><span style="line-height: 1.5;">dubbo管理页面：</span></p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;"><strong><span style="line-height: 1.5; color: #ff0000;">这个管理页面还需要部署一个环境的，一开始我还以为是dubbo自带的，找了半天没有找到....</span></strong></p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">&nbsp;</p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;"><span style="line-height: 1.5;"><img src="http://img.blog.csdn.net/20131224152811531" alt="" style="border: 0px;" /><br /></span></p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">&nbsp;</p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">&nbsp;</p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">&nbsp;</p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">&nbsp;</p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;"><span style="line-height: 1.5;">应用页面：</span></p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;"><img src="http://img.blog.csdn.net/20131224152822062" alt="" style="border: 0px;" /></p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">&nbsp;</p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">&nbsp;</p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">&nbsp;</p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">&nbsp;</p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">提供者页面:</p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;"><img src="http://img.blog.csdn.net/20131224153419968" alt="" style="border: 0px;" /></p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">&nbsp;</p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">&nbsp;</p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">&nbsp;</p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">&nbsp;</p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">消费者页面：</p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;"><img src="http://img.blog.csdn.net/20131224152829015" alt="" style="border: 0px;" /></p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">&nbsp;</p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">&nbsp;</p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">&nbsp;</p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">&nbsp;</p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">服务页面：</p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;"><img src="http://img.blog.csdn.net/20131224152846578" alt="" style="border: 0px;" /></p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;"><span style="line-height: 1.5; color: #ff0000;">测试是否成功，我觉得只要看看状态是否正常，就ok了 ....</span></p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;">&nbsp;</p><p style="font-size: 13px; line-height: 19.5px; margin: 10px auto; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;"><span style="line-height: 1.5;"><span style="line-height: 1.5;">案例代码下载：<a href="http://download.csdn.net/detail/yiyu1/7116319" style="color: navy;">http://download.csdn.net/detail/yiyu1/7116319</a></span></span></p><img src ="http://www.cnitblog.com/stomic/aggbug/90185.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2015-08-25 17:33 <a href="http://www.cnitblog.com/stomic/archive/2015/08/25/90185.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：Java学习路线图，专为新手定制的Java学习计划建议</title><link>http://www.cnitblog.com/stomic/archive/2015/07/14/90145.html</link><dc:creator>大话人生</dc:creator><author>大话人生</author><pubDate>Tue, 14 Jul 2015 07:08:00 GMT</pubDate><guid>http://www.cnitblog.com/stomic/archive/2015/07/14/90145.html</guid><wfw:comment>http://www.cnitblog.com/stomic/comments/90145.html</wfw:comment><comments>http://www.cnitblog.com/stomic/archive/2015/07/14/90145.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/stomic/comments/commentRss/90145.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/stomic/services/trackbacks/90145.html</trackback:ping><description><![CDATA[<p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px;">从网上发现这篇文章，发现和我写的一篇关于《<a href="http://blog.csdn.net/jinxfei/archive/2009/09/27/4602449.aspx" style="color: #336699;">知识体系</a>》的文章互相呼应，就转过来了。</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px;">转自：<a title="http://tieba.baidu.com/f?kz=692446591" href="http://tieba.baidu.com/f?kz=692446591" style="color: #336699;">http://tieba.baidu.com/f?kz=692446591</a></p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px;">怎么学习Java，这是很多新手经常会问我的问题，现在我简单描述下一个Java初学者到就业要学到的一些东西：&nbsp;<br />&nbsp;&nbsp;&nbsp; 首先要明白Java体系设计到得三个方面：J2SE,J2EE,J2ME（KJAVA）。J2SE，Java 2 Platform Standard Edition，我们经常说到的JDK，就主要指的这个，它是三者的基础，属于桌面级应用开发，这部分如果学得好很容易拓展J2EE和J2ME。J2ME，The Micro Edition of the Java 2 Platform。主要用于嵌入式Java，如手机，PDA等等。J2EE，Java 2 Platform，Enterprise Edition，就是所谓的企业级Java，适合企业的大型应用开发。&nbsp;<br />J2SE：&nbsp;<br />&nbsp;&nbsp;&nbsp; 新手最初学习的时候先要从J2SE开始学起，所包含的内容主要分为：面向对象概念的理解、Java基本语法的学习，Java桌面图形界面应用程序的开发，掌握常用的Java API等（关键是要学会怎样查阅）。&nbsp;<br />重点：Java基本语法（循环结构，数据类型，数组，运算符等）、Swing，awt，事件机制、文件输入输出流处理等<br />难点：面向对象思想的理解（接口、类等）、线程、socket网络编程等&nbsp;<br />视频教程推荐：孙鑫的Java基础视频教程、张孝祥的Java基础视频教程，讲的都很细，而且这两位老师在教学方面都有很好的经验。&nbsp;<br />J2EE：&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在学习了J2SE之后，你可以尝试着慢慢过渡到J2EE，当然，学习J2EE海需要很多非JAVA技术的支撑，比如数据库技术，网页编程技术等等，待会我会详细介绍这两方面的内容。J2EE有三个必学的框架，如果你说你学了J2EE，但又不会这三个框架的话，那会让人笑掉大牙，这三个框架分别是Struts、Spring和Hibernate，虽然这三个框架应用很广，但不代表这三个框架就代表了J2EE，J2EE还有很多其他的东西，比如EJB，作为一款重量级（此重量级不是指重量级选手那个意思，此重量级非彼重量级）框架，虽然这个应用慢慢的再被其他框架所取代，但EJB3.0的出现也给它带回一些生机，作为一个分布式应用的框架，也是大家要去学习和了解的知识。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当然，刚才说到J2EE包含的范围很广，即使我把我所了解的所有技术说出来，也并不能代表J2EE，这是一个很深很广的学问，需要大家以后再工作的时候慢慢去发现了。我所了解的还包括：&nbsp;<br />JDBC:Java数据库连接对象，基础中的基础，Hibernate也只是对它的封装而已&nbsp;<br />JNDI: Java 命名与目录接口，J2EE重要规范之一&nbsp;<br />EJBS: 上面已经提到过了&nbsp;<br />RMI: 提供远程调用方法的支持，主要用于程序分布式开发&nbsp;<br />JMS: Java消息服务，中间件技术&nbsp;<br />JAVA IDL: 提供J2EE平台与CORBA交互能力和互联能力的技术&nbsp;<br />JTS: 组件事务监视器&nbsp;<br />JTA: 事务划分的一个技术&nbsp;<br />JAVAMAIL: Java中的邮件技术&nbsp;<br />JAF: Java启动框架,没研究过&nbsp;<br />Log4j，一款日志处理的框架应用&nbsp;<br />Junit：单元测试的好帮手&nbsp;<br />freemarker、velocity：两款不错的模板引擎&nbsp;<br />与Flash的交互Flex：目前很多的SNS应用就是使用到了这个技术&nbsp;<br />Web services:想知道我们论坛天气预报的效果是怎么做的吗？请关注这个技术&nbsp;<br />SOA:面向服务架构，未来技术发展的趋势之一&nbsp;<br />&#8230;&#8230;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不过前面介绍到得这些都不是J2EE的基础,是属于框架应用级别的.要真正把上面说到的知识掌握好,还是的学习J2EE最核心的东西:JDBC、JSP、servlet和JavaBean,后面三个也是学习SSH的基础(Struts/Spring/Hibernate的简称).鉴于J2EE的内容太过复杂,建议大家最初只学习: JSP, servlet和JavaBean，等这个基础掌握好再把SSH学习了，再对其他J2EE技术有个大致的了解就可以出去找工作了。当然，找工作的前提除了把Java学习好，还会有一些其他的技术也是必须要掌握的。</p><p style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px;">-_- 我很简单,Java却要求我学这么多复杂的东西。除了这些技术的东西，在这阶段，大家更多的是会接触到比如设计模式的东西，比如工厂模式、桥梁模式、单例模式等等，还要学习建模思想（比如UML建模等等）和软件生命周期等等。这些是升华大家编程思想的手段和途径。&nbsp;<br />数据库技术:&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; 数据库几乎是程序中不可或缺的一部分,在整个软件开发中更是占据了重要作用.数据库在整个软件中扮演的是地基的角色,你要修房子,就要先打好地基,你要做软件,就要先设计好的数据库.目前数据库几乎都是关系型数据库,代表的有:&nbsp;<br />SQL Server,目前最新的好像是2008,我不是很喜欢追赶时髦,用的还是2005,不过也很不错了,在此之前还有2000.&nbsp;<br />MySQL,最知名的开源数据库之一,我很喜欢它的小巧耐用,学过SQL SERVER数据库再学它,无师自通,易如反掌.&nbsp;<br />ORACLE.甲骨文公司的产品,大型数据库,正版的一般公司买不起.只有看看了,不过现在Java开发60%都是会使用到这个数据库,再加上现在甲骨文已经把sun公司收购了,JAVA和ORACLE得关系更加暧昧,各位得多花些时间在这上面了.&nbsp;<br />除了这些，你还应该了解一些桌面应用软件开发用到的数据库，比如说sqlite。你在制作安装程序的时候可以把这个数据库打包进你的安装程序。&nbsp;<br />网页编程基础:&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; 网页编程基础要学的内容也比较多,但主要集中在以下这三个技术之上,大家每天看的各种样式的网页都是它们呈现的:&nbsp;<br />HTML:超文本标记语言&nbsp;<br />CSS:层叠样式表&nbsp;<br />Javascript:浏览器客户端脚本语言&nbsp;<br />现在更是流行各种JavaScript库,比如:Jquery、ExtJs等，你要是会其中的某一个库的使用，找工作so easy。&nbsp;<br />J2ME：&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; 如果你在学习了以上技术还不过瘾，可以再学习手机程序的开发，就我个人看来，开发手机程序技术其实蛮简单的，难点在于优化，比如怎么让你写的程序尽量的节约手机资源，&#8220;代码诚可贵，手机价更高&#8220;，所以不得不比PC机多考虑很多成本和实用性问题。J2ME的学习的话，切忌不要单纯的再模拟器上测试，一定要找真机测试，真机和模拟器的效果之间差别是很大的。更多手机开发技术，有兴趣的朋友可以和我一起探讨。&nbsp;<br />开发工具：&nbsp;<br />&nbsp;&nbsp;&nbsp; 开发工具的选择主要还是看大家的习惯，我个人比较喜欢使用eclispe，功能很强大，也很好拓展其他的功能。当让初学你也可以选择JCreator，或者最好就直接用记事本。等你熟悉了Java代码之后，就可以使用JBuilder、eclispe或者netbeans这一类的工具了。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; 先说到这里先，以后大家一起完善这个帖子。尽量再给大家整理一些学习的资源在这里。也欢迎大家一起整理我文章中提到的一些技术资源和开发工具。最后，再和大家分享一句话：生命欣欣向荣，唯奋斗不息。也和大家分享一幅Java学习路线图：&nbsp;<br /><a href="http://hi.csdn.net/attachment/201005/4/0_1272935756z51q.gif" style="color: #336699;"><img title="untitled" height="1024" alt="untitled" src="http://hi.csdn.net/attachment/201005/4/0_1272935769KNxA.gif" width="604" border="0" style="border: 0px; max-width: 100%; display: inline;" /></a></p><img src ="http://www.cnitblog.com/stomic/aggbug/90145.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/stomic/" target="_blank">大话人生</a> 2015-07-14 15:08 <a href="http://www.cnitblog.com/stomic/archive/2015/07/14/90145.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>