??xml version="1.0" encoding="utf-8" standalone="yes"?>国产亚洲人成无码网在线观看,亚洲AV无码一区二区乱子伦,亚洲综合视频在线观看http://www.tkk7.com/syniii/archive/2020/04/18/new_blog.html杨罗|?/dc:creator>杨罗|?/author>Sat, 18 Apr 2020 02:12:00 GMThttp://www.tkk7.com/syniii/archive/2020/04/18/new_blog.htmlhttp://www.tkk7.com/syniii/comments/435372.htmlhttp://www.tkk7.com/syniii/archive/2020/04/18/new_blog.html#Feedback0http://www.tkk7.com/syniii/comments/commentRss/435372.htmlhttp://www.tkk7.com/syniii/services/trackbacks/435372.html博客做了q移Q新的地址Q?/span>观云的BLOG https://yeas.fun/
新博课主要用于记录一些系列的技术文章,今年的一个目标就是深入研IJVM底层Q我会把一些学习心得记录下来,也欢q大家一赯论~

]]>
你是否经常忘记网站上的各U密码?分n个密码管理Y件LastPasshttp://www.tkk7.com/syniii/archive/2016/01/13/lastpass.html杨罗|?/dc:creator>杨罗|?/author>Wed, 13 Jan 2016 06:19:00 GMThttp://www.tkk7.com/syniii/archive/2016/01/13/lastpass.htmlhttp://www.tkk7.com/syniii/comments/429029.htmlhttp://www.tkk7.com/syniii/archive/2016/01/13/lastpass.html#Feedback0http://www.tkk7.com/syniii/comments/commentRss/429029.htmlhttp://www.tkk7.com/syniii/services/trackbacks/429029.html现在|络那么发达Q我们上|的每个人势必会在各个网站上登陆Q那势必会有一堆密码需要管理,那怎么能记住那么多|站的密码呢Q我之前的做法是讄几个常用的密码,好多不重要的|站用一个,重要的网站用一个,然后...CSDN密码泄露之后Q只得吭哧吭哧的改一堆密码。那U痛苦真的是呵呵?/div>

那有没有什么方式可以方便的理密码呢?

那就是LastPass的工作,它是一ƾ跨q_密码理软g。你在每个网站上都可以随机生成一个密码,然后软g会自动记住,你只需要记住这个Y件的d码就可以了。超方便Q?/div>

Z么要用LastPass?

我用LastPassQ是因ؓ它可以安装浏览器插gQ之后你在网站的注册Q它会自动提醒你要不要加入它的密码库Q你在网站的登陆它会自动帮你填写账号密码Q甚至于一些常用的表单Q比如说w䆾证、公司地址、银行卡{)你可以提前设|好Q它也会自动帮你填写Q我再也不用记那么多密码了,一切都是自动化?/div>
如果你经常有国外的帐P比如说google{大公司QLastPass甚至提供了一键改密码的功能,好方便!

支持手机么?

当然Q现在智能机那么行Q不能在Z用,直不能忍。当你安装了IOS软g之后Q在打开|站d界面Q点M方的向上箭_选择LassPass软gQ点击Touch IDQ好了,密码自动完成Q世界顿时清净了,x以前在手Z输入长的密码,跪了Q?/div>

真的安全吗?

有的人担心密码泄露问题,其实对于LastPass没啥必要Q因为LastPass存储的都是加密文Ӟ只要你的d码不泄露Q别人即使拿C的网上的密码Q也是加密的Q没法用?/div>

它收费吗Q?/h3>
好东襉K要收费,h也还可以Q几十块一q_其实收费版和免费版对于普通用P最重要的区别就是:免费版帐号密码不能云同步

免费获得一个月的高U̎h?/h2>
https://lastpass.com/f?18430702  通过q个地址注册Q则会免费获?span style="color: #ff00ff;">一个月高账户权限

最后也是最重要的:

点击q个链接Q输入刚刚你注册的邮,则会?span style="color: #ff00ff;">半年的高U̎?/span>Q记住一个密码,p住了所有密码,是那么单!


]]>数据同步pȝ设计http://www.tkk7.com/syniii/archive/2011/04/06/data_sync.html杨罗|?/dc:creator>杨罗|?/author>Wed, 06 Apr 2011 07:50:00 GMThttp://www.tkk7.com/syniii/archive/2011/04/06/data_sync.htmlhttp://www.tkk7.com/syniii/comments/347707.htmlhttp://www.tkk7.com/syniii/archive/2011/04/06/data_sync.html#Feedback3http://www.tkk7.com/syniii/comments/commentRss/347707.htmlhttp://www.tkk7.com/syniii/services/trackbacks/347707.html

一. 应用场景

