﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-志当存高远,功到自然成!-随笔分类-架构设计</title><link>http://www.blogjava.net/shanben/category/45926.html</link><description>少年强则中国强,少年进步则中国进步!</description><language>zh-cn</language><lastBuildDate>Thu, 12 Aug 2010 13:53:25 GMT</lastBuildDate><pubDate>Thu, 12 Aug 2010 13:53:25 GMT</pubDate><ttl>60</ttl><item><title>教你使用MySQL触发器自动更新Memcache</title><link>http://www.blogjava.net/shanben/archive/2010/08/12/328679.html</link><dc:creator>存鹰之心于高远,取鹰之志而凌云,习鹰之性以涉险,融鹰之神在山巅.</dc:creator><author>存鹰之心于高远,取鹰之志而凌云,习鹰之性以涉险,融鹰之神在山巅.</author><pubDate>Thu, 12 Aug 2010 07:22:00 GMT</pubDate><guid>http://www.blogjava.net/shanben/archive/2010/08/12/328679.html</guid><wfw:comment>http://www.blogjava.net/shanben/comments/328679.html</wfw:comment><comments>http://www.blogjava.net/shanben/archive/2010/08/12/328679.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shanben/comments/commentRss/328679.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shanben/services/trackbacks/328679.html</trackback:ping><description><![CDATA[<h5 id="digest">mysql 5.1支持触发器以及自定义函数接口(UDF)的特性，如果配合libmemcache以及Memcached Functions for MySQL，就能够实现memcache的自动更新。简单记录一下安装测试步骤。</h5>
<div id="content">
<p>　　mysql 5.1支持触发器以及自定义函数接口(UDF)的特性，如果配合libmemcache以及Memcached Functions for MySQL，就能够实现memcache的自动更新。简单记录一下安装测试步骤。</p>
<p>　　<strong>安装步骤</strong></p>
<p>　　安装memcached,这个步骤很简单，随处可见。安装mysql server 5.1RC，安装办法也很大众，不废话 了。</p>
<p>　　编译libmemcached，解压后安装即可./configure; make; make install</p>
<p>　　编译Memcached Functions for
MySQL，在http://download.tangent.org/找一个最新的版本下载就 是，./configure
--with-mysql=/usr/local/mysql/bin/mysql_config --
libdir=/usr/local/mysql/lib/mysql/</p>
<p>　　make</p>
<p>　　make install</p>
<p>　　接下来有两个办法让Memcached Functions for MySQL在mysql中生效。</p>
<p>　　在mysql的shell中执行memcached_functions_mysql源码目录下的sql/install_functions.sql，这会 把memcache function作为UDF加入mysql。</p>
<p>　　运行memcached_functions_mysql源码目录下的utils/install.pl，这是一个perl脚本，作用同上一 条。</p>
<p>　　测试memcache function。</p>
<p>　　以下测试脚本摘自memcached_functions_mysql的源码目录，有兴趣可以试试。</p>
<table style="border: 1px dotted #cccccc; table-layout: fixed;" align="center" border="0" cellpadding="6" cellspacing="0" width="95%">
    <tbody>
        <tr>
            <td style="word-wrap: break-word;" bgcolor="#f3f3f3"><br />
            PLAIN&nbsp;TEXTCODE:&nbsp;drop&nbsp;table&nbsp;if&nbsp;exists&nbsp;urls; <br />
            create&nbsp;table&nbsp;urls&nbsp;( <br />
            id&nbsp;int(3)&nbsp;not&nbsp;null, <br />
            url&nbsp;varchar(64)&nbsp;not&nbsp;null&nbsp;default&nbsp;'', <br />
            primary&nbsp;key&nbsp;(id) <br />
            ); <br />
            select&nbsp;memc_servers_set('localhost:11211'); <br />
            select&nbsp;memc_set('urls:sequence',&nbsp;0); <br />
            DELIMITER&nbsp;| <br />
            DROP&nbsp;TRIGGER&nbsp;IF&nbsp;EXISTS&nbsp;url_mem_insert; <br />
            CREATE&nbsp;TRIGGER&nbsp;url_mem_insert <br />
            BEFORE&nbsp;INSERT&nbsp;ON&nbsp;urls <br />
            FOR&nbsp;EACH&nbsp;ROW&nbsp;BEGIN <br />
            SET&nbsp;NEW.id=&nbsp;memc_increment('urls:sequence'); <br />
            SET&nbsp;@mm=&nbsp;memc_set(concat('urls:',NEW.id),&nbsp;NEW.url); <br />
            END&nbsp;| <br />
            DELIMITER&nbsp;; <br />
            insert&nbsp;into&nbsp;urls&nbsp;(url)&nbsp;values&nbsp;('http://google.com'); <br />
            insert&nbsp;into&nbsp;urls&nbsp;(url)&nbsp;values&nbsp;('http://www.ooso.net/index.php'); <br />
            insert&nbsp;into&nbsp;urls&nbsp;(url)&nbsp;values&nbsp;('http://www.ooso.net/'); <br />
            insert&nbsp;into&nbsp;urls&nbsp;(url)&nbsp;values&nbsp;('http://slashdot.org'); <br />
            insert&nbsp;into&nbsp;urls&nbsp;(url)&nbsp;values&nbsp;('http://mysql.com'); <br />
            select&nbsp;*&nbsp;from&nbsp;urls; <br />
            select&nbsp;memc_get('urls:1'); <br />
            select&nbsp;memc_get('urls:2'); <br />
            select&nbsp;memc_get('urls:3'); <br />
            select&nbsp;memc_get('urls:4'); <br />
            select&nbsp;memc_get('urls:5');</td>
        </tr>
    </tbody>
