- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Discuz NT跨站缓存同步
Discuz NT跨站缓存同步
Discuz!NT跨站缓存同步
参考文章:Discuz!NT缓存设计简析Discuz!NT中集成Memcached分布式缓存在Discuz!NT中进行缓存分层(本地缓存+memcached)在之前的文章中,提到了在Discuz!NT中进行缓存分层的概念。之前在产品中也实现了其中的构想,但该方案有一个问题,就是如果将产品进行分布式布署之后,如果某一站点发生数据变化时,只能更新本地缓存和Memcached缓存信息,而其它分布式布署的站点则无法收到缓存数据已修改的通知,导致数据不同步而成为脏数据。虽然在之前的文章中提到通过将本地缓存失效时间缩短(比如15秒后即失效),以便在相对较短的时间内让本地数据失效从而再次从Memcached读取最新的数据,但这必定不符合我们设计的基本思路,并且导致程序的运行效率低,同时会造成过于频繁的访问Memcached,无形中增加了与Memcached的socket开销。所以才有了今天的这篇文章。首先要说明的是,这个方案只有Discuz!NT的企业版(EntLib)中提供,所以在普通的版本中是找不到它的影子的,下面我就简要说明一下其实现思路。因为在传统的WEB应用开发中,一般都是采用get的方式来获得所需要的数据,也就是通过从客户端向服务端发送get请求来获得数据。而如果要实现下面的流程:
当本地缓存数据变化--更新memcached--(通知notify)其它分布式应用这里我借助主动发送的模式来实现,为了便于理解,我这里将memcached变成服务端,将分布式布署的应用看成是一个个客户端,而当客户端将数据更新到memcached时,通过发送http通知的方式来通知其它客户端,所以我们要实现的代码包括两部分,一部分实现上面流程中的将本地数据变化告之到memcached。这块代码已在之前的文章中被实现了,而我们只要在相应的RemoveObject方法后跟上一行通知其它分布式应用即可(代码位于Discuz.EntLib\Memcached\MemCachedStrategy.cs),如下面所示:
代码
///summary///移除指定ID的对象////summary///param name=objId/param public override void RemoveObject(string objId){//先移除本地cached,然后再移除memcached中的相应数据if base.RetrieveObject(objId)!=null base.RemoveObject(objId);if(MemCachedManager.CacheClient.KeyExists(objId))MemCachedManager.CacheClient.Delete(objId);Discuz.EntLib.SyncCache.SyncRemoteCache(objId);//通知其它分布式应用}下面就是同步其它分布式应用缓存数据的代码了。在介绍代码之前,先要将发送缓存数据修改通知的设计思想介绍一下:1.首先我们需要一下记录着分布式布署应用的网站列表,它主要是一链接串,比如下面这个格式(用逗号分割):
SiteUrl/SiteUrl我们需要将上面的链接串分割之后加上相应的更新缓存工具页面(稍后介绍)来实现移除(相当时同步)的功能。2.为了安全起见,在发送通知的请求时,需要对请求进行加密,以免该功能被其它恶意代码利用,从而造成系统安全性和效率受到影响,所以我这里提供了认证码,即:
AuthCode /AuthCode这样,认证码加密的请求只有在被同步工具正确解析后,才会更新相应的缓存数据。了解这些内容之后,我们看一下相应的实现代码以验证一下所说的设计思想(Discuz.EntLib\SyncLocalCache\SyncCache.cs):
代码
///summary///同步缓存类////summary public class SyncCache{///summary///除本站之外的负载均衡站点列表////summary static List string syncCacheUrlList=null;static LoadBalanceConfigInfo loadBalanceConfigInfo=LoadBalanceConfigs.GetConfig();static SyncCache(){syncCacheUrlList=new List string();syncCacheUrlList.AddRange(loadBalanceConfigInfo.SiteUrl.Replace(tools/,tools/SyncLocalCache.ashx).Split(
您可能关注的文档
最近下载
- 学堂在线 海上求生与救生 章节测试答案.docx VIP
- 2025年甘肃省兰州建投物业管理有限公司招聘笔试备考题库及答案解析.docx VIP
- 学堂在线 生活英语读写 期末考试复习题答案.docx VIP
- 医用护理垫技术要求.docx VIP
- 裂项相消求和法-【名师经典教学设计课件】.doc VIP
- 走进现代舞知到智慧树期末考试答案题库2025年浙江大学.docx
- 声导抗与声反射测试及应用.pptx VIP
- 《急诊外科急救技术》课件.ppt VIP
- 2024年深圳学业水平考试信息技术A卷测试题及答案.docx VIP
- 2025年甘肃省兰州建投物业管理有限公司招聘笔试模拟试题及答案解析.docx VIP
原创力文档


文档评论(0)