在大型分布式应用中,我们l常到在多数据库之间的数据同步问题Q比如说一ƾ游戏,在玩家注册后Q可以马上登陆进入服务器Q?/span>?/span>数据在一个IDC更新Q其它IDC立即可见?/span>Z化思\Q我们这里称玩家注册的数据库(数据来源?Z心库Q同步目的地的数据库为分站库?/span>

在分布式领域有个CAP理论Q是说Consistency(一致?, Availability(可用?, Partition tolerance(分区和容? 三部分在pȝ实现只可同时满二点Q?/span>?/span>法三者兼?/span>

能做?/span>

· 数据快速搬q到指定的IDC节点

· 数据传递过E中p|Ӟ重新传?/span>

· 监控数据传递流E?/span>

· 故障转移

· 数据版本控制

· 分配全局唯一?/span>ID

不能做的

· 不参与业务行为,业务操作只能通过注册的方式集?/span>

· 不保存业务数据,不提供传递的业务的查?/span>

二.pȝ要求

1.数据快速同步:除去|络原因Q正常情况下从来源库同步到接收库的时间不过300m2.高ƈ发:单个应用每秒同步2000条记?/span>
3.可׾~性,在资源达C限时能通过增加应用分散处理后期增长的压?/span>
4.数据完整性要求,在数据同步过E中保证数据不丢失和数据安全
5.故障转移和数据恢复功?/span>

三.设计思\

pȝ优化Q最常用的就是进行业务切ԌMQ务切割ؓ许多子Q务,分区块分析系l中可能存在的性能瓉q有针对性地q行优化Q在本系l中Q主要业务包含以下内容:
1.SyncerQ外部接口,接收同步数据hQ初始化同步pȝ的一些必要数?/span>
2.DeliveryQ将同步数据按照业务或优先q行分发Qƈ记录分发l果
3.BatchQ分站库收到同步数据后,Ҏ不同的业务类型调用相应的业务逻辑处理数据
Z以上三块业务功能Q我们可以把整个数据同步程切割?个应用,具体如下图显C。在Syncer端应用中Q我们需要将原始同步数据和分发的分站q行存储Q以备失败恢复,此时如果采用数据库进行存储,势必会受限于数据库性能影响Q因此我们采用了高效的key-value风格存储的redis服务来记录数据,同时在不同应用之间采用队?Httpsqs服务)的方式来q行通讯Q同时也保证的数据通讯的顺序性,Z后的序同步做好基础?/span>
Httpsqs提供了http风格的数据操作模式,业务~码非常单,同时也提供了web形式的队列处理情冉|询,q是选择它做队列服务很大一部分原因Q方便业务操作和性能监控?/span>

四.数据{ 

l色-正常程?/span>U色-异常程

队列处理

Ҏ业务划分队列名称Q每个队列再划分Z个关联队列:正常队列(Normal)、重试队?Retry)、死亡队?Death)Q处理流EؓQ?/span>

【进EA】把数据先放入正帔R列,如果攄p|写恢复日?/span>

【进EB】监听正帔R列,获取队列数据q进行业务处理,处理p|攑օ重试队列

【进E?/span>C】监听重试队列,q几U获取队列数据ƈ重新q行业务处理Q处理失败放入死?/span>队列

【进E?/span>D】监听死?/span>队列Q获取队列数据ƈ重新q行业务处理Q处理失败重新放入死亡队列尾部,{待下一ơ轮?/span>

业务处理p|如果无法再次攑օ队列Q记录恢复日?/span>

数据同步程

1发送数据,支持Http POSTQcurl -d "l过URL~码的文本消?Q如"http://host:port/sync_all/register"
或者Http GETQcurl "http://host:port/sync_all/register?data=l过URL~码的文本消?

sync-syncer接收?/span>同步数据hQ创建sidq分解出需要同步的节点个数Q把原始数据和子d写入redis中,sid写入httpsqs?/span>

sync-delivery监听中心httpsqs队列Q根据sid从redis获取到原始数据和需要同步的节点地址Q往其他节点发送数据,程如按"队列处理程"q行

sync-batch监听分节点的httpsqs队列Q调用已l注册的处理器处理队列数据,程如按"队列处理程"q行

? 恢复和监?/span>

恢复数据?/span>

· httpsqs中的M队列 - 业务处理暂时处理不了的数?/span>

· recovery日志文g - 其它异常情况下的数据Q例如网l无法连接、内部服务不可用

数据恢复

独立?/span>应用来处理正常流E中没有完成的Q务,主要功能有:

· 监听M队列Q进行业务重做,再次执行p|时将执行ơ数+1Q最大执行次Cؓ5(默认)Q超Z限则记录到恢复日志中

· d恢复日志Q重新放入死亡队?/span>

应用监控

· 使用scribe日志框架服务业务日志的采集和监控

· 攉重要的业务操作日?/span>

· 动态的开?关闭某类业务日志

· 对redisq行监控

· 对httpspsQ监控队列个敎ͼ每个队列的状?/span>

? 数据l构

{"sid":111,"type":"reg","v":1,"data":"hello world","ctime":65711321800,"exec":1}

· sid(sync id) - 全局唯一id

· v(version) - 版本?/span>

· data - 业务数据

· ctime(create time) - 创徏旉(毫秒)

· exec - 可选,执行ơ数

cd

key格式

value格式

备注

redis原始数据

sync:<业务cd>:<sid>

{"ctime":65711321800,"v":1,"data":"hello world"}

分站没有此项

redis业务附加d

sync:<业务cd>:<sid>:sub

setcdQ保存需要同步的节点idQ例如[1,3,5]

分发认Set数据l构 

httpsqs队列

sync:<业务cd> 
sync:<业务cd>:retry 
sync:<业务cd>:death

{"sid":111,"type":"pp_register","exec":1} 

中心队列内容Qkey?lt;业务cd>是可选项 

httpsqs队列

sync:<业务cd> 
sync:<业务cd>:retry 
sync:<业务cd>:death

{"sid":111,"v":1,"data":"hello world","ctime":65711321800,"exec":1} 

分站队列内容Q包含业务数?nbsp;

所有的key都小写,?nbsp;':' 作ؓ分隔W?/span>

五.~码及测试结?/span>

l过~码和测试,在内|环境下Q在无数据库限制的情况下Q单应用可以传?/span>1500?U,基本满业务需求。如果需q一步扩展,采用集群式布|可使得吞吐量成倍的增长?/span>



]]>[转]Consistent Hashing - memcached分布式原?/title><link>http://www.tkk7.com/syniii/articles/340783.html</link><dc:creator>杨罗|?/dc:creator><author>杨罗|?/author><pubDate>Wed, 15 Dec 2010 05:35:00 GMT</pubDate><guid>http://www.tkk7.com/syniii/articles/340783.html</guid><wfw:comment>http://www.tkk7.com/syniii/comments/340783.html</wfw:comment><comments>http://www.tkk7.com/syniii/articles/340783.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.tkk7.com/syniii/comments/commentRss/340783.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/syniii/services/trackbacks/340783.html</trackback:ping><description><![CDATA[<span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="text-align: left; line-height: 21px; font-family: verdana, sans-serif; font-size: 14px" class="Apple-style-span"> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">下面q篇文章写的非常好,l合memcached?特点利用Consistent hasning 法Q可以打造一个非常完备的分布式缓存服务器?/p> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px" class="contents"></p> <ul style="padding-bottom: 0px; list-style-type: none; margin: 5px 0px 5px 16px; padding-left: 16px; padding-right: 0px; padding-top: 0px" class="list1"> <li style="padding-bottom: 2px; list-style-type: disc; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><a style="color: rgb(51,102,153); text-decoration: none" >memcached的分布式</a> <ul style="padding-bottom: 0px; list-style-type: none; margin: 5px 0px 5px 16px; padding-left: 16px; padding-right: 0px; padding-top: 0px" class="list2"> <li style="padding-bottom: 2px; list-style-type: disc; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><a style="color: rgb(51,102,153); text-decoration: none" >memcached的分布式是什么意思?</a></li> </ul> </li> <li style="padding-bottom: 2px; list-style-type: disc; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><a style="color: rgb(51,102,153); text-decoration: none" >Cache::Memcached的分布式Ҏ</a> <ul style="padding-bottom: 0px; list-style-type: none; margin: 5px 0px 5px 16px; padding-left: 16px; padding-right: 0px; padding-top: 0px" class="list2"> <li style="padding-bottom: 2px; list-style-type: disc; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><a style="color: rgb(51,102,153); text-decoration: none" >Ҏ余数计算分散</a></li> <li style="padding-bottom: 2px; list-style-type: disc; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><a style="color: rgb(51,102,153); text-decoration: none" >Ҏ余数计算分散的缺?/a></li> </ul> </li> <li style="padding-bottom: 2px; list-style-type: disc; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><a style="color: rgb(51,102,153); text-decoration: none" >Consistent Hashing</a> <ul style="padding-bottom: 0px; list-style-type: none; margin: 5px 0px 5px 16px; padding-left: 16px; padding-right: 0px; padding-top: 0px" class="list2"> <li style="padding-bottom: 2px; list-style-type: disc; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><a style="color: rgb(51,102,153); text-decoration: none" >Consistent Hashing的简单说?/a></li> <li style="padding-bottom: 2px; list-style-type: disc; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><a style="color: rgb(51,102,153); text-decoration: none" >支持Consistent Hashing的函数库</a></li> </ul> </li> <li style="padding-bottom: 2px; list-style-type: disc; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><a style="color: rgb(51,102,153); text-decoration: none" >ȝ</a></li> </ul> <h2 style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">memcached的分布式</h2> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">正如W?ơ中介绍的那P memcached虽然UCؓ“分布?#8221;~存服务器,但服务器端ƈ没有“分布?#8221;功能?服务器端仅包?W?ơ?W??前坂介绍的内存存储功能,其实现非常简单?至于memcached的分布式Q则是完全由客户端程序库实现的?q种分布式是memcached的最大特炏V?/p> <h3 style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">memcached的分布式是什么意思?</h3> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">q里多次使用?#8220;分布?#8221;q个词,但ƈ未做详细解释?现在开始简单地介绍一下其原理Q各个客L的实现基本相同?/p> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">下面假设memcached服务器有node1~node3三台Q?应用E序要保存键名ؓ“tokyo”“kanagawa”“chiba”“saitama”“gunma” 的数据?/p> <p style="text-align: left; padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px" class="img_margin"><img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="memcached-0004-01.png" alt="memcached-0004-01.png" src="http://tech.idv2.com/wp-content/uploads/2008/07/memcached-0004-01.png" width="441" height="405" /></p> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">? 分布式简介:准备</p> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">首先向memcached中添?#8220;tokyo”。将“tokyo”传给客户端程序库后, 客户端实现的法׃Ҏ“?#8221;来决定保存数据的memcached服务器?服务器选定后,卛_令它保存“tokyo”及其倹{?/p> <p style="text-align: left; padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px" class="img_margin"><img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="memcached-0004-02.png" alt="memcached-0004-02.png" src="http://tech.idv2.com/wp-content/uploads/2008/07/memcached-0004-02.png" width="445" height="454" /></p> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">? 分布式简介:d?/p> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">同样Q?#8220;kanagawa”“chiba”“saitama”“gunma”都是先选择服务器再保存?/p> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">接下来获取保存的数据。获取时也要要获取的键“tokyo”传递给函数库?函数库通过与数据保存时相同的算法,Ҏ“?#8221;选择服务器?使用的算法相同,p选中与保存时相同的服务器Q然后发送get命o?只要数据没有因ؓ某些原因被删除,p获得保存的倹{?/p> <p style="text-align: left; padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px" class="img_margin"><img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="memcached-0004-03.png" alt="memcached-0004-03.png" src="http://tech.idv2.com/wp-content/uploads/2008/07/memcached-0004-03.png" width="449" height="457" /></p> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">? 分布式简介:获取?/p> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">q样Q将不同的键保存C同的服务器上Q就实现了memcached的分布式?memcached服务器增多后Q键׃分散Q即使一台memcached服务器发生故?无法q接Q也不会影响其他的缓存,pȝ依然能l运行?/p> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">接下来介l?a style="color: rgb(51,102,153); text-decoration: none" >W??/a><span id="oqxeaiy" class="Apple-converted-space"> </span>中提到的Perl客户端函数库Cache::Memcached实现的分布式Ҏ?/p> <h2 style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">Cache::Memcached的分布式Ҏ</h2> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">Perl的memcached客户端函数库Cache::Memcached?memcached的作者Brad Fitzpatrick的作品,可以说是原装的函数库了?/p> <ul style="padding-bottom: 0px; list-style-type: none; margin: 5px 0px 5px 16px; padding-left: 16px; padding-right: 0px; padding-top: 0px" class="list1"> <li style="padding-bottom: 2px; list-style-type: disc; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><a style="color: rgb(51,102,153); text-decoration: none" >Cache::Memcached - search.cpan.org</a></li> </ul> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">该函数库实现了分布式功能Q是memcached标准的分布式Ҏ?/p> <h3 style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">Ҏ余数计算分散</h3> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">Cache::Memcached的分布式Ҏ单来_是“Ҏ服务器台数的余数q行分散”?求得键的整数哈希|再除以服务器台数Q根据其余数来选择服务器?/p> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">下面Cache::Memcached化成以下的Perl脚本来进行说明?/p> <div id="zcjifva" class="hl-surround"> <div id="drakfst" class="hl-main"><span style="color: navy">use strict</span><span style="color: gray">;<br /> </span><span style="color: navy">use warnings</span><span style="color: gray">;<br /> </span><span style="color: navy">use String::CRC32</span><span style="color: gray">;<br /> <br /> </span><span style="color: green">my</span><span style="color: gray"><span id="jqpnivn" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">@nodes</span><span style="color: gray"><span id="netzelz" class="Apple-converted-space"> </span>=<span id="ppzuesr" class="Apple-converted-space"> </span></span><span style="color: olive">(</span><span style="color: rgb(139,0,0)">'</span><span style="color: red">node1</span><span style="color: rgb(139,0,0)">'</span><span style="color: gray">,</span><span style="color: rgb(139,0,0)">'</span><span style="color: red">node2</span><span style="color: rgb(139,0,0)">'</span><span style="color: gray">,</span><span style="color: rgb(139,0,0)">'</span><span style="color: red">node3</span><span style="color: rgb(139,0,0)">'</span><span style="color: olive">)</span><span style="color: gray">;<br /> </span><span style="color: green">my</span><span style="color: gray"><span id="kvjyhry" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">@keys</span><span style="color: gray"><span id="llzyqcb" class="Apple-converted-space"> </span>=<span id="mbwgfph" class="Apple-converted-space"> </span></span><span style="color: olive">(</span><span style="color: rgb(139,0,0)">'</span><span style="color: red">tokyo</span><span style="color: rgb(139,0,0)">'</span><span style="color: gray">,<span id="kgqpzfe" class="Apple-converted-space"> </span></span><span style="color: rgb(139,0,0)">'</span><span style="color: red">kanagawa</span><span style="color: rgb(139,0,0)">'</span><span style="color: gray">,<span id="shnbazn" class="Apple-converted-space"> </span></span><span style="color: rgb(139,0,0)">'</span><span style="color: red">chiba</span><span style="color: rgb(139,0,0)">'</span><span style="color: gray">,<span id="hwrbhdc" class="Apple-converted-space"> </span></span><span style="color: rgb(139,0,0)">'</span><span style="color: red">saitama</span><span style="color: rgb(139,0,0)">'</span><span style="color: gray">,<span id="ggftzcm" class="Apple-converted-space"> </span></span><span style="color: rgb(139,0,0)">'</span><span style="color: red">gunma</span><span style="color: rgb(139,0,0)">'</span><span style="color: olive">)</span><span style="color: gray">;<br /> <br /> </span><span style="color: green">foreach</span><span style="color: gray"><span id="odnxldc" class="Apple-converted-space"> </span></span><span style="color: green">my</span><span style="color: gray"><span id="ddnmhvy" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$key</span><span style="color: gray"><span id="jcesgnu" class="Apple-converted-space"> </span></span><span style="color: olive">(</span><span style="color: rgb(0,0,139)">@keys</span><span style="color: olive">)</span><span style="color: gray"><span id="zrflvum" class="Apple-converted-space"> </span></span><span style="color: olive">{</span><span style="color: gray"><br />   <span id="pksrfts" class="Apple-converted-space"> </span></span><span style="color: green">my</span><span style="color: gray"><span id="ffscbhz" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$crc</span><span style="color: gray"><span id="cytsyjh" class="Apple-converted-space"> </span>=<span id="zzfezym" class="Apple-converted-space"> </span></span><span style="color: blue">crc32</span><span style="color: olive">(</span><span style="color: rgb(0,0,139)">$key</span><span style="color: olive">)</span><span style="color: gray">;<span id="szfpsnq" class="Apple-converted-space"> </span></span><span style="color: rgb(255,165,0)"># CRC?/span><span style="color: gray"><br />   <span id="xicrlkn" class="Apple-converted-space"> </span></span><span style="color: green">my</span><span style="color: gray"><span id="nyesrfm" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$mod</span><span style="color: gray"><span id="yrmwrfp" class="Apple-converted-space"> </span>=<span id="aadcblz" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$crc</span><span style="color: gray"><span id="uuesjqa" class="Apple-converted-space"> </span>%<span id="osnbask" class="Apple-converted-space"> </span></span><span style="color: olive">(</span><span style="color: gray"><span id="grbaorj" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$#nodes</span><span style="color: gray"><span id="lhnizyu" class="Apple-converted-space"> </span>+<span id="xezjxwd" class="Apple-converted-space"> </span></span><span style="color: maroon">1</span><span style="color: gray"><span id="kzuiwky" class="Apple-converted-space"> </span></span><span style="color: olive">)</span><span style="color: gray">;<br />   <span id="vrfthyb" class="Apple-converted-space"> </span></span><span style="color: green">my</span><span style="color: gray"><span id="pevftpz" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$server</span><span style="color: gray"><span id="ttzumeo" class="Apple-converted-space"> </span>=<span id="ncxwnml" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$nodes</span><span style="color: olive">[</span><span style="color: gray"><span id="tizqhzn" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$mod</span><span style="color: gray"><span id="oojlvnb" class="Apple-converted-space"> </span></span><span style="color: olive">]</span><span style="color: gray">;<span id="crqwgfi" class="Apple-converted-space"> </span></span><span style="color: rgb(255,165,0)"># Ҏ余数选择服务?/span><span style="color: gray"><br />   <span id="pezcipd" class="Apple-converted-space"> </span></span><span style="color: green">printf</span><span style="color: gray"><span id="xcmhnba" class="Apple-converted-space"> </span></span><span style="color: rgb(139,0,0)">"</span><span style="color: red">%s =&gt; %s</span><span style="color: navy">\n</span><span style="color: rgb(139,0,0)">"</span><span style="color: gray">,<span id="njedrfx" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$key</span><span style="color: gray">,<span id="ssjxzjb" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$server</span><span style="color: gray">;<br /> </span><span style="color: olive">}</span></div> </div> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">Cache::Memcached在求哈希值时使用了CRC?/p> <ul style="padding-bottom: 0px; list-style-type: none; margin: 5px 0px 5px 16px; padding-left: 16px; padding-right: 0px; padding-top: 0px" class="list1"> <li style="padding-bottom: 2px; list-style-type: disc; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><a style="color: rgb(51,102,153); text-decoration: none" >String::CRC32 - search.cpan.org</a></li> </ul> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">首先求得字符串的CRC|Ҏ该值除以服务器节点数目得到的余数决定服务器?上面的代码执行后输入以下l果Q?/p> <pre>tokyo => node2<br /> kanagawa => node3<br /> chiba => node2<br /> saitama => node1<br /> gunma => node1</pre> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">Ҏ该结果,“tokyo”分散到node2Q?#8220;kanagawa”分散到node3{?多说一句,当选择的服务器无法q接ӞCache::Memcached会将q接ơ数 d到键之后Q再ơ计哈希值ƈ试q接。这个动作称为rehash?不希望rehash时可以在生成Cache::Memcached对象时指?#8220;rehash => 0”选项?/p> <h3 style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">Ҏ余数计算分散的缺?/h3> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">余数计算的方法简单,数据的分散性也相当优秀Q但也有其缺炏V?那就是当d或移除服务器Ӟ~存重组的代L当巨大?d服务器后Q余数就会生巨变,q样无法获取与保存时相同的服务器, 从而媄响缓存的命中率。用Perl写段代码来验证其代h?/p> <div id="gfzrbld" class="hl-surround"> <div id="nrqlrji" class="hl-main"><span style="color: navy">use strict</span><span style="color: gray">;<br /> </span><span style="color: navy">use warnings</span><span style="color: gray">;<br /> </span><span style="color: navy">use String::CRC32</span><span style="color: gray">;<br /> <br /> </span><span style="color: green">my</span><span style="color: gray"><span id="xbdnbeh" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">@nodes</span><span style="color: gray"><span id="inhmznx" class="Apple-converted-space"> </span>=<span id="hhgtazg" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">@ARGV</span><span style="color: gray">;<br /> </span><span style="color: green">my</span><span style="color: gray"><span id="xebehzc" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">@keys</span><span style="color: gray"><span id="miwrbpw" class="Apple-converted-space"> </span>=<span id="fmvjesz" class="Apple-converted-space"> </span></span><span style="color: olive">(</span><span style="color: rgb(139,0,0)">'</span><span style="color: red">a</span><span style="color: rgb(139,0,0)">'</span><span style="color: gray">..</span><span style="color: rgb(139,0,0)">'</span><span style="color: red">z</span><span style="color: rgb(139,0,0)">'</span><span style="color: olive">)</span><span style="color: gray">;<br /> </span><span style="color: green">my</span><span style="color: gray"><span id="nqpdjxh" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">%nodes</span><span style="color: gray">;<br /> <br /> </span><span style="color: green">foreach</span><span style="color: gray"><span id="iwulibh" class="Apple-converted-space"> </span></span><span style="color: green">my</span><span style="color: gray"><span id="ixavfea" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$key</span><span style="color: gray"><span id="pldyphz" class="Apple-converted-space"> </span></span><span style="color: olive">(</span><span style="color: gray"><span id="jblkuba" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">@keys</span><span style="color: gray"><span id="rnisnil" class="Apple-converted-space"> </span></span><span style="color: olive">)</span><span style="color: gray"><span id="xmhnipo" class="Apple-converted-space"> </span></span><span style="color: olive">{</span><span style="color: gray"><br />   <span id="jgfsrji" class="Apple-converted-space"> </span></span><span style="color: green">my</span><span style="color: gray"><span id="ugfavnx" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$hash</span><span style="color: gray"><span id="rduekut" class="Apple-converted-space"> </span>=<span id="qtoyipk" class="Apple-converted-space"> </span></span><span style="color: blue">crc32</span><span style="color: olive">(</span><span style="color: rgb(0,0,139)">$key</span><span style="color: olive">)</span><span style="color: gray">;<br />   <span id="ovutdgu" class="Apple-converted-space"> </span></span><span style="color: green">my</span><span style="color: gray"><span id="rovushg" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$mod</span><span style="color: gray"><span id="uuehgyx" class="Apple-converted-space"> </span>=<span id="tqlvmah" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$hash</span><span style="color: gray"><span id="njtonbp" class="Apple-converted-space"> </span>%<span id="ttouldv" class="Apple-converted-space"> </span></span><span style="color: olive">(</span><span style="color: gray"><span id="imhyilo" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$#nodes</span><span style="color: gray"><span id="yflgqah" class="Apple-converted-space"> </span>+<span id="yzjedkj" class="Apple-converted-space"> </span></span><span style="color: maroon">1</span><span style="color: gray"><span id="nrflznj" class="Apple-converted-space"> </span></span><span style="color: olive">)</span><span style="color: gray">;<br />   <span id="kvfedvb" class="Apple-converted-space"> </span></span><span style="color: green">my</span><span style="color: gray"><span id="iqbprxa" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$server</span><span style="color: gray"><span id="nnxhvyf" class="Apple-converted-space"> </span>=<span id="woqwgut" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$nodes</span><span style="color: olive">[</span><span style="color: gray"><span id="rntznxa" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$mod</span><span style="color: gray"><span id="hdcxwzy" class="Apple-converted-space"> </span></span><span style="color: olive">]</span><span style="color: gray">;<br />   <span id="njazfph" class="Apple-converted-space"> </span></span><span style="color: green">push</span><span style="color: gray"><span id="wwavftt" class="Apple-converted-space"> </span>@</span><span style="color: olive">{</span><span style="color: gray"><span id="pydrqje" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$nodes</span><span style="color: olive">{</span><span style="color: gray"><span id="alcbpor" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$server</span><span style="color: gray"><span id="zhgmlon" class="Apple-converted-space"> </span></span><span style="color: olive">}</span><span style="color: gray"><span id="yjisjiw" class="Apple-converted-space"> </span></span><span style="color: olive">}</span><span style="color: gray">,<span id="ucirxwz" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$key</span><span style="color: gray">;<br /> </span><span style="color: olive">}</span><span style="color: gray"><br /> <br /> </span><span style="color: green">foreach</span><span style="color: gray"><span id="pxdnihz" class="Apple-converted-space"> </span></span><span style="color: green">my</span><span style="color: gray"><span id="nntsnft" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$node</span><span style="color: gray"><span id="idrbdgf" class="Apple-converted-space"> </span></span><span style="color: olive">(</span><span style="color: gray"><span id="nytzutl" class="Apple-converted-space"> </span></span><span style="color: green">sort</span><span style="color: gray"><span id="whnmscq" class="Apple-converted-space"> </span></span><span style="color: green">keys</span><span style="color: gray"><span id="dkfptub" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">%nodes</span><span style="color: gray"><span id="whvqwvj" class="Apple-converted-space"> </span></span><span style="color: olive">)</span><span style="color: gray"><span id="vrflvyb" class="Apple-converted-space"> </span></span><span style="color: olive">{</span><span style="color: gray"><br />   <span id="buednbt" class="Apple-converted-space"> </span></span><span style="color: green">printf</span><span style="color: gray"><span id="ujponmt" class="Apple-converted-space"> </span></span><span style="color: rgb(139,0,0)">"</span><span style="color: red">%s: %s</span><span style="color: navy">\n</span><span style="color: rgb(139,0,0)">"</span><span style="color: gray">,<span id="juezuxl" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$node</span><span style="color: gray">,<span id="gcxsyml" class="Apple-converted-space"> </span></span><span style="color: green">join</span><span style="color: gray"><span id="triazjf" class="Apple-converted-space"> </span></span><span style="color: rgb(139,0,0)">"</span><span style="color: red">,</span><span style="color: rgb(139,0,0)">"</span><span style="color: gray">, @</span><span style="color: olive">{</span><span style="color: gray"><span id="ixwgfih" class="Apple-converted-space"> </span></span><span style="color: rgb(0,0,139)">$nodes</span><span style="color: olive">{</span><span style="color: rgb(0,0,139)">$node</span><span style="color: olive">}</span><span style="color: gray"><span id="fytsnqt" class="Apple-converted-space"> </span></span><span style="color: olive">}</span><span style="color: gray">;<br /> </span><span style="color: olive">}</span></div> </div> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">q段Perl脚本演示了将“a”?#8220;z”的键保存到memcachedq访问的情况?其保存为mod.plq执行?/p> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">首先Q当服务器只有三台时Q?/p> <div id="nuakupw" class="hl-surround"> <div id="ppzbwog" class="hl-main"><span style="color: gray">$<span id="sgblznq" class="Apple-converted-space"> </span></span><span style="color: blue">mod</span><span style="color: gray">.</span><span style="color: blue">pl</span><span style="color: gray"><span id="fjavuxp" class="Apple-converted-space"> </span></span><span style="color: blue">node1</span><span style="color: gray"><span id="nkmwgym" class="Apple-converted-space"> </span></span><span style="color: blue">node2</span><span style="color: gray"><span id="dwcxlkn" class="Apple-converted-space"> </span></span><span style="color: blue">nod3</span><span style="color: gray"><br /> </span><span style="color: blue">node1</span><span style="color: gray">:<span id="ngbwvum" class="Apple-converted-space"> </span></span><span style="color: blue">a</span><span style="color: gray">,</span><span style="color: blue">c</span><span style="color: gray">,</span><span style="color: blue">d</span><span style="color: gray">,</span><span style="color: blue">e</span><span style="color: gray">,</span><span style="color: blue">h</span><span style="color: gray">,</span><span style="color: blue">j</span><span style="color: gray">,</span><span style="color: blue">n</span><span style="color: gray">,</span><span style="color: blue">u</span><span style="color: gray">,</span><span style="color: blue">w</span><span style="color: gray">,</span><span style="color: blue">x</span><span style="color: gray"><br /> </span><span style="color: blue">node2</span><span style="color: gray">:<span id="tfezjxh" class="Apple-converted-space"> </span></span><span style="color: blue">g</span><span style="color: gray">,</span><span style="color: blue">i</span><span style="color: gray">,</span><span style="color: blue">k</span><span style="color: gray">,</span><span style="color: blue">l</span><span style="color: gray">,</span><span style="color: blue">p</span><span style="color: gray">,</span><span style="color: blue">r</span><span style="color: gray">,</span><span style="color: blue">s</span><span style="color: gray">,</span><span style="color: green">y</span><span style="color: gray"><br /> </span><span style="color: blue">node3</span><span style="color: gray">:<span id="iihnmlz" class="Apple-converted-space"> </span></span><span style="color: blue">b</span><span style="color: gray">,</span><span style="color: blue">f</span><span style="color: gray">,</span><span style="color: blue">m</span><span style="color: gray">,</span><span style="color: blue">o</span><span style="color: gray">,</span><span style="color: rgb(139,0,0)">q,</span><span style="color: red">t</span><span style="color: rgb(139,0,0)">,</span><span style="color: blue">v</span><span style="color: gray">,</span><span style="color: blue">z</span></div> </div> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">l果如上Qnode1保存a、c、d、e……Qnode2保存g、i、k……Q?每台服务器都保存?个到10个数据?/p> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">接下来增加一台memcached服务器?/p> <div id="hscmary" class="hl-surround"> <div id="krxscba" class="hl-main"><span style="color: gray">$<span id="zvfonbp" class="Apple-converted-space"> </span></span><span style="color: blue">mod</span><span style="color: gray">.</span><span style="color: blue">pl</span><span style="color: gray"><span id="xzbwzyb" class="Apple-converted-space"> </span></span><span style="color: blue">node1</span><span style="color: gray"><span id="wcqpzjx" class="Apple-converted-space"> </span></span><span style="color: blue">node2</span><span style="color: gray"><span id="tojtdgy" class="Apple-converted-space"> </span></span><span style="color: blue">node3</span><span style="color: gray"><span id="teoniws" class="Apple-converted-space"> </span></span><span style="color: blue">node4</span><span style="color: gray"><br /> </span><span style="color: blue">node1</span><span style="color: gray">:<span id="ovqehzg" class="Apple-converted-space"> </span></span><span style="color: blue">d</span><span style="color: gray">,</span><span style="color: blue">f</span><span style="color: gray">,</span><span style="color: blue">m</span><span style="color: gray">,</span><span style="color: blue">o</span><span style="color: gray">,</span><span style="color: blue">t</span><span style="color: gray">,</span><span style="color: blue">v</span><span style="color: gray"><br /> </span><span style="color: blue">node2</span><span style="color: gray">:<span id="xihvzcu" class="Apple-converted-space"> </span></span><span style="color: blue">b</span><span style="color: gray">,</span><span style="color: blue">i</span><span style="color: gray">,</span><span style="color: blue">k</span><span style="color: gray">,</span><span style="color: blue">p</span><span style="color: gray">,</span><span style="color: blue">r</span><span style="color: gray">,</span><span style="color: green">y</span><span style="color: gray"><br /> </span><span style="color: blue">node3</span><span style="color: gray">:<span id="cfsgxad" class="Apple-converted-space"> </span></span><span style="color: blue">e</span><span style="color: gray">,</span><span style="color: blue">g</span><span style="color: gray">,</span><span style="color: blue">l</span><span style="color: gray">,</span><span style="color: blue">n</span><span style="color: gray">,</span><span style="color: blue">u</span><span style="color: gray">,</span><span style="color: blue">w</span><span style="color: gray"><br /> </span><span style="color: blue">node4</span><span style="color: gray">:<span id="dkjxhvy" class="Apple-converted-space"> </span></span><span style="color: blue">a</span><span style="color: gray">,</span><span style="color: blue">c</span><span style="color: gray">,</span><span style="color: blue">h</span><span style="color: gray">,</span><span style="color: blue">j</span><span style="color: gray">,</span><span style="color: rgb(139,0,0)">q,</span><span style="color: red">s</span><span style="color: rgb(139,0,0)">,</span><span style="color: blue">x</span><span style="color: gray">,</span><span style="color: blue">z</span></div> </div> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">d了node4。可见,只有d、i、k、p、r、y命中了。像q样Q添加节点后 键分散到的服务器会发生巨大变化?6个键中只有六个在讉K原来的服务器Q?其他的全都移C其他服务器。命中率降低?3%。在Web应用E序中用memcachedӞ 在添加memcached服务器的瞬间~存效率会大q度下降Q负载会集中到数据库服务器上Q?有可能会发生无法提供正常服务的情c?/p> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">mixi的Web应用E序q用中也有这个问题,D无法dmemcached服务器?但由于用了新的分布式方法,现在可以轻而易丑֜dmemcached服务器了?q种分布式方法称?Consistent Hashing?/p> <h2 style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">Consistent Hashing</h2> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">关于Consistent Hashing的思想Qmixi株式会社的开发blog{许多地斚w介绍q, q里只简单地说明一下?/p> <ul style="padding-bottom: 0px; list-style-type: none; margin: 5px 0px 5px 16px; padding-left: 16px; padding-right: 0px; padding-top: 0px" class="list1"> <li style="padding-bottom: 2px; list-style-type: disc; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><a style="color: rgb(51,102,153); text-decoration: none" >mixi Engineers’ Blog - わVヹ{な分散で快適キャッシュライフ</a></li> <li style="padding-bottom: 2px; list-style-type: disc; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><a style="color: rgb(51,102,153); text-decoration: none" >ConsistentHashing - ゟ냳゗テン?ハッ゗?/a></li> </ul> <h3 style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">Consistent Hashing的简单说?/h3> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">Consistent Hashing如下所C:首先求出memcached服务器(节点Q的哈希| q将光|到0?<sup>32</sup>的圆QcontinuumQ上?然后用同LҎ求出存储数据的键的哈希|q映到圆上?然后从数据映到的位|开始顺旉查找Q将数据保存到找到的W一个服务器上?如果过2<sup>32</sup>仍然找不到服务器Q就会保存到W一台memcached服务器上?/p> <p style="text-align: left; padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px" class="img_margin"><img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="memcached-0004-04.png" alt="memcached-0004-04.png" src="http://tech.idv2.com/wp-content/uploads/2008/07/memcached-0004-04.png" width="521" height="409" /></p> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">? Consistent HashingQ基本原?/p> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">从上囄状态中d一台memcached服务器。余数分布式法׃保存键的服务器会发生巨大变化 而媄响缓存的命中率,但Consistent Hashing中,只有在continuum上增加服务器的地炚w时针方向的 W一台服务器上的键会受到影响?/p> <p style="text-align: left; padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px" class="img_margin"><img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="memcached-0004-05.png" alt="memcached-0004-05.png" src="http://tech.idv2.com/wp-content/uploads/2008/07/memcached-0004-05.png" width="518" height="439" /></p> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">? Consistent HashingQ添加服务器</p> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">因此QConsistent Hashing最大限度地抑制了键的重新分布?而且Q有的Consistent Hashing的实现方法还采用了虚拟节点的思想?使用一般的hash函数的话Q服务器的映地点的分布非常不均匀?因此Q用虚拟节点的思想Qؓ每个物理节点Q服务器Q?在continuum上分?00?00个点。这样就能抑制分布不均匀Q?最大限度地减小服务器增减时的缓存重新分布?/p> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">通过下文中介l的使用Consistent Hashing法的memcached客户端函数库q行试的结果是Q?由服务器台数QnQ和增加的服务器台数QmQ计增加服务器后的命中率计公式如下:</p> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">(1 - n/(n+m)) * 100</p> <h3 style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">支持Consistent Hashing的函数库</h3> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">本连载中多次介绍的Cache::Memcached虽然不支持Consistent HashingQ?但已有几个客L函数库支持了q种新的分布式算法?W一个支持Consistent Hashing和虚拟节点的memcached客户端函数库?名ؓlibketama的PHP库,由last.fm开发?/p> <ul style="padding-bottom: 0px; list-style-type: none; margin: 5px 0px 5px 16px; padding-left: 16px; padding-right: 0px; padding-top: 0px" class="list1"> <li style="padding-bottom: 2px; list-style-type: disc; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><a style="color: rgb(51,102,153); text-decoration: none" >libketama - a consistent hashing algo for memcache clients – RJ ブロ?- Users at Last.fm</a></li> </ul> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">至于Perl客户端,q蝲的第1?中介l过的Cache::Memcached::Fast和Cache::Memcached::libmemcached支持 Consistent Hashing?/p> <ul style="padding-bottom: 0px; list-style-type: none; margin: 5px 0px 5px 16px; padding-left: 16px; padding-right: 0px; padding-top: 0px" class="list1"> <li style="padding-bottom: 2px; list-style-type: disc; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><a style="color: rgb(51,102,153); text-decoration: none" >Cache::Memcached::Fast - search.cpan.org</a></li> <li style="padding-bottom: 2px; list-style-type: disc; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><a style="color: rgb(51,102,153); text-decoration: none" >Cache::Memcached::libmemcached - search.cpan.org</a></li> </ul> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">两者的接口都与Cache::Memcached几乎相同Q如果正在用Cache::MemcachedQ?那么可以方便地替换q来。Cache::Memcached::Fast重新实现了libketamaQ?使用Consistent Hashing创徏对象时可以指定ketama_points选项?/p> <pre>my $memcached = Cache::Memcached::Fast->new({<br /> servers => ["192.168.0.1:11211","192.168.0.2:11211"],<br /> ketama_points => 150<br /> });</pre> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">另外QCache::Memcached::libmemcached 是一个用了Brain Aker开发的C函数库libmemcached的Perl模块?libmemcached本n支持几种分布式算法,也支持Consistent HashingQ?其Perll定也支持Consistent Hashing?/p> <ul style="padding-bottom: 0px; list-style-type: none; margin: 5px 0px 5px 16px; padding-left: 16px; padding-right: 0px; padding-top: 0px" class="list1"> <li style="padding-bottom: 2px; list-style-type: disc; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 2px"><a style="color: rgb(51,102,153); text-decoration: none" >Tangent Software: libmemcached</a></li> </ul> <h2 style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">ȝ</h2> <p style="padding-bottom: 0px; margin: 1em 0px 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px">本次介绍了memcached的分布式法Q主要有memcached的分布式是由客户端函数库实现Q?以及高效率地分散数据的Consistent Hashing法。下ơ将介绍mixi在memcached应用斚w的一些经验, 和相关的兼容应用E序?/p> </span></span> <img src ="http://www.tkk7.com/syniii/aggbug/340783.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/syniii/" target="_blank">杨罗|?/a> 2010-12-15 13:35 <a href="http://www.tkk7.com/syniii/articles/340783.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[引]Java 5|6 q发包介l?/title><link>http://www.tkk7.com/syniii/archive/2010/12/08/340084.html</link><dc:creator>杨罗|?/dc:creator><author>杨罗|?/author><pubDate>Wed, 08 Dec 2010 09:40:00 GMT</pubDate><guid>http://www.tkk7.com/syniii/archive/2010/12/08/340084.html</guid><wfw:comment>http://www.tkk7.com/syniii/comments/340084.html</wfw:comment><comments>http://www.tkk7.com/syniii/archive/2010/12/08/340084.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/syniii/comments/commentRss/340084.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/syniii/services/trackbacks/340084.html</trackback:ping><description><![CDATA[     摘要: java.util.concurrent 包含许多U程安全、测试良好、高性能的ƈ发构建块。不客气地说Q创?java.util.concurrent 的目的就是要实现 Collection 框架Ҏ据结构所执行的ƈ发操作。通过提供一l可靠的、高性能q发构徏块,开发h员可以提高ƈ发类的线E安全、可伸羃性、性能、可L和可靠性?如果一些类名看h怼Q可能是因ؓ java.util.concurr...  <a href='http://www.tkk7.com/syniii/archive/2010/12/08/340084.html'>阅读全文</a><img src ="http://www.tkk7.com/syniii/aggbug/340084.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/syniii/" target="_blank">杨罗|?/a> 2010-12-08 17:40 <a href="http://www.tkk7.com/syniii/archive/2010/12/08/340084.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多线E锁机制的ȝhttp://www.tkk7.com/syniii/archive/2010/12/03/339679.html杨罗|?/dc:creator>杨罗|?/author>Fri, 03 Dec 2010 02:11:00 GMThttp://www.tkk7.com/syniii/archive/2010/12/03/339679.htmlhttp://www.tkk7.com/syniii/comments/339679.htmlhttp://www.tkk7.com/syniii/archive/2010/12/03/339679.html#Feedback0http://www.tkk7.com/syniii/comments/commentRss/339679.htmlhttp://www.tkk7.com/syniii/services/trackbacks/339679.htmlAQS中有一个state字段QintcdQ?2位)用来描述有多线E获持有锁。在独占锁的时代q个值通常?或?Q如果是重入的就是重入的ơ数Q,在共享锁的时代就是持有锁的数量?br /> 自旋{待适合于比较短的等待,而挂LE比较适合那些比较耗时的等待?br />

锁竞?/font>

影响锁竞争性的条g有两个:锁被h的频率和每次持有锁的旉。显然当而这二者都很小的时候,锁竞争不会成Z要的瓉。但是如果锁使用不当Q导致二者都比较大,那么很有可能CPU不能有效的处理Q务,d被大量堆U?/p>

所以减锁竞争的方式有下面三种Q?/p>

  1. 减少锁持有的旉
  2. 减少锁请求的频率
  3. 采用׃n锁取代独占锁

死锁

1.一U情冉|U程A永远不释NQ结果B一直拿不到锁,所以线EB?#8220;L”?br /> 2.W二U情况下Q线EA拥有U程B需要的锁YQ同时线EB拥有U程A需要的锁XQ那么这时候线EA/B互相依赖Ҏ释放锁,于是二者都“L”了?br /> 3.如果一个线EL不能被调度,那么{待此线E结果的U程可能死锁了。这U情况叫做线E饥饿死锁。比如说非公q锁中,如果某些U程非常z跃Q在高ƈ发情况下q类U程可能L拿到锁,那么那些z跃度低的线E可能就一直拿不到锁,q样发生了“饥饿?#8221;?/p>

避免死锁的解x案是Q?br /> 1.可能的按照锁的使用规范h锁,另外锁的h_度要小Q不要在不需要锁的地方占用锁Q锁不用了尽快释放)Q?br /> 2.在高U锁里面L使用tryLock或者定时机Ӟ是指定获取锁超时的旉Q如果时间到了还没有获取到锁那么放弃)。高U锁QLockQ里面的q两U方式可以有效的避免死锁?/p>



]]>
java内部c详?/title><link>http://www.tkk7.com/syniii/archive/2010/11/25/339036.html</link><dc:creator>杨罗|?/dc:creator><author>杨罗|?/author><pubDate>Thu, 25 Nov 2010 08:27:00 GMT</pubDate><guid>http://www.tkk7.com/syniii/archive/2010/11/25/339036.html</guid><wfw:comment>http://www.tkk7.com/syniii/comments/339036.html</wfw:comment><comments>http://www.tkk7.com/syniii/archive/2010/11/25/339036.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.tkk7.com/syniii/comments/commentRss/339036.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/syniii/services/trackbacks/339036.html</trackback:ping><description><![CDATA[     摘要: 内部c详?nbsp; 1、定?nbsp;   一个类的定义放在另一个类的内部,q个cd叫做内部cR?nbsp; Java代码  public class First {   public class Contents{   &nb...  <a href='http://www.tkk7.com/syniii/archive/2010/11/25/339036.html'>阅读全文</a><img src ="http://www.tkk7.com/syniii/aggbug/339036.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/syniii/" target="_blank">杨罗|?/a> 2010-11-25 16:27 <a href="http://www.tkk7.com/syniii/archive/2010/11/25/339036.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring中一些aware接口http://www.tkk7.com/syniii/archive/2010/11/24/338906.html杨罗|?/dc:creator>杨罗|?/author>Wed, 24 Nov 2010 03:14:00 GMThttp://www.tkk7.com/syniii/archive/2010/11/24/338906.htmlhttp://www.tkk7.com/syniii/comments/338906.htmlhttp://www.tkk7.com/syniii/archive/2010/11/24/338906.html#Feedback1http://www.tkk7.com/syniii/comments/commentRss/338906.htmlhttp://www.tkk7.com/syniii/services/trackbacks/338906.html