</table>
</div>
<img src ="http://www.blogjava.net/shanben/aggbug/328679.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shanben/" target="_blank">存鹰之心于高远,取鹰之志而凌云,习鹰之性以涉险,融鹰之神在山巅.</a> 2010-08-12 15:22 <a href="http://www.blogjava.net/shanben/archive/2010/08/12/328679.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java版的memcached client及使用文档</title><link>http://www.blogjava.net/shanben/archive/2010/08/11/328581.html</link><dc:creator>存鹰之心于高远,取鹰之志而凌云,习鹰之性以涉险,融鹰之神在山巅.</dc:creator><author>存鹰之心于高远,取鹰之志而凌云,习鹰之性以涉险,融鹰之神在山巅.</author><pubDate>Wed, 11 Aug 2010 15:21:00 GMT</pubDate><guid>http://www.blogjava.net/shanben/archive/2010/08/11/328581.html</guid><wfw:comment>http://www.blogjava.net/shanben/comments/328581.html</wfw:comment><comments>http://www.blogjava.net/shanben/archive/2010/08/11/328581.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shanben/comments/commentRss/328581.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shanben/services/trackbacks/328581.html</trackback:ping><description><![CDATA[假设我们有3台memcached 服务器,server1 和server2 有3GB 的内存空间,server3 有2GB 的内存空间.<br />
下面程序说明怎么来创建客户端.<br />
import com.danga.MemCached.*;<br />
<br />
public class MyClass {<br />
<br />
// 创建一个 memcached 客户端对象<br />
<br />
protected static MemCachedClient mcc = new MemCachedClient();<br />
<br />
// 创建&nbsp;&nbsp;memcached连接池<br />
<br />
static<br />
<br />
{&nbsp;&nbsp;// 指定memcached服务地址 String[] servers =<br />
{ "server1.mydomain.com:1121","server2.mydomain.com:1121",<br />
"server3.mydomain.com:1121" };<br />
// 指定memcached服务器负载量<br />
Integer[]&nbsp;&nbsp;weights&nbsp;&nbsp;&nbsp;&nbsp;={ 3, 3, 2 };<br />
// 从连接池获取一个连接实例<br />
<br />
SockIOPool pool = SockIOPool.getInstance();<br />
<br />
// 设置服务器和服务器负载量<br />
<br />
pool.setServers( servers );<br />
<br />
pool.setWeights( weights );<br />
<br />
// 设置一些基本的参数<br />
<br />
//设置初始连接数5&nbsp;&nbsp; 最小连接数 5&nbsp;&nbsp; 最大连接数 250<br />
<br />
//设置一个连接最大空闲时间6小时<br />
<br />
pool.setInitConn( 5 );<br />
<br />
pool.setMinConn( 5 );<br />
<br />
pool.setMaxConn( 250 );<br />
<br />
pool.setMaxIdle( 1000 * 60 * 60 * 6 );<br />
<br />
// 设置主线程睡眠时间<br />
<br />
// 每隔30秒醒来&nbsp;&nbsp;然后<br />
<br />
// 开始维护 连接数大小<br />
<br />
pool.setMaintSleep( 30 );<br />
<br />
// 设置tcp 相关的树形<br />
<br />
// 关闭nagle算法<br />
<br />
// 设置 读取 超时3秒钟&nbsp;&nbsp;set the read timeout to 3 secs<br />
<br />
//&nbsp;&nbsp;不设置连接超时<br />
<br />
pool.setNagle( false );<br />
<br />
pool.setSocketTO( 3000 );<br />
<br />
pool.setSocketConnectTO( 0 );<br />
<br />
// 开始初始化 连接池<br />
<br />
pool.initialize();<br />
<br />
// 设置压缩模式<br />
<br />
//如果超过64k压缩数据<br />
<br />
mcc.setCompressEnable( true );<br />
<br />
mcc.setCompressThreshold( 64 * 1024 );<br />
<br />
}<br />
<br />
public static void examples() {<br />
<br />
mcc.set( "foo", "This is a test String" );<br />
<br />
String bar = mcc.get( "foo" );<br />
<br />
}<br />
<br />
}<br />
MemCachedClient 类 常用的方法说明<br />
<br />
创建 client对象 设置参数:<br />
<br />
MemCachedClient mc = new MemCachedClient();<br />
//压缩模式<br />
mc.setCompressEnable(true);<br />
// 如果 cache数据 大于4 KB&nbsp;&nbsp;就启用压缩<br />
mc.setCompressThreshold(4096);<br />
// 基本类型tostring方法<br />
// 通常不需要设置<br />
mc.setPrimitiveAsString(true);<br />
存储一个对象:<br />
<br />
MemCachedClient mc = new MemCachedClient();<br />
<br />
String key&nbsp;&nbsp; = "cacheKey1";<br />
<br />
Object value = SomeClass.getObject();<br />
<br />
mc.set(key, value);<br />
用客户端hashcode 存储一个对象:<br />
<br />
<br />
MemCachedClient mc = new MemCachedClient();<br />
<br />
String key&nbsp;&nbsp; = "cacheKey1";<br />
<br />
Object value = SomeClass.getObject();<br />
<br />
Integer hash = new Integer(45);<br />
<br />
mc.set(key, value, hash);<br />
<br />
set方法：在cache中存储一个指定对象<br />
<br />
&nbsp;&nbsp; add 和replace 方法功能差不多<br />
<br />
&nbsp;&nbsp;add -- 如果不存在 这个key的对象，将会存储一个对象到cache中<br />
&nbsp;&nbsp;replace --只有当存在指定key对象的时候 会覆盖已有对象<br />
删除一个对象:<br />
<br />
MemCachedClient mc = new MemCachedClient();<br />
<br />
String key&nbsp;&nbsp; = "cacheKey1";<br />
<br />
mc.delete(key);<br />
结合hashcode 删除一个对象:<br />
<br />
MemCachedClient mc = new MemCachedClient();<br />
<br />
String key&nbsp;&nbsp; = "cacheKey1";<br />
<br />
Integer hash = new Integer(45);<br />
<br />
mc.delete(key, hashCode);<br />
怎么cache计数，增 减计数:<br />
<br />
MemCachedClient mc = new MemCachedClient();<br />
<br />
String key&nbsp;&nbsp; = "counterKey";<br />
<br />
mc.storeCounter(key, new Integer(100));<br />
<br />
System.out.println("counter after adding&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1: " mc.incr(key));<br />
<br />
System.out.println("counter after adding&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5: " mc.incr(key, 5));<br />
<br />
System.out.println("counter after subtracting 4: " mc.decr(key, 4));<br />
<br />
System.out.println("counter after subtracting 1: " mc.decr(key));<br />
利用客户端的hashcode存储计数 增减 计数:<br />
<br />
MemCachedClient mc = new MemCachedClient();<br />
<br />
String key&nbsp;&nbsp; = "counterKey";<br />
<br />
Integer hash = new Integer(45);<br />
<br />
mc.storeCounter(key, new Integer(100), hash);<br />
<br />
System.out.println("counter after adding&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1: " mc.incr(key, 1, hash));<br />
<br />
System.out.println("counter after adding&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5: " mc.incr(key, 5, hash));<br />
<br />
System.out.println("counter after subtracting 4: " mc.decr(key, 4, hash));<br />
<br />
System.out.println("counter after subtracting 1: " mc.decr(key, 1, hash));<br />
获取一个对象:<br />
<br />
MemCachedClient mc = new MemCachedClient();<br />
<br />
String key&nbsp;&nbsp; = "key";<br />
<br />
Object value = mc.get(key);<br />
用客户端hashcode获取一个对象:<br />
<br />
MemCachedClient mc = new MemCachedClient();<br />
<br />
String key&nbsp;&nbsp; = "key";<br />
<br />
Integer hash = new Integer(45);<br />
<br />
Object value = mc.get(key, hash);<br />
MemCachedClient mc = new MemCachedClient();<br />
<br />
String key&nbsp;&nbsp; = "key";<br />
<br />
Integer hash = new Integer(45);<br />
<br />
Object value = mc.get(key, hash);<br />
从cache 中获取多个对象<br />
<br />
MemCachedClient mc = new MemCachedClient();<br />
<br />
String[] keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;={ "key", "key1", "key2" };Mapvalues = mc.getMulti(keys);<br />
用客户端hashcode 从cache中获取多个对象<br />
MemCachedClient mc = new MemCachedClient();<br />
String[] keys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= { "key", "key1", "key2" };<br />
<br />
Integer[] hashes&nbsp;&nbsp; =<br />
{ new Integer(45), new Integer(32), new Integer(44) };<br />
Mapvalues = mc.getMulti(keys, hashes);<br />
清空所有的对象<br />
MemCachedClient mc = new MemCachedClient();<br />
<br />
mc.flushAll();<br />
得到服务器memcached的状态信息<br />
MemCachedClient mc = new MemCachedClient();<br />
<br />
Map stats = mc.stats();<br />
注意点<br />
1：Failover/Failback<br />
当一个memcached服务器失效的时候客户端默认会failover另一个服务去.<br />
<br />
如果失效的服务器 恢复运行，客户端会返回到原来连接的服务器.<br />
如果你不想用这个功能 设置下面的参数<br />
pool.setFailover( false );<br />
pool.setFailback( false ); <br />
<br />
2：序列化<br />
<br />
Boolean<br />
Byte<br />
String<br />
Character<br />
StringBuffer<br />
StringBuilder<br />
Short<br />
Long<br />
Double<br />
Float<br />
Date<br />
java默认的类型没有实现序列化 可以设置<br />
mcc.setPrimitiveAsString( true )替代. <br />
Meetup.com实践过程中得出的一个经验 ，项目中model 对象implement Externalizable 实现序列化，<br />
可以节省cache 对象的大小。从而节省网络带宽和内存空间。
<img src ="http://www.blogjava.net/shanben/aggbug/328581.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shanben/" target="_blank">存鹰之心于高远,取鹰之志而凌云,习鹰之性以涉险,融鹰之神在山巅.</a> 2010-08-11 23:21 <a href="http://www.blogjava.net/shanben/archive/2010/08/11/328581.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>高负载、高并发网站架构知识汇总-大流量网站架构的几点认识</title><link>http://www.blogjava.net/shanben/archive/2010/08/11/328534.html</link><dc:creator>存鹰之心于高远,取鹰之志而凌云,习鹰之性以涉险,融鹰之神在山巅.</dc:creator><author>存鹰之心于高远,取鹰之志而凌云,习鹰之性以涉险,融鹰之神在山巅.</author><pubDate>Wed, 11 Aug 2010 06:32:00 GMT</pubDate><guid>http://www.blogjava.net/shanben/archive/2010/08/11/328534.html</guid><wfw:comment>http://www.blogjava.net/shanben/comments/328534.html</wfw:comment><comments>http://www.blogjava.net/shanben/archive/2010/08/11/328534.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shanben/comments/commentRss/328534.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shanben/services/trackbacks/328534.html</trackback:ping><description><![CDATA[<p style="font: 12px song,Verdana;"><span style="color: #000000; font-family: song,Verdana; font-size: 12px; border-collapse: collapse;"><strong><span style="color: teal;"><font id="aeaoofnhgocdbnbeljkmbjdmhbcokfdb-mousedown" size="3">一：硬架构</font>
</span>
</strong>
</span>
</p>
<p style="font: 12px song,Verdana;"><span style="color: #000000; font-family: song,Verdana; font-size: 12px; border-collapse: collapse;"><font size="3"><font face="宋体"><span style="color: teal;">1</span>
<span style="color: teal;">：机房的选择：</span>
</font>
</font>
</span>
</p>
<p style="font: 12px song,Verdana;"><span style="color: #000000; font-family: song,Verdana; font-size: 12px; border-collapse: collapse;"><span style="color: teal;"><font size="3" face="宋体">在
选择机房的时候，根据网站用户的地域分布，可以选择网通或电信机房，但更多时候，可能双线机房才是合适的。越大的城市，机房价格越贵，从成本的角度看可以
在一些中小城市托管服务器，比如说广州的公司可以考虑把服务器托管在东莞，佛山等地，不是特别远，但是价格会便宜很多。</font>
</span>
</span>
</p>
<p style="font: 12px song,Verdana;"><span style="color: #000000; font-family: song,Verdana; font-size: 12px; border-collapse: collapse;"><font size="3"><font face="宋体"><span style="color: teal;">2</span>
<span style="color: teal;">：带宽的大小：</span>
</font>
</font>
</span>
</p>
<p style="font: 12px song,Verdana;"><span style="color: #000000; font-family: song,Verdana; font-size: 12px; border-collapse: collapse;"><span style="color: teal;"><font size="3" face="宋体">通常老板花钱请我们架构网站的时候，会给我们提出一些目标，诸如网站每天要能承受100
万PV
的访问量等等。这时我们要预算一下大概需要多大的带宽，计算带宽大小主要涉及两个指标（峰值流量和页面大小），我们不妨在计算前先做出必要的假设：</font>
</span>
</span>
</p>
<p style="font: 12px song,Verdana;"><span style="color: #000000; font-family: song,Verdana; font-size: 12px; border-collapse: collapse;"><span style="color: teal;"><font size="3" face="宋体">第一：假设峰值流量是平均流量的5
倍。</font>
<br style="font: 12px song,Verdana;" />
<font size="3" face="宋体">第二：假设每次访问平均的页面大小是100K
字节左右。</font>
</span>
</span>
</p>
<p style="font: 12px song,Verdana;"><span style="color: #000000; font-family: song,Verdana; font-size: 12px; border-collapse: collapse;"><span style="color: teal;"><font size="3" face="宋体">如果100
万PV
的访问量在一天内平均分布的话，折合到每秒大约12
次访问，如果按平均每次访问页面的大小是100K
字节左右计算的话，这12
次访 问总计大约就是1200K
字节，字节的单位是Byte
，而带宽的单位是bit
，它们之间的关系是1Byte = 8bit
，所以1200K Byte
大致就相当于9600K bit
，也就是9Mbps
的样子，实际情况中，我们的网站必须能在峰值流量时保持正常访问，所以按照假设的峰值流量算，真实带宽的需求应该在45Mbps&nbsp;
左右。</font>
</span>
</span>
</p>
<p style="font: 12px song,Verdana;"><span style="color: #000000; font-family: song,Verdana; font-size: 12px; border-collapse: collapse;"><span style="color: teal;"><font size="3" face="宋体">当然，这个结论是建立在前面提到的两点假设的基础上，如果你的实际情况和这两点假设有出入，那么结果也会有差别。</font>
</span>
</span>
</p>
<p style="font: 12px song,Verdana;"><span style="color: #000000; font-family: song,Verdana; font-size: 12px; border-collapse: collapse;"><font size="3"><font face="宋体"><span style="color: teal;">3</span>
<span style="color: teal;">：服务器的划分：</span>
</font>
</font>
</span>
</p>
<p style="font: 12px song,Verdana;"><span style="color: #000000; font-family: song,Verdana; font-size: 12px; border-collapse: collapse;"><span style="color: teal;"><font size="3" face="宋体">先看我们都需要哪些服务器：图片服务器，页面服务器，数据库服务器，应用服务器，日志服务器等等。</font>
</span>
</span>
</p>
<p style="font: 12px song,Verdana;"><span style="color: #000000; font-family: song,Verdana; font-size: 12px; border-collapse: collapse;"><span style="color: teal;"><font size="3" face="宋体">对于访问量大点的网站而言，分离单独的图片服务器和页面服务器相当必要，我们可以用lighttpd
来跑图片服务器，用apache
来跑页面服务 器，当然也可以选择别的，甚至，我们可以扩展成很多台图片服务器和很多台页面服务器，并设置相关域名，如img.domain.com
和&nbsp;www.domain.com
，页面里的图片路径都使用绝对路径，如&lt;img src="http://img.domain.com/abc.gif" /&gt;
，然后设置DNS
轮循，达到最初级的负载均衡。当然，服务器多了就不可避免的涉及一个同步的问题，这个可以使用rsync
软件来搞定。</font>
</span>
</span>
</p>
<p style="font: 12px song,Verdana;"><span style="color: #000000; font-family: song,Verdana; font-size: 12px; border-collapse: collapse;"><span style="color: teal;"><font size="3" face="宋体">数据库服务器是重中之重，因为网站的瓶颈问题十有八九是出在数据库身上。现在一般的中小网站多使用MySQL
数据库，不过它的集群功能似乎还没有达 到stable
的阶段，所以这里不做评价。一般而言，使用MySQL
数据库的时候，我们应该搞一个主从（一主多从）结构，主数据库服务器使用innodb&nbsp;
表结构，从数据服务器使用myisam
表结构，充分发挥它们各自的优势，而且这样的主从结构分离了读写操作，降低了读操作的压力，甚至我们还可以设定一个专门的从服务器做备份服务器，方便备份。不然如果你只有一台主服务器，在大数据量的情况下，mysqldump
基本就没戏了，直接拷贝数据文件的话，还得先停止数据库服务再拷贝，否则备份文件会出错。但对于很多网站而言，即使数据库服务仅停止了一秒也是不可接受的。如果你有了一台从数据库服务器，在备份数 据的时候，可以先停止服务（slave stop
）再备份，再启动服务（slave start
）后从服务器会自动从主服务器同步数据，一切都没有影响。但是主从结构也是有致命缺点的，那就是主从结构只是降低了读操作的压力，却不能降低写操作的压力。为了适应更大的规模，可能只剩下最后这招了：横向/
纵向分割数据库。所谓横向分割数据库，就是把不同的表保存到不同的数据库服务器上，比如说用户表保存在A
数据库服务器上，文章表保存在B
数据库服务器上，当然这样的分割是有代价的，最基本的就是你没法进行LEFT JOIN
之类的操作了。所谓纵向分割数据库，一般是指按照用户标识（user_id
）等来划分数据存储的服务器，比如说：我们有5
台数据库服务器，那么&nbsp;&#8220;user_id % 5 + 1&#8221;
等于1
的就保存到1
号服务器，等于2
的就保存到2
好服务器，以此类推，纵向分隔的原则有很多种，可以视情况选择。不过和横向分割数据库一样，纵向分割 数据库也是有代价的，最基本的就是我们在进行如COUNT, SUM
等汇总操作的时候会麻烦很多。综上所述，数据库服务器的解决方案一般视情况往往是一个混合的方案，以其发挥各种方案的优势，有时候还需要借助&nbsp;memcached
之类的第三方软件，以便适应更大访问量的要求。</font>
</span>
</span>
</p>
<p style="font: 12px song,Verdana;"><span style="color: #000000; font-family: song,Verdana; font-size: 12px; border-collapse: collapse;"><span style="color: teal;"><font size="3" face="宋体">如果有专门的应用服务器来跑PHP
脚本是最合适不过的了，那样我们的页面服务器只保存静态页面就可以了，可以给应用服务器设置一些诸如&nbsp;app.domain.com
之类的域名来和页面服务器加以区别。对于应用服务器，我还是更倾向于使用prefork
模式的apache
，配上必要的&nbsp;xcache
之类的PHP
缓存软件，加载模块要越少越好，除了mod_rewrite
等必要的模块，不必要的东西统统舍弃，尽量减少httpd
进程的内存消耗，而那些图片服务器，页面服务器等静态内容就可以使用lighttpd
或者tux
来搞，充分发挥各种服务器的特点。</font>
</span>
</span>
</p>
<p style="font: 12px song,Verdana;"><span style="color: #000000; font-family: song,Verdana; font-size: 12px; border-collapse: collapse;"><span style="color: teal;"><font size="3" face="宋体">如果条件允许，独立的日志服务器也是必要的，一般小网站的做法都是把页面服务器和日志服务器合二为一了，在凌晨访问量不大的时候cron
运行前一天 的日志计算，不过如果你使用awstats
之类的日志分析软件，对于百万级访问量而言，即使按天归档，也会消耗很多时间和服务器资源去计算，所以分离单独的日志服务器还是有好处的，这样不会影响正式服务器的工作状态。</font>
</span>
</span>
</p>
<p style="font: 12px song,Verdana;"><span style="color: #000000; font-family: song,Verdana; font-size: 12px; border-collapse: collapse;"><strong><span style="color: teal;"><font size="3">二：软架构</font>
</span>
</strong>
</span>
</p>
<p style="font: 12px song,Verdana;"><span style="color: #000000; font-family: song,Verdana; font-size: 12px; border-collapse: collapse;"><font size="3"><font face="宋体"><span style="color: teal;">1</span>
<span style="color: teal;">：框架的选择：</span>
</font>
</font>
</span>
</p>
<p style="font: 12px song,Verdana;"><span style="color: #000000; font-family: song,Verdana; font-size: 12px; border-collapse: collapse;"><span style="color: teal;"><font size="3" face="宋体">现在的PHP
框架有很多选择，比如：CakePHP
，Symfony
，Zend Framework
等等，至于应该使用哪一个并没有唯一的答案，要根据Team
里团队成员对各个框架的了解程度而定。很多时候，即使没有使用框架，一样能写出好的程序来，比如Flickr
据说就是用Pear+Smarty
这样的类库写出来的，所以是否用框架，用什么框架，一般不是最重要，重要的是我们的编程思想里要有框架的意识。</font>
<br style="font: 12px song,Verdana;" />
<br style="font: 12px song,Verdana;" />
<font size="3" face="宋体">现在的.NET
框架有很多选择，比如：cnForums
，.text
，cs, Castle,
等等</font>
</span>
</span>
</p>
<p style="font: 12px song,Verdana;"><span style="color: #000000; font-family: song,Verdana; font-size: 12px; border-collapse: collapse;"><font size="3"><font face="宋体"><span style="color: teal;">2</span>
<span style="color: teal;">：逻辑的分层：</span>
</font>
</font>
</span>
</p>
<p style="font: 12px song,Verdana;"><span style="color: #000000; font-family: song,Verdana; font-size: 12px; border-collapse: collapse;"><span style="color: teal;"><font size="3" face="宋体">网站规模到了一定的程度之后，代码里各种逻辑纠缠在一起，会给维护和扩展带来巨大的障碍，这时我们的解决方式其实很简单，那就是重构，将逻辑进行分层。通常，自上而下可以分为表现层，应用层，领域层，持久层。</font>
</span>
</span>
</p>
<p style="font: 12px song,Verdana;"><span style="color: #000000; font-family: song,Verdana; font-size: 12px; border-collapse: collapse;"><span style="color: teal;"><font size="3" face="宋体">所
谓表现层，并不仅仅就指模板，它的范围要更广一些，所有和表现相关的逻辑都应该被纳入表现层的范畴。比如说某处的字体要显示为红色，某处的开头要空两格，
这些都属于表现层。很多时候，我们容易犯的错误就是把本属于表现层的逻辑放到了其他层面去完成，这里说一个很常见的例子：我们在列表页显示文章标题的时
候，都会设定一个最大字数，一旦标题长度超过了这个限制，就截断，并在后面显示&#8220;..&#8221;
，这就是最典型的表现层逻辑，但是实际情况，有很多程序员都是在非表现层代码里完成数据的获取和截断，然后赋值给表现层模板，这样的代码最直接的缺点就是同样一段数据，在这个页面我可能想显示前10
个字，再另一个 页面我可能想显示前15
个字，而一旦我们在程序里固化了这个字数，也就丧失了可移植性。正确的做法是应该做一个视图助手之类的程序来专门处理此类逻辑，比如说：Smarty
里的truncate
就属于这样的视图助手（不过它那个实现不适合中文）。</font>
</span>
</span>
</p>
<p style="font: 12px song,Verdana;"><span style="color: #000000; font-family: song,Verdana; font-size: 12px; border-collapse: collapse;"><span style="color: teal;"><font size="3" face="宋体">所谓应用层，它的主要作用是定义用户可以做什么，并把操作结果反馈给表现层。至于如何做，通常不是它的职责范围（而是领域层的职责范围），它会通过委派把如何做的工作交给领域层去处理。在使用MVC
架构的网站中，我们可以看到类似下面这样的URL
：domain.com/articles/view/123
，其内部编码实现，一般就是一个Articles
控制器类，里面有一个view
方法，这就是一 个典型的应用层操作，因为它定义了用户可以做一个查看的动作。在MVC
架构中，有一个准则是这么说的：Rich Model Is Good
。言外之意，就是Controller
要保持&#8220;
瘦&#8221;
一些比较好，进而说明应用层要尽量简单，不要包括涉及领域内容的逻辑。</font>
</span>
</span>
</p>
<p style="font: 12px song,Verdana;"><span style="color: #000000; font-family: song,Verdana; font-size: 12px; border-collapse: collapse;"><span style="color: teal;"><font size="3" face="宋体">所谓领域层，最直接的解释就是包含领域逻辑的层。它是一个软件的灵魂所在。先来看看什么叫领域逻辑，简单的说，具有明确的领域概念的逻辑就是领域逻辑，比如我们在ATM
机上取钱，过程大致是这样的：插入银联卡，输入密码，输入取款金额，确定，拿钱，然后ATM
吐出一个交易凭条。在这个过程中，银联卡 在ATM
机器里完成钱从帐户上划拨的过程就是一个领域逻辑，因为取钱在银行中是一个明确的领域概念，而ATM
机吐出一个交易凭条则不是领域逻辑，而仅是一
个应用逻辑，因为吐出交易凭条并不是银行中一个明确的领域概念，只是一种技术手段，对应的，我们取钱后不吐交易凭条，而发送一条提醒短信也是可能的，但并
不是一定如此，如果在实际情况中，我们要求取款后必须吐出交易凭条，也就是说吐出交易凭条已经和取款紧密结合，那么你也可以把吐出交易凭条看作是领域逻辑
的一部分，一切都以问题的具体情况而定。在Eric
那本经典的领域驱动设计中，把领域层分为了五种基本元素：实体，值对象，服务，工厂，仓储。具体可以参 阅书中的介绍。领域层最常犯的错误就是把本应属于领域层的逻辑泄露到了其他层次，比如说在一个CMS
系统，对热门文章的定义是这样的：每天被浏览的次数多 于1000
次，被评论的次数多于100
次，这样的文章就是热门文章。对于一个CMS
来说，热门文章这个词无疑是一个重要的领域概念，那么我们如何实现这个逻辑的设计的？你可能会给出类似下面的代码：&#8220;SELECT ... FROM ... WHERE&nbsp;
浏览&nbsp;&gt; 1000 AND&nbsp;
评论<span>&nbsp;&gt;&nbsp;100&#8221;
</span>
，没错，这是最简单的实现方式，但是这里需要注意的是&#8220;
每天被浏览的次数多于1000
次，被评论的次数多于100
次&#8221;
这个重要的领域逻辑被隐藏到了SQL
语句中，SQL
语句显然不属于领域层的范畴，也就是说，我们的领域逻辑泄露了。</font>
</span>
</span>
</p>
<p><span style="color: #000000; font-family: song,Verdana; font-size: 12px; border-collapse: collapse;"><span style="font-size: 10.5pt; color: teal;">所谓持久层，就是指把我们的领域模型保存到数据库中。因为我们的程序代码是面向对象风格的，而数据库一般是关系型的数据库，所以我们需要把领域模型&nbsp;碾平，才能保存到数据库中，但是在</span>
<span style="font-size: 10.5pt; color: teal;">PHP</span>
<span style="font-size: 10.5pt; color: teal;">里，直到目前还没有非常好的</span>
<span style="font-size: 10.5pt; color: teal;">ORM</span>
<span style="font-size: 10.5pt; color: teal;">出现，所以这方面的解决方案不是特别多，参考</span>
<span style="font-size: 10.5pt; color: teal;">Martin</span>
<span style="font-size: 10.5pt; color: teal;">的企业应用架构模式一</span>
&nbsp;
<span style="font-size: 10.5pt; color: teal;">书，大致可以使用的方法有行数据入口（</span>
<span style="font-size: 10.5pt; color: teal;">Row Data Gateway</span>
<span style="font-size: 10.5pt; color: teal;">）或者表数据入口（</span>
<span style="font-size: 10.5pt; color: teal;">Table Data Gateway），或者把领域层和持久层合二为一变成活动记录（Active Record）的方式。</span>
</span>
</p>
<img src ="http://www.blogjava.net/shanben/aggbug/328534.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shanben/" target="_blank">存鹰之心于高远,取鹰之志而凌云,习鹰之性以涉险,融鹰之神在山巅.</a> 2010-08-11 14:32 <a href="http://www.blogjava.net/shanben/archive/2010/08/11/328534.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>分布式缓存系统Memcached简介与实践</title><link>http://www.blogjava.net/shanben/archive/2010/08/11/328531.html</link><dc:creator>存鹰之心于高远,取鹰之志而凌云,习鹰之性以涉险,融鹰之神在山巅.</dc:creator><author>存鹰之心于高远,取鹰之志而凌云,习鹰之性以涉险,融鹰之神在山巅.</author><pubDate>Wed, 11 Aug 2010 06:22:00 GMT</pubDate><guid>http://www.blogjava.net/shanben/archive/2010/08/11/328531.html</guid><wfw:comment>http://www.blogjava.net/shanben/comments/328531.html</wfw:comment><comments>http://www.blogjava.net/shanben/archive/2010/08/11/328531.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shanben/comments/commentRss/328531.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shanben/services/trackbacks/328531.html</trackback:ping><description><![CDATA[<p>分布式缓存系统Memcached简介与实践</p>
<p><a href="http://blog.csdn.net/hitman9099/archive/2008/09/04/2878417.aspx" target="_blank">http://blog.csdn.net/hitman9099/archive/2008/09/04/2878417.aspx</a></p>
<p>&nbsp;</p>
<p><span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: #000000; text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2;"></span></p>
<p style="padding: 0px; margin: 1em 0px 0.5em;">缘起: 在数据驱动的web开发中，经常要重复从数据库中取出相同的数据，这种重复极大的增加了数据库负载。缓存是解决这个问题的好办法。但是ASP.NET中的虽然已经可以实现对页面局部进行缓存，但还是不够灵活。此时Memcached或许是你想要的。<br />
<br />
<strong>Memcached是什么?<br />
</strong>Memcached是由Danga Interactive开发的，高性能的，分布式的内存对象缓存系统，用于在动态应用中减少数据库负载，提升访问速度。<br />
<br />
<strong>Memcached能缓存什么？<br />
</strong>通过在内存里维护一个统一的巨大的hash表，Memcached能够用来存储各种格式的数据，包括图像、视频、文件以及数据库检索的结果等。<br />
<br />
<strong>Memcached快么？<br />
</strong><br />
非
常快。Memcached使用了libevent（如果可以的话，在linux下使用epoll）来均衡任何数量的打开链接，使用非阻塞的网络I/O，对
内部对象实现引用计数(因此，针对多样的客户端，对象可以处在多样的状态)， 使用自己的页块分配器和哈希表，
因此虚拟内存不会产生碎片并且虚拟内存分配的时间复杂度可以保证为O(1).。<br />
<br />
Danga Interactive为提升Danga
Interactive的速度研发了Memcached。目前，LiveJournal.com每天已经在向一百万用户提供多达两千万次的页面访问。而这
些，是由一个由web服务器和数据库服务器组成的集群完成的。Memcached几乎完全放弃了任何数据都从数据库读取的方式，同时，它还缩短了用户查看
页面的速度、更好的资源分配方式，以及Memcache失效时对数据库的访问速度。<br />
<br />
<strong>Memcached的特点</strong><br />
Memcached的缓存是一种分布式的，可以让不同主机上的多个用户同时访问， 因此解决了共享内存只能单机应用的局限，更不会出现使用数据库做类似事情的时候，磁盘开销和阻塞的发生。<br />
<br />
<strong>Memcached的使用<span class="Apple-converted-space">&nbsp;</span><br />
一<span class="Apple-converted-space">&nbsp;</span></strong>Memcached服务器端的安装 （此处将其作为系统服务安装）<br />
下载文件：<a title="memcached 1.2.1 for win32 binaries (dec 23, 2006)" style="color: #006bad; text-decoration: none;" href="http://jehiah.cz/projects/memcached-win32/files/memcached-1.2.1-win32.zip" target="_blank"><font color="#1d58d1"><u>memcached 1.2.1 for Win32 binaries (Dec 23, 2006)</u></font></a><br />
&nbsp;&nbsp;&nbsp; 1 解压缩文件到c:\memcached<br />
&nbsp;&nbsp; 2 命令行输入 'c:\memcached\memcached.exe -d install'<span class="Apple-converted-space">&nbsp;</span><br />
&nbsp;&nbsp;&nbsp; 3 命令行输入 'c:\memcached\memcached.exe -d start' ，该命令启动 Memcached ，默认监听端口为 11211<br />
通过 memcached.exe -h 可以查看其帮助</p>
<p style="padding: 0px; margin: 1em 0px 0.5em;">&nbsp;</p>
<p style="padding: 0px; margin: 1em 0px 0.5em;">一个简单的测试例子</p>
<div class="highlighter">
<ol class="highlighter-j" style="padding: 0px; margin: 5px 0px 5px 35px; list-style-type: none;">
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span class="keyword">package</span><span>&nbsp;com.mapbar.util.cache;</span></li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><br />
    </li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span class="keyword">import</span><span>&nbsp;java.util.Date;</span></li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span class="keyword">import</span><span>&nbsp;java.util.ResourceBundle;</span></li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><br />
    </li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span class="keyword">import</span><span>&nbsp;com.danga.MemCached.MemCachedClient;</span></li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span class="keyword">import</span><span>&nbsp;com.danga.MemCached.SockIOPool;</span></li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span class="comment">/**</span></li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span class="comment">&nbsp;*&nbsp;使用配置文件方式的memcache组件</span></li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span class="comment">&nbsp;*</span></li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span class="comment">&nbsp;*/</span></li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Cache&nbsp;{</span></li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><br />
    </li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;</span><span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;ResourceBundle&nbsp;rb=ResourceBundle.getBundle(</span><span class="string">"memcached"</span><span>);;</span></li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;MemCachedClient&nbsp;mcc&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;MemCachedClient();&nbsp;</span></li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;{</span></li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;init();</span></li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;init(){</span></li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;</span><span class="keyword">synchronized</span><span>&nbsp;(mcc)&nbsp;{&nbsp;&nbsp;</span></li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"init&nbsp;call"</span><span>);</span></li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;String[]&nbsp;servers&nbsp;=rb.getString(</span><span class="string">"cache.servers"</span><span>).split(</span><span class="string">","</span><span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;strWeights&nbsp;=rb.getString(</span><span class="string">"cache.weights"</span><span>).split(</span><span class="string">","</span><span>);&nbsp;&nbsp;</span></li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer[]&nbsp;weights&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Integer[strWeights.length];</span></li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(</span><span class="keyword">int</span><span>&nbsp;i=</span><span class="number">0</span><span>;i&lt;strWeights.length;i++){</span></li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;weights[i]=Integer.parseInt(strWeights[i]);</span></li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//创建一个实例对象SockIOPool&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SockIOPool&nbsp;pool&nbsp;=&nbsp;SockIOPool.getInstance();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;set&nbsp;the&nbsp;servers&nbsp;and&nbsp;the&nbsp;weights&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//设置Memcached&nbsp;Server&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool.setServers(&nbsp;servers&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool.setWeights(&nbsp;weights&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool.setInitConn(Integer.parseInt(rb.getString(</span><span class="string">"cache.initConn"</span><span>)));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool.setMinConn(Integer.parseInt(rb.getString(</span><span class="string">"cache.minConn"</span><span>)));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool.setMaxConn(Integer.parseInt(rb.getString(</span><span class="string">"cache.maxConn"</span><span>)));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool.setMaxIdle(Long.parseLong(rb.getString(</span><span class="string">"cache.maxIdle"</span><span>)));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;set&nbsp;the&nbsp;sleep&nbsp;for&nbsp;the&nbsp;maint&nbsp;thread&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;it&nbsp;will&nbsp;wake&nbsp;up&nbsp;every&nbsp;x&nbsp;seconds&nbsp;and&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;maintain&nbsp;the&nbsp;pool&nbsp;size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool.setMaintSleep(&nbsp;</span><span class="number">30</span><span>&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tcp的规则就是在发送一个包之前，本地机器会等待远程主机&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对上一次发送的包的确认信息到来；这个方法就可以关闭套接字的缓存，&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以至这个包准备好了就发；&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool.setNagle(&nbsp;</span><span class="keyword">false</span><span>&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//连接建立后对超时的控制&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool.setSocketTO(&nbsp;</span><span class="number">3000</span><span>&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//连接建立时对超时的控制&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool.setSocketConnectTO(&nbsp;</span><span class="number">0</span><span>&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;initialize&nbsp;the&nbsp;connection&nbsp;pool&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//初始化一些值并与MemcachedServer段建立连接&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool.initialize();&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><br />
    </li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;lets&nbsp;set&nbsp;some&nbsp;compression&nbsp;on&nbsp;for&nbsp;the&nbsp;client&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;compress&nbsp;anything&nbsp;larger&nbsp;than&nbsp;64k&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mcc.setCompressEnable(&nbsp;</span><span class="keyword">true</span><span>&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mcc.setCompressThreshold(&nbsp;</span><span class="number">64</span><span>&nbsp;*&nbsp;</span><span class="number">1024</span><span>&nbsp;);&nbsp;&nbsp;</span></li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;}</span></li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;}</span></li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;</span><span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;bulidCache(){&nbsp;&nbsp;</span></li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;</span></li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//set(key,value,Date)&nbsp;,Date是一个过期时间，如果想让这个过期时间生效的话，这里传递的new&nbsp;Date(long&nbsp;date)&nbsp;中参数date，需要是个大于或等于1000的值。&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//因为java&nbsp;client的实现源码里是这样实现的&nbsp;expiry.getTime()&nbsp;/&nbsp;1000&nbsp;，也就是说，如果&nbsp;小于1000的值，除以1000以后都是0，即永不过期&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mcc.set(&nbsp;</span><span class="string">"test"</span><span>,&nbsp;</span><span class="string">"This&nbsp;is&nbsp;a&nbsp;test&nbsp;String"</span><span>&nbsp;,</span><span class="keyword">new</span><span>&nbsp;Date(</span><span class="number">100000</span><span>));&nbsp;&nbsp;&nbsp;</span><span class="comment">//十秒后过期&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;</span><span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;output()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//从cache里取值&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;value&nbsp;=&nbsp;(String)&nbsp;mcc.get(&nbsp;</span><span class="string">"test"</span><span>&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(value);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bulidCache();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><br />
    </li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><span>}</span></li>
    <li class="alt" style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><br />
    </li>
    <li style="padding: 2px 0px; margin: 0px; list-style-type: decimal;"><br />
    </li>
</ol>
</div>
<p style="padding: 0px; margin: 1em 0px 0.5em;">其中在classespath下有个memcached.properties文件</p>
<p style="padding: 0px; margin: 1em 0px 0.5em;">内容如下：</p>
<p style="padding: 0px; margin: 1em 0px 0.5em;">##muti servers spilt by ,</p>
<p style="padding: 0px; margin: 1em 0px 0.5em;"><font color="#ff0000">#这里是你的memcached启动的地址</font><br />
cache.servers=192.168.0.116:11211&nbsp;<span class="Apple-converted-space">&nbsp;</span><br />
cache.weights=1<br />
#memcached be used<br />
cache.cluster=true</p>
<p style="padding: 0px; margin: 1em 0px 0.5em;">#set some basic pool settings&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Apple-converted-space">&nbsp;</span><br />
#5 initial, 5 min, and 250 max conns&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Apple-converted-space">&nbsp;</span><br />
#and set the max idle time for a conn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Apple-converted-space">&nbsp;</span><br />
#to 6 hours&nbsp; 6*60*60*1000<br />
cache.initConn=5<br />
cache.minConn=5<br />
cache.maxConn=250<br />
cache.maxIdle=21600000</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>在Windows下安装Memcached</p>
<p><a href="http://www.oschina.net/docs/article/4" target="_blank">http://www.oschina.net/docs/article/4</a></p>
<p><span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: #000000; text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2;"><span class="Apple-style-span" style="font-size: 13px; line-height: 22px; font-family: 'Segoe UI',Arial,Helvetica,sans-serif,宋体; text-align: left;"> </span></span></p>
<p style="padding: 0px; margin: 5px 0px 10px; text-indent: 0em;">很多phper不知道如何在Windows下搭建Memcache的开发调试环境，最近个人也在研究Memcache，记录下自己安装搭建的过程。<br style="padding: 0px; margin: 0px;" />
其实我开始研究Memcache的时候并不知道居然还有memcached for Win32这个鸟东西，害得我在CnetOS下折腾1天才搞定，今天突然发现Windows下的Memcache进行开发调试完全没有问题，所以写篇 Memcache的文档分享给大家。</p>
<p style="padding: 0px; margin: 5px 0px 10px; text-indent: 0em;"><strong style="padding: 0px; margin: 0px;">Windows下的Memcache安装</strong>：<br style="padding: 0px; margin: 0px;" />
1. 下载<a style="padding: 0px; margin: 0px; color: #3e62a6;" href="http://www.oschina.net/p/memcached+for+win32" target="_blank">memcache</a>的 windows稳定版，解压放某个盘下面，比如在c:\memcached<br style="padding: 0px; margin: 0px;" />
2. 在终端（也即cmd命令界面）下输入 &#8216;c:\memcached\memcached.exe -d install&#8217; 安装<br style="padding: 0px; margin: 0px;" />
3. 再输入： &#8216;c:\memcached\memcached.exe -d start&#8217; 启动。NOTE: 以后memcached将作为windows的一个服务每次开机时自动启动。这样服务器端已经安装完毕了。<br style="padding: 0px; margin: 0px;" />
4.下载<a style="padding: 0px; margin: 0px; color: #3e62a6;" href="http://pecl4win.php.net/list.php" target="_blank">php_memcache.dll</a>， 请自己查找对应的php版本的文件<br style="padding: 0px; margin: 0px;" />
5. 在C:\winnt\php.ini 加入一行 &#8216;extension=php_memcache.dll&#8217;<br style="padding: 0px; margin: 0px;" />
6.重新启动Apache，然后查看一下phpinfo，如果有memcache，那么就说明安装成功！</p>
<p style="padding: 0px; margin: 5px 0px 10px; text-indent: 0em;"><strong style="padding: 0px; margin: 0px;">memcached的基本设置</strong>：</p>
<blockquote style="padding: 0px; margin: 0px;">
<p style="padding: 0px; margin: 5px 0px 10px; text-indent: 0em;">-p 监听的端口<br style="padding: 0px; margin: 0px;" />
-l 连接的IP地址, 默认是本机<br style="padding: 0px; margin: 0px;" />
-d start 启动memcached服务<br style="padding: 0px; margin: 0px;" />
-d restart 重起memcached服务<br style="padding: 0px; margin: 0px;" />
-d stop|shutdown 关闭正在运行的memcached服务<br style="padding: 0px; margin: 0px;" />
-d install 安装memcached服务<br style="padding: 0px; margin: 0px;" />
-d uninstall 卸载memcached服务<br style="padding: 0px; margin: 0px;" />
-u 以的身份运行 (仅在以root运行的时候有效)<br style="padding: 0px; margin: 0px;" />
-m 最大内存使用，单位MB。默认64MB<br style="padding: 0px; margin: 0px;" />
-M 内存耗尽时返回错误，而不是删除项<br style="padding: 0px; margin: 0px;" />
-c 最大同时连接数，默认是1024<br style="padding: 0px; margin: 0px;" />
-f 块大小增长因子，默认是1.25<br style="padding: 0px; margin: 0px;" />
-n 最小分配空间，key+value+flags默认是48<br style="padding: 0px; margin: 0px;" />
-h 显示帮助</p>
</blockquote>
<p style="padding: 0px; margin: 5px 0px 10px; text-indent: 0em;"><strong style="padding: 0px; margin: 0px;">Memcache环境测试</strong>：<br style="padding: 0px; margin: 0px;" />
运行下面的php文件，如果有输出This is a test!，就表示环境搭建成功。开始领略Memcache的魅力把！<br style="padding: 0px; margin: 0px;" />
&lt; ?php<br style="padding: 0px; margin: 0px;" />
$mem = new Memcache;<br style="padding: 0px; margin: 0px;" />
$mem-&gt;connect(&#8221;127.0.0.1&#8243;, 11211);<br style="padding: 0px; margin: 0px;" />
$mem-&gt;set(&#8217;key&#8217;, &#8216;This is a test!&#8217;, 0, 60);<br style="padding: 0px; margin: 0px;" />
$val = $mem-&gt;get(&#8217;key&#8217;);<br style="padding: 0px; margin: 0px;" />
echo $val;<br style="padding: 0px; margin: 0px;" />
?&gt;</p>
<img src ="http://www.blogjava.net/shanben/aggbug/328531.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shanben/" target="_blank">存鹰之心于高远,取鹰之志而凌云,习鹰之性以涉险,融鹰之神在山巅.</a> 2010-08-11 14:22 <a href="http://www.blogjava.net/shanben/archive/2010/08/11/328531.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Memcached学习笔记——windows上初步使用</title><link>http://www.blogjava.net/shanben/archive/2010/08/11/328527.html</link><dc:creator>存鹰之心于高远,取鹰之志而凌云,习鹰之性以涉险,融鹰之神在山巅.</dc:creator><author>存鹰之心于高远,取鹰之志而凌云,习鹰之性以涉险,融鹰之神在山巅.</author><pubDate>Wed, 11 Aug 2010 05:51:00 GMT</pubDate><guid>http://www.blogjava.net/shanben/archive/2010/08/11/328527.html</guid><wfw:comment>http://www.blogjava.net/shanben/comments/328527.html</wfw:comment><comments>http://www.blogjava.net/shanben/archive/2010/08/11/328527.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shanben/comments/commentRss/328527.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shanben/services/trackbacks/328527.html</trackback:ping><description><![CDATA[<div class="entryFrom clearfix">
<div class="infoBox">日志原文：<a href="http://j2ee.blog.sohu.com/70343632.html" target="_blank">http://j2ee.blog.sohu.com/70343632.html </a><span style="color: #000000;">&nbsp;&nbsp; <br />
memcache for win 软件主页：http://jehiah.cz/projects/memcached-win32/&nbsp;&nbsp; </span>http://labs.northscale.com/memcached-packages/<br />
<span style="color: #000000;">
meecache for liunx 软件主页：http://memcached.org/ &nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
</span> 最近一直在做一个项目的前期设计工作，考虑到后期系统的扩展和性能问题也找了很多解决方法，有一个就是用到了数据库的缓存工具memcached（当然该工具并不仅仅局限于数据库的缓存）。先简单的介绍下什么是memcached。
<p>&nbsp;&nbsp;&nbsp; <font color="#993300">Memcached是高性能的，分布式的内存对象缓存系统，用于在动态应用中减少数据库负
载，提升访问速度。Memcached由Danga
Interactive开发，用于提升LiveJournal.com访问速度的。LJ每秒动态页面访问量几千次，用户700万。Memcached将数
据库负载大幅度降低，更好的分配资源，更快速访问。</font></p>
<p>&nbsp;&nbsp;&nbsp;
上网baidu了很多东西，几乎都差不多，而且基于java的说的很少，所有只有在研究了各个其他语言类的应用后再来尝试在java上进行简单的操作应
用。先从memcached上进行说明，memcached的最新版是采用c语言进行开发和设计的，据说旧版的是采用perl语言开发的，而且它是一个应
用软件来的，是作为缓存服务器的服务器端运行在服务器上的，需要使用特定的语言编写客户端与其进行通信来进行数据的缓存和获取。通常我们是把
memcached安装运行在web服务器上，然后通过对需要的数据进行缓存，据我目前所知，所有数据的缓存设置和存取操作，以及数据的更新后替换操作全
部需要程序来进行，而不是自动进行的（自动不知道能不能成功，呵呵）。下面从一个实际的例子来应用memcached。</p>
<p>&nbsp;&nbsp;&nbsp; 首先到<a href="http://danga.com/memcached/">http://danga.com/memcached/</a>下
载memcached的windows版本和java客户端jar包，目前最新版本是memcached-1.2.1-win32.zip和
java_memcached-release_1.6.zip，分别解压后即可！首先是安装运行memcached服务器，我们将memcached-
1.2.1-win32.zip解压后，进入其目录，然后运行如下命令：</p>
<p><font color="#999900">c:&gt;memcached.exe -d install<br />
c:&gt;memcached.exe -l 127.0.0.1 -m 32 -d start</font></p>
<p>&nbsp;&nbsp;&nbsp;
第一行是安装memcached成为服务，这样才能正常运行，否则运行失败！第一行是启动memcached的，作为测试我们就简单的只分配32M内存
了，然后监听本机端口和以守护进行运行。执行完毕后，我们就可以在任务管理器中见到memcached.exe这个进程了。好了，我们的服务器已经正常运
行了， 下面我们就来写java的客户端连接程序。</p>
<p>&nbsp;&nbsp;&nbsp; 我们将java_memcached-release_1.6.zip解压后的目录中的java_memcached-release_1.6.jar文件复制到java项目的lib目录下，然后我们来编写代码，比如我提供的一个应用类如下：</p>
<p><span style="color: #0000ff;">package</span><span style="color: #000000;"> utils.cache;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.util.Date;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;"> com.danga.MemCached.MemCachedClient;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;"> com.danga.MemCached.SockIOPool;<br />
<br />
<br />
</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
* 使用memcached的缓存实用类.<br />
* <br />
* </span><span style="color: #808080;">@author</span><span style="color: #008000;"> 铁木箱子<br />
*<br />
</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> MemCached<br />
{<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">//</span><span style="color: #008000;"> 创建全局的唯一实例</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> MemCachedClient mcc </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> MemCachedClient();<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> MemCached memCached </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> MemCached();<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置与缓存服务器的连接池</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">//</span><span style="color: #008000;"> 服务器列表和其权重</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String[] servers </span><span style="color: #000000;">=</span><span style="color: #000000;"> {</span><span style="color: #000000;">"</span><span style="color: #000000;">127.0.0.1:11211</span><span style="color: #000000;">"</span><span style="color: #000000;">};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Integer[] weights </span><span style="color: #000000;">=</span><span style="color: #000000;"> {</span><span style="color: #000000;">3</span><span style="color: #000000;">};<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">//</span><span style="color: #008000;"> 获取socke连接池的实例对象</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SockIOPool pool </span><span style="color: #000000;">=</span><span style="color: #000000;"> SockIOPool.getInstance();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置服务器信息</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pool.setServers( servers );<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pool.setWeights( weights );<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置初始连接数、最小和最大连接数以及最大处理时间</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pool.setInitConn( </span><span style="color: #000000;">5</span><span style="color: #000000;"> );<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pool.setMinConn( </span><span style="color: #000000;">5</span><span style="color: #000000;"> );<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pool.setMaxConn( </span><span style="color: #000000;">250</span><span style="color: #000000;"> );<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pool.setMaxIdle( </span><span style="color: #000000;">1000</span><span style="color: #000000;"> </span><span style="color: #000000;">*</span><span style="color: #000000;"> </span><span style="color: #000000;">60</span><span style="color: #000000;"> </span><span style="color: #000000;">*</span><span style="color: #000000;"> </span><span style="color: #000000;">60</span><span style="color: #000000;"> </span><span style="color: #000000;">*</span><span style="color: #000000;"> </span><span style="color: #000000;">6</span><span style="color: #000000;"> );<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置主线程的睡眠时间</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pool.setMaintSleep( </span><span style="color: #000000;">30</span><span style="color: #000000;"> );<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置TCP的参数，连接超时等</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pool.setNagle( </span><span style="color: #0000ff;">false</span><span style="color: #000000;"> );<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pool.setSocketTO( </span><span style="color: #000000;">3000</span><span style="color: #000000;"> );<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pool.setSocketConnectTO( </span><span style="color: #000000;">0</span><span style="color: #000000;"> );<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">//</span><span style="color: #008000;"> 初始化连接池</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pool.initialize();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">//</span><span style="color: #008000;"> 压缩设置，超过指定大小（单位为K）的数据都会被压缩</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mcc.setCompressEnable( </span><span style="color: #0000ff;">true</span><span style="color: #000000;"> );<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mcc.setCompressThreshold( </span><span style="color: #000000;">64</span><span style="color: #000000;"> </span><span style="color: #000000;">*</span><span style="color: #000000;"> </span><span style="color: #000000;">1024</span><span style="color: #000000;"> );<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp; * 保护型构造方法，不允许实例化！<br />
&nbsp;&nbsp;&nbsp;&nbsp; *<br />
&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> MemCached()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp; * 获取唯一实例.<br />
&nbsp;&nbsp;&nbsp;&nbsp; * </span><span style="color: #808080;">@return</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> MemCached getInstance()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> memCached;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp; * 添加一个指定的值到缓存中.<br />
&nbsp;&nbsp;&nbsp;&nbsp; * </span><span style="color: #808080;">@param</span><span style="color: #008000;"> key<br />
&nbsp;&nbsp;&nbsp;&nbsp; * </span><span style="color: #808080;">@param</span><span style="color: #008000;"> value<br />
&nbsp;&nbsp;&nbsp;&nbsp; * </span><span style="color: #808080;">@return</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">boolean</span><span style="color: #000000;"> add(String key, Object value)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> mcc.add(key, value);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">boolean</span><span style="color: #000000;"> add(String key, Object value, Date expiry)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> mcc.add(key, value, expiry);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">boolean</span><span style="color: #000000;"> replace(String key, Object value)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> mcc.replace(key, value);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">boolean</span><span style="color: #000000;"> replace(String key, Object value, Date expiry)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> mcc.replace(key, value, expiry);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp; * 根据指定的关键字获取对象.<br />
&nbsp;&nbsp;&nbsp;&nbsp; * </span><span style="color: #808080;">@param</span><span style="color: #008000;"> key<br />
&nbsp;&nbsp;&nbsp;&nbsp; * </span><span style="color: #808080;">@return</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Object get(String key)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> mcc.get(key);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MemCached cache </span><span style="color: #000000;">=</span><span style="color: #000000;"> MemCached.getInstance();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff0000">cache.add(</font></span><font color="#ff0000"><span style="color: #000000;">"</span><span style="color: #000000;">hello</span><span style="color: #000000;">"</span><span style="color: #000000;">, </span><span style="color: #000000;">234</span></font><span style="color: #000000;"><font color="#ff0000">);<br />
</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print(</span><span style="color: #000000;">"</span><span style="color: #000000;">get value : </span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> cache.get(</span><span style="color: #000000;">"</span><span style="color: #000000;">hello</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
</span></p>
<p>&nbsp;&nbsp;&nbsp;
那么我们就可以通过简单的像main方法中操作的一样存入一个变量，然后再取出进行查看，我们可以看到先调用了add，然后再进行get，我们运行一次
后，234这个值已经被我们存入了memcached的缓存中的了，我们将main方法中红色的那一行注释掉后，我们再运行还是可以看到get到的
value也是234，即缓存中我们已经存在了数据了。</p>
<p>&nbsp;&nbsp;&nbsp;
对基本的数据我们可以操作，对于普通的POJO而言，如果要进行存储的话，那么比如让其实现java.io.Serializable接口，因为
memcached是一个分布式的缓存服务器，多台服务器间进行数据共享需要将对象序列化的，所以必须实现该接口，否则会报错的。比如我们写一个简单的测
试Bean如下：</p>
<p><span style="color: #0000ff;">class</span><span style="color: #000000;"> TBean </span><span style="color: #0000ff;">implements</span><span style="color: #000000;"> java.io.Serializable<br />
{<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">final</span><span style="color: #000000;"> </span><span style="color: #0000ff;">long</span><span style="color: #000000;"> serialVersionUID </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">1945562032261336919L</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> String name;<br />
<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String getName()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> name;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> setName(String name)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.name </span><span style="color: #000000;">=</span><span style="color: #000000;"> name;<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
</span></p>
<p>&nbsp;&nbsp;&nbsp; 然后我们在main方法中加入如下几行代码：</p>
<p>TBean tb <span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> TBean();<br />
tb.setName(</span><span style="color: #000000;">"</span><span style="color: #000000;">铁木箱子</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
cache.add(</span><span style="color: #000000;">"</span><span style="color: #000000;">bean</span><span style="color: #000000;">"</span><span style="color: #000000;">, tb);<br />
TBean tb1 </span><span style="color: #000000;">=</span><span style="color: #000000;"> (TBean)cache.get(</span><span style="color: #000000;">"</span><span style="color: #000000;">bean</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
System.out.print(</span><span style="color: #000000;">"</span><span style="color: #000000;">name=</span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> tb1.getName());<br />
tb1.setName(</span><span style="color: #000000;">"</span><span style="color: #000000;">铁木箱子_修改的</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
tb1 </span><span style="color: #000000;">=</span><span style="color: #000000;"> (TBean)cache.get(</span><span style="color: #000000;">"</span><span style="color: #000000;">bean</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
System.out.print(</span><span style="color: #000000;">"</span><span style="color: #000000;">name=</span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> tb1.getName());</span></p>
<p><span style="color: #000000;">&nbsp;&nbsp;&nbsp;
我们首先把TBean的一个实例放入缓存中，然后再取出来，并进行名称的修改，然后我们再取这个对象，我们再看其名称，发现修改的对象并不是缓存中的对
象，而是通过序列化过来的一个实例对象，这样我们就无须担心对原生类的无意修改导致缓存数据失效了，呵呵~~看来我也是多此一想啊。所以这表明从缓存中获
取的对象是存入对象的一个副本，对获取对象的修改并不能真正的修改缓存中的数据，而应该使用其提供的replace等方法来进行修改。</span></p>
<p><span style="color: #000000;">&nbsp;&nbsp;&nbsp; 以上是我在windows下对memcached的一点小学习和实践，在以后的项目开发过程中将会更深入的学习和应用这一缓存工具，也希望和有兴趣的同行一起讨论学习该工具的使用~~&nbsp;<img alt="微笑" src="http://img3.pp.sohu.com/ppp/blog/images/emotion/0.gif" border="0" /> <br />
</span></p>
<br />
</div>
</div>
<img src ="http://www.blogjava.net/shanben/aggbug/328527.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shanben/" target="_blank">存鹰之心于高远,取鹰之志而凌云,习鹰之性以涉险,融鹰之神在山巅.</a> 2010-08-11 13:51 <a href="http://www.blogjava.net/shanben/archive/2010/08/11/328527.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>