Spring中提供一些Aware相关接口Q像是BeanFactoryAware?ApplicationContextAware、ResourceLoaderAware、ServletContextAware{等Q实现这?Aware接口的Bean在被初始之后Q可以取得一些相对应的资源,例如实现BeanFactoryAware的Bean在初始后QSpring容器会注入BeanFactory的实例,而实现ApplicationContextAware的BeanQ在Bean被初始后Q将会被注入 ApplicationContext的实例等{?/span>

 Bean取得BeanFactory、ApplicationContextAware的实例目的是什么,一般的目的是要取得一些档案资源的存取、相 兌息资源或是那些被注入的实例所提供的机Ӟ例如ApplicationContextAware提供了publishEvent()ҎQ可以支持基于Observer模式的事件传播机制?/span>

 ApplicationContextAware接口的定义如下:

ApplicationContextAware.java

public interface ApplicationContextAware {

    void setApplicationContext(ApplicationContext context);

}


 我们q边C如何透过实现ApplicationContextAware注入ApplicationContext来实C件传播,首先我们的HelloBean如下Q?/span>

HelloBean.java

package onlyfun.caterpillar;

 

import org.springframework.context.*;

 

public class HelloBean implements ApplicationContextAware {

    private ApplicationContext applicationContext;

    private String helloWord = "Hello!World!";

  

    public void setApplicationContext(ApplicationContext context) {

        this.applicationContext = context;

    }

  

    public void setHelloWord(String helloWord) {

        this.helloWord = helloWord;

    }

  

    public String getHelloWord() {

        applicationContext.publishEvent(

               new PropertyGettedEvent("[" + helloWord + "] is getted"));

        return helloWord;

    }

}


 ApplicationContext会由Spring容器注入QpublishEvent()Ҏ需要一个承ApplicationEvent的对象,我们的PropertyGettedEventl承了ApplicationEventQ如下:

PropertyGettedEvent.java

package onlyfun.caterpillar;

 

import org.springframework.context.*;

 

public class PropertyGettedEvent extends ApplicationEvent {

    public PropertyGettedEvent(Object source) {

        super(source);

    }

}


 当ApplicationContext执行publishEvent()后,会自动寻扑֮现ApplicationListener接口的对象ƈ通知其发生对应事Ӟ我们实现了PropertyGettedListener如下Q?/span>

PrppertyGettedListener.java

package onlyfun.caterpillar;

 

import org.springframework.context.*;

 

public class PropertyGettedListener implements ApplicationListener {

    public void onApplicationEvent(ApplicationEvent event) {

        System.out.println(event.getSource().toString());  

    }

}


 Listener必须被实例化Q这我们可以在Bean定义档中加以定义Q?/span>

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

    <bean id="propertyGetterListener" class="onlyfun.caterpillar.PropertyGettedListener"/>

 

    <bean id="helloBean" class="onlyfun.caterpillar.HelloBean">

        <property name="helloWord"><value>Hello!Justin!</value></property>

    </bean>

</beans>


 我们写一个测试程序来测事g传播的运行:

Test.java

package onlyfun.caterpillar;

 

import org.springframework.context.*;

import org.springframework.context.support.*;

 

public class Test {

    public static void main(String[] args) {

        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");

      

        HelloBean hello = (HelloBean) context.getBean("helloBean");

        System.out.println(hello.getHelloWord());

    }

}


 执行l果会如下所C:

log4j:WARN No appenders could be found for logger

(org.springframework.beans.factory.xml.XmlBeanDefinitionReader).

log4j:WARN Please initialize the log4j system properly.

org.springframework.context.support.ClassPathXmlApplicationContext:

displayName=[org.springframework.context.support.ClassPathXmlApplicationContext;

hashCode=33219526]; startup date=[Fri Oct 29 10:56:35 CST 2004];

root of ApplicationContext hierarchy

[Hello!Justin!] is getted

Hello!Justin!


 以上是以实现事g传播来看看实现Aware接口取得对应对象后,可以q行的动作,同样的,您也可以实现ResourceLoaderAware接口Q?/span>

ResourceLoaderAware.java

public interface ResourceLoaderAware {

    void setResourceLoader(ResourceLoader loader);

}


 实现ResourceLoader的Bean可以取得ResourceLoader的实例,如此可以用它的getResource()ҎQ这对于必须存取档案资源的Bean相当有用?/span>

 基本上,Spring虽然提供了这些Aware相关接口Q然而Bean上若实现了这些界面,q是与Spring发生了依赖,从另一个角度来看,虽然您可以直接在Bean上实现这些接口,但您也可以透过setter来完成依赖注入,例如Q?/span>

HelloBean.java

package onlyfun.caterpillar;

 

import org.springframework.context.*;

 

public class HelloBean {

    private ApplicationContext applicationContext;

    private String helloWord = "Hello!World!";

  

    public void setApplicationContext(ApplicationContext context) {

        this.applicationContext = context;

    }

  

    public void setHelloWord(String helloWord) {

        this.helloWord = helloWord;

    }

  

    public String getHelloWord() {

        applicationContext.publishEvent(new PropertyGettedEvent("[" + helloWord + "] is getted"));

        return helloWord;

    }

}


 注意q次我们q没有实现ApplicationContextAwareQ我们在E序中可以自行注入ApplicationContext实例Q?/span>

ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");

      

HelloBean hello = (HelloBean) context.getBean("helloBean");

hello.setApplicationContext(context);

System.out.println(hello.getHelloWord());


 Bean而言Q降低了对Spring的依赖,可以比较Ҏ从现有的框架中脱R?/span>

 



]]>
Hibernate的二U缓存策?/title><link>http://www.tkk7.com/syniii/articles/338462.html</link><dc:creator>杨罗|?/dc:creator><author>杨罗|?/author><pubDate>Fri, 19 Nov 2010 03:33:00 GMT</pubDate><guid>http://www.tkk7.com/syniii/articles/338462.html</guid><wfw:comment>http://www.tkk7.com/syniii/comments/338462.html</wfw:comment><comments>http://www.tkk7.com/syniii/articles/338462.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/syniii/comments/commentRss/338462.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/syniii/services/trackbacks/338462.html</trackback:ping><description><![CDATA[Hibernate的二U缓存策略的一般过E如下: <br /> <br />   1) 条g查询的时候,L发出一条select * from table_name where …. Q选择所有字D)q样的SQL语句查询数据库,一ơ获得所有的数据对象?<br /> <br />   2) 把获得的所有数据对象根据ID攑օ到第二~存中?<br /> <br />   3) 当HibernateҎID讉K数据对象的时候,首先从Session一U缓存中查;查不刎ͼ如果配置了二U缓存,那么从二U缓存中查;查不刎ͼ再查询数据库Q把l果按照ID攑օ到缓存?<br /> <br />   4) 删除、更新、增加数据的时候,同时更新~存?<br /> <br />   Hibernate的二U缓存策略,是针对于ID查询的缓存策略,对于条g查询则毫无作用。ؓ此,Hibernate提供了针Ҏ件查询的Query~存?<br /> <br />   Hibernate的Query~存{略的过E如下: <br /> <br />   1) Hibernate首先Ҏq些信息l成一个Query KeyQQuery Key包括条g查询的请求一般信息:SQL, SQL需要的参数Q记录范_起始位置rowStartQ最大记录个数maxRows)Q等?<br /> <br />   2) HibernateҎq个Query Key到Query~存中查扑֯应的l果列表。如果存在,那么q回q个l果列表Q如果不存在Q查询数据库Q获取结果列表,把整个结果列表根据Query Key攑օ到Query~存中?<br /> <br />   3) Query Key中的SQL涉及C些表名,如果q些表的M数据发生修改、删除、增加等操作Q这些相关的Query Key都要从缓存中清空? <img src ="http://www.tkk7.com/syniii/aggbug/338462.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/syniii/" target="_blank">杨罗|?/a> 2010-11-19 11:33 <a href="http://www.tkk7.com/syniii/articles/338462.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]CAS原理http://www.tkk7.com/syniii/archive/2010/11/18/338387.html杨罗|?/dc:creator>杨罗|?/author>Thu, 18 Nov 2010 07:16:00 GMThttp://www.tkk7.com/syniii/archive/2010/11/18/338387.htmlhttp://www.tkk7.com/syniii/comments/338387.htmlhttp://www.tkk7.com/syniii/archive/2010/11/18/338387.html#Feedback1http://www.tkk7.com/syniii/comments/commentRss/338387.htmlhttp://www.tkk7.com/syniii/services/trackbacks/338387.html

在JDK 5之前Java语言是靠synchronized关键字保证同步的Q这会导致有锁(后面的章节还会谈到锁Q?/p>

锁机制存在以下问题:

Q?Q在多线E竞争下Q加锁、释N会导致比较多的上下文切换和调度gӞ引v性能问题?/p>

Q?Q一个线E持有锁会导致其它所有需要此锁的U程挂v?/p>

Q?Q如果一个优先高的U程{待一个优先低的U程释放锁会D优先U倒置Q引h能风险?/p>

volatile是不错的机制Q但是volatile不能保证原子性。因此对于同步最l还是要回到锁机制上来?/p>

独占锁是一U悲观锁Qsynchronized是一U独占锁Q会D其它所有需要锁的线E挂P{待持有锁的U程释放锁。而另一个更加有效的锁就是乐观锁。所?span style="color: red">?span style="color: red">观锁是Q?/span>每次不加锁而是假设没有冲突而去完成某项操作Q如果因为冲H失败就重试Q直到成功ؓ止?br />
CAS 操作

上面的乐观锁用到的机制就是CASQCompare and Swap?/p>

CAS?个操作数Q内存值VQ旧的预期值AQ要修改的新值B。当且仅当预期值A和内存值V相同Ӟ内存值V修改为BQ否则什么都不做?/p>

非阻塞算?Qnonblocking algorithmsQ?/strong>

一个线E的p|或者挂起不应该影响其他U程的失败或挂v的算法?/p>

C的CPU提供了特D的指oQ可以自动更新共享数据,而且能够到其他U程的干扎ͼ?compareAndSet() qq些代替了锁定?/p>

拿出AtomicInteger来研I在没有锁的情况下是如何做到数据正确性的?/p>

private volatile int value;

首先毫无以ؓQ?span style="color: red">在没有锁的机制下可能需要借助volatile原语Q保证线E间的数据是可见的(׃n的)?/span>q样才获取变量的值的时候才能直接读取?/p>

public final int get() {
        return value;
    }

然后来看?+i是怎么做到的?/p>

public final int incrementAndGet() {
    for (;;) {
        int current = get();
        int next = current + 1;
        if (compareAndSet(current, next))
            return next;
    }
}

在这里采用了CAS操作Q每ơ从内存中读取数据然后将此数据和+1后的l果q行CAS操作Q如果成功就q回l果Q否则重试直到成功ؓ止?/p>

而compareAndSet利用JNI来完成CPU指o的操作?/p>

public final boolean compareAndSet(int expect, int update) {   
    return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
    }

整体的过E就是这样子的,利用CPU的CAS指oQ同时借助JNI来完成Java的非d法。其它原子操作都是利用类似的Ҏ完成的?/p>

而整个J.U.C都是建立在CAS之上的,因此对于synchronizedd法QJ.U.C在性能上有了很大的提升?br />
CAS看v来很爽,但是会导?#8220;ABA问题”?/p>

CAS法实现一个重要前提需要取出内存中某时ȝ数据Q而在下时L较ƈ替换Q那么在q个旉差类会导致数据的变化?/p>

比如说一个线Eone从内存位|V中取出AQ这时候另一个线Etwo也从内存中取出AQƈ且twoq行了一些操作变成了BQ然后two又将V位置的数据变成AQ这时候线Eoneq行CAS操作发现内存中仍然是AQ然后one操作成功。尽线Eone的CAS操作成功Q但是不代表q个q程是没有问题的。如果链表的头在变化了两ơ后恢复了原|但是不代表链表就没有变化。因此前面提到的原子操作AtomicStampedReference/AtomicMarkableReference很有用了。这允许一对变化的元素q行原子操作?/span>



]]>
վ֩ģ壺 2021â | ˿wwwƵ| ޾Ʒ߲| ëƬȫ| ޾Ƶ| ƷĻһ| Ƶۿ| ˬִ̼վֱ | Ʒ޳AV߹ۿ| ƵƷѵĹ| ձѹۿ| ޾Ʒ| þ޾Ʒavվ| պѸһëƬ| Ƶվ| ԻȫƵѿ| ɫͼۺվ| ߾Ʒһ| ëƬվ߹ۿ| þùѾƷ| ƬӰԺۿ| tomӰԺ޹һ| ۺϳ91Ʒ| Ƭ߹ۿ| ͤͤѸ| 99þѹۺϾƷ| ŷƷרþ| ޿һ24޿| jjzz߲Ź| vaƷѹۿ| ˿wwwƵ| Ʒ| 츾ٸ߹ۿ| ޵ӰĻ| ҹþþþ| Ļվ| һһëƬa| ̨һëƬ| 67194Ʒѹۿ| һëƬ߲Ƶ| һػ¼Ƶ |