浅谈SpaceBuilder系统的缓存机制_缓存思想

在前面的文章中也提及到为了提高系统的性能,SpaceBuilder在内部做了大量的工作,而数据缓存就是其中非常高效的处理方式.

我们知道SpaceBuilder采用了多层架构的处理模式,数据通过业务实体的形式在系统框架的各个层内传递.(如图1)

clip_image002

图表 1SpaceBuilder中数据(业务实体)在各个框架层间的传递

业务实体是在各层间进行数据传递的形式,但其最初都来源于各种序列化的第三方的存储介质(比如此处的SQLServer数据库)中.我们知道这各种 第三方存储介质由于要进行各种I/O操作,其访问速度和响应性能肯定会受到一定的约束.为了提高访问速度获取更好的响应性能,那么我们是否可以考虑把业务 实体从各种序列化存储介质剥离出来,将其放入性能更快的不需要频繁进行I/O操作的介质(比如内存)中呢? SpaceBuilder就是这么做的.

当然采用内存保存业务信息,速度效率是能得到保证了,但是其有一个致命的缺点—数据不能持久化,也就是说当一断电的时候,内存中所有的数据都被清空 了.这样不能保存用户的业务数据肯定是不可以的.而我们的系统又要求有较高的性能?那有如何办呢? SpaceBuilder就在使用内存和第三方介质保存业务数据间,进行了一定的取舍和平衡.什么意思呢? 所有的数据都真实的保存的第三方介质中,而在内存中对其做镜像;也就是说数据在系统中存在两份.这个时候,有一件事情就变的尤其重要,那就是两份数据同步 的问题. 当然我们可以通过一定的策略对其进行保证(下面会有专门的文字谈到这个问题).

系统中会有两份数据,那么这两份数据都在什么情况下使用呢?首先我们使用网络通常会有这么一个体验(或者说习惯): 因为我们上网的目的很大程度上是在获取信息,那么我们去浏览信息的的时间可能会占到我们总上网时间的95%,甚至更多, 而我们为了展示自己而发布信息 的时候就会很少,几乎连5%都占不到. 那么我们将这两个行为进行抽象,浏览信息对应我们开发来说肯能就是 Get(),或者是GetList()方法;而发布信息就是Add(),Update(),Delete()方法. 这样我们就可以吧改变业务数据的方式(Add/Update/Delete)其直接操作第三方存储介质,而不改变业务数据的方法(Get /GetList)直接读取内存. 这无疑即保存了用户的数据,也提高了访问速度(因为95%或者更多时候大家都是在Get数据,而Get对应的操作对象是响应速度更多的内存).

使用方式

SpaceBuilder中的缓存都统一封装在了WebCache类中.WebCache类功能非常强大,同时使用也非常简单.

l Insert()—将某一个(一批)业务数据,保存入缓存体系中;

l Remove()—将某一个(一批)业务数据,从缓存体系中移除;

l Get()—从缓存体系中获取某一个(一批)业务数据

那么我们研究WebCache就先从获取业务数据(Get方法)看起.Components中所有的Get方法几乎都采用了相似的处理逻辑,我们可以随便找一个(此处我们以Files/Components/FileSections.cs 142行为例)

public static FileSection GetSection(int sectionID, bool userCache)

{

string cacheKey = string.Format(“FileSection-SectionID:{0}”, sectionID);

FileSection section = null;

if (userCache)

section = WebCache.Get(cacheKey) as FileSection;

if (section == null)

{

section = FileDataProvider.Instance().GetSection(sectionID);

if (userCache)

WebCache.Insert(cacheKey, section, WebCache.MinuteFactor * 2);

}

return section;

}

首先其 创建了一个缓存的键string cacheKey = string.Format(“FileSection-SectionID:{0}”, sectionID); 接着先去系统缓存中根据这个键去获取 相应的值WebCache.Get(cacheKey) as FileSection.如果这个值没有取到if (section == null),那么就再通过第三方介质获取section = FileDataProvider.Instance().GetSection(sectionID)(这个方法实际上使用配置中设置的数据提供者(可 能是SqlServer)获取业务数据,这个知识点在数据库访问中提及,可以参考这个《浅谈SpaceBuilder系统中的数据访问体系》).最后在把 这个获取到业务数据返回给调用方法前先放入到缓存中一份,供此客户或其他客户下次调用(也就是说当系统启动后,第一次请求某个业务数据的时候,缓存中是肯 定不会存在的,那么其将从第三方介质中获取到,第二次(及其后续)访问的时候,就能够使用第一次访问是生成在内存中的缓存数据了.) 这也是一个每请求俱缓存的思想.

那么会改变业务数据的操作,在SpaceBuilder里面是怎样进行的操作呢?我们看这个类的Update方法

public static int Update(FileSection section)

{

// Make sure it is clean

section.SectionName = HtmlScrubber.Clean(section.SectionName, false, true);

section.Description = HtmlScrubber.Clean(section.Description, false, true);

// Censor the stuff, if enabled

if (SiteSettingsManager.GetSiteSettings().EnableCensorship)

{

section.SectionName = Censors.CensorPost(section.SectionName);

section.Description = Censors.CensorPost(section.Description);

}

FileDataProvider.Instance().CreateUpdateSection(section, DataProviderAction.Update);

//清除缓存

WebCache.Remove(string.Format(“FileSection-SectionID:{0}”, section.SectionID));

WebCache.Remove(string.Format(“FileSection-ApplicationKey:{0}”, section.ApplicationKey));

WebCache.RemoveByPattern(“FileSections::”);

// Return the ID

return section.SectionID;

}

我们看到84行,首先其通过数据提供者操作更新第三方介质中的业务数据 FileDataProvider.Instance().CreateUpdateSection(section, DataProviderAction.Update);然后87-89行根据一定的键,从缓存中移除掉相应的业务数据(因为缓存中的业务数据跟第三方介 质中的数据的状态已经不一致了,因此将其移除;等下次用户请求的时候再重新从第三方介质中读取并且将新的数据写入缓存中). 也就是说每当有业务数据的状态改变的时候,都要同时更新缓存中的数据,以保证两份的数据的状态一致.

内部实现

如果大家有兴趣,还可以查看一下WebCache类的内部实现方式.

我们走正常的思维,通过构造函数解读这个类

static WebCache()

{

HttpContext context = HttpContext.Current;

if (context != null)

_cache = context.Cache;

else

_cache = HttpRuntime.Cache;

}

看完这个构造函数,我们想大家应就会明白 SpaceBuilder中缓存的数据是通过什么方式保存在内存中的了.不错就是dotNet的系统缓存(我们可以通过HTTPContext上下文访问 到这个对象), SpaceBuilder只是在这个对象上进行了一次包装,包装后的新类更加面向我们的开发人员—接口更加友好,调用更加方便.那么我就看一下这个类的几 个常用方法:

l Get()最常用也最简单

由于系统的Cache对象本身就是一个可枚举类型,因此我们可以直接通过索引的方式访问

public static object Get(string key)

{

return _cache[key];

}

l Insert()向缓存中插入数据

/// <summary>

/// 加入缓存项

/// </summary>

/// <param name=”key”>缓存项标识</param>

/// <param name=”obj”>缓存项</param>

/// <param name=”dep”>缓存依赖<see cref=”System.Web.Caching.CacheDependency”/></param>

/// <param name=”secondsBase”>缓存秒基数(最终秒数的计算为Factor * secondsBase) </param>

/// <param name=”priority”>缓存优先级<see cref=”System.Web.Caching.CacheItemPriority”/></param>

public static void Insert(string key, object obj, CacheDependency dep, int secondsBase, CacheItemPriority priority)

{

if (obj != null)

_cache.Insert(key, obj, dep, DateTime.Now.AddSeconds(Factor * secondsBase), TimeSpan.Zero, priority, null);

}

Insert()方法也很简单,直接调用系统Cache的Insert()方法,将一个键(缓存的名称标识),一个值(缓存的具体对象),还用其他的辅助参数(比如缓存的时间,缓存的级别,缓存的依赖对象等)

l Remove()从缓存中删除数据

public static void Remove(string key)

{

_cache.Remove(key);

}

调用系统Cache的Remove()方法

l RemoveByPattern()通过正则表达式删除相匹配的数据

public static void RemoveByPattern(string pattern)

{

IDictionaryEnumerator cacheEnum = _cache.GetEnumerator();

Regex regex = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.Compiled);

while (cacheEnum.MoveNext())

{

if (regex.IsMatch(cacheEnum.Key.ToString()))

_cache.Remove(cacheEnum.Key.ToString());

}

}

这个方法其实也简单就是 先遍历系统Cache内所有的数据,然后通过正则表达式验证是否匹配,决定是否删除.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spacebuilder是一款基于asp.net mvc业内领先的web2.0建站平台。结合博客、群组、论坛、微博、分享、相册、文件、活动、投票、资讯等应用模块(此外还提供问答、招贴、招聘等扩展模块),可以一站式快速的搭建具有SNS特征的在线社区。借助SpaceBuilder平台的服务(私信、邀请、权限、审核、隐私、积分、通知、动态、标签、分类、附件、全文检索…),二次开发者可以快速的增加新的应用模块或者对现有的应用模块进行定制。   SpaceBuilder(简称SPB,软件著作权登记号: 2008SR14027)诞生于2007年, 是asp.net技术中最为强大的社区产品。作为国内最早的web2.0社区产品,SpaceBuilder始终专注于web2.0在国内的应用创新,竭尽全力为社区的发展做出自己的贡献。使用预置的博客、群组、论坛、微博、分享、相册、文件、活动、投票、资讯等应用模块,用户可以一站式快速搭建具有sns特征的社区网站。此外,为站点运营者考虑还提供了问答、招贴、招聘等扩展应用模块。   SpaceBuilder采用了"平台 应用"的设计理念,依托SpaceBuilder平台的服务(私信、邀请、权限、审核、隐私、积分、通知、动态、标签、分类、附件、全文检索...),二次开发者可以快速添加新的应用模块。   面向高端,为客户站点的飞跃式发展保驾护航,一直是SpaceBuilder孜孜不倦的追求。通过数据库优化设计、分页算法、全文检索,SpaceBuilder可以轻松处理千万级以上数据。借助于当前最优的分布式部署方案,SpaceBuilder已经在多个客户站点验证了万人同时在线的性能目标。   Spacebuilder v3.2与上个版本相比,主要有以下重要改进: 1.  集成QQ和新浪微博账号,可以直接使用新浪微博和QQ账号进行登录。 2.  微博进一步增强,v3.2中的微博功能已经可以与新浪微博、腾讯微博媲美,并尽量保留了这些主流微博的使用习惯。v3.2的微博主要增加了以下功能:       1) 发布微博时可以同步到新浪微博,方便两个微博的维护(需要绑定新浪微博账号);       2) 可以对关注的用户进行分组,并且可以根据分组查看进入自己时间线的微博;       3) 可以创建特色话题,通过图片、文字加强话题的展现;       4) 可以创建微博大屏幕,尤其可以在活动、会议中吸引更多人参与互动;       5) 加强了微博显示的即时性,在“我的首页”、“大屏幕导播室”、“广场”等位置基本没有页面刷新也会即时得到最新信息;       6) 可以对感兴趣的微博进行收藏,以便以后随时查看。 3.  新增了4套频道皮肤和2套空间皮肤; 4.  其他改进:       1) 增加发布公告功能:管理员可以在后台发布公告,并且可以控制在频道、空间、群组不同的区域显示;公告也可以是外链;可以设置公告标题高亮显示(颜色、加粗、字号);阅读过的公告不再提示;       2) 增加身份认证功能:管理员可以定义不同的身份名称及图标,管理员可以为用户赋予身份及身份说明,身份标识在用户的空间显著显示,并且同时在微博、动态中显示;       3) 增强邀请朋友加入群组功能,可以自己邀请站外用户加入群组;       4) 后台首页增加了管理员待处理事项,对于需要做哪些管理操作一目了然;       5) 重新优化全文检索,使搜索结果更加准确;       6) 修复了70多个bug。   注意:Spacebuilder v3.2采用asp.net mvc 2.0开发,服务器安装 .net framework 3.5 (建议安装.net framework3.5 SP1)或 .NET Framework4.0。 如果使用SDK版本还需要安装 asp.net mvc 2.0。开发工具可以使用vs2010或vs2008(vs2008必须安装 sp1补丁)。
Spacebuilder自2007年诞生以来已经成长成为最专业、成熟的SNS社区系统,在v4.1发布之际官方正式启用中文名称——“近乎”。希望通过近乎搭建的社区网站,可以拉近用户之间的距离,让用户之间更加近乎。 v4.0是近乎发展到成熟阶段最重要的一次升级,v4.1进一步贯彻了v4.0规划思路,完善了部分功能和用户体验,更重要是v4.1开始了对手机客户端的支持,Android客户端将与v4.1一起发布(iPhone客户端正在研发之中),此外v4.1开始支持MySQL让各位站长在运行环境方面有了更多选择。接下来一起看一下近乎v4.1为大家带来哪些惊喜。 资讯 资讯属于站点标配,在各类社区站点有很高的使用率。v4.1增加了资讯模块,界面更加简洁易用方便阅读,允许用户投稿。同时还具有丰富的社会化功能,不仅有评论、顶踩还可以一键分享到站外、使用社会化评论插件。 用户体验提升 V4.1修复了200多个大大小小的bug,也采纳了大量的用户建议,在诸多细节上增强了用户体验。例如:用户挣取或花费积分时有即时醒目的提示、文章中的图片可以连续播放并支持查看原图;管理员可直接在前台对特色话题的进行管理,更加灵活便捷。 浏览更加流畅 对站点最常访问的几十个页面进行了性能优化,相比之前的响应时间均提升了80%以上。 支持MySQL 近乎团队从v4.1开始突破微软体系的运行环境,考虑为客户提供更加廉价、高效的站点运行环境。从v4.1开始加入对MySQL的支持,客户可以免费获得MySQL或者用比SQLServer低得多的价格租用MySQL数据库空间,此外对于大型站点MySQL提供更好的分布式部署方案。 Android客户端 采用原生Android开发技术,继承了业内同类流行APP的操作习惯。简约的操作界面、舒适的阅读感受、便捷的操作方式为用户带来流畅的用户体验。包括消息实时推送、微博、动态、博文/帖子/图片的浏览、评论/回复等互动功能。 相关资源 近乎 Android客户端介绍:http://www.jinhusns.com/Products/Android 近乎 v4.1变更历史:http://www.jinhusns.com/Content/News/391 近乎 v4.1体验:http://demo.jinhusns.com 近乎 v4.1下载:http://www.jinhusns.com/Products/Download
Spacebuilder是一款基于asp.net mvc业内领先的web2.0建站平台。结合博客、群组、论坛、微博、分享、相册、文件、活动、投票、资讯等应用模块(此外还提供问答、招贴、招聘等扩展模块),可以一站式快速的搭建具有SNS特征的在线社区。借助SpaceBuilder平台的服务(私信、邀请、权限、审核、隐私、积分、通知、动态、标签、分类、附件、全文检索…),二次开发者可以快速的增加新的应用模块或者对现有的应用模块进行定制。   SpaceBuilder(简称SPB,软件著作权登记号: 2008SR14027)诞生于2007年, 是asp.net技术中最为强大的社区产品。作为国内最早的web2.0社区产品,SpaceBuilder始终专注于web2.0在国内的应用创新,竭尽全力为社区的发展做出自己的贡献。使用预置的博客、群组、论坛、微博、分享、相册、文件、活动、投票、资讯等应用模块,用户可以一站式快速搭建具有sns特征的社区网站。此外,为站点运营者考虑还提供了问答、招贴、招聘等扩展应用模块。     SpaceBuilder采用了"平台 应用"的设计理念,依托SpaceBuilder平台的服务(私信、邀请、权限、审核、隐私、积分、通知、动态、标签、分类、附件、全文检索...),二次开发者可以快速添加新的应用模块。 面向高端,为客户站点的飞跃式发展保驾护航,一直是SpaceBuilder孜孜不倦的追求。通过数据库优化设计、分页算法、全文检索,SpaceBuilder可以轻松处理千万级以上数据。借助于当前最优的分布式部署方案,SpaceBuilder已经在多个客户站点验证了万人同时在线的性能目标。     Spacebuilder v3.2与上个版本相比,主要有以下重要改进: 1. 集成QQ和新浪微博账号,可以直接使用新浪微博和QQ账号进行登录。 2. 微博进一步增强,v3.2中的微博功能已经可以与新浪微博、腾讯微博媲美,并尽量保留了这些主流微博的使用习惯。v3.2的微博主要增加了以下功能: 1) 发布微博时可以同步到新浪微博,方便两个微博的维护(需要绑定新浪微博账号); 2) 可以对关注的用户进行分组,并且可以根据分组查看进入自己时间线的微博; 3) 可以创建特色话题,通过图片、文字加强话题的展现; 4) 可以创建微博大屏幕,尤其可以在活动、会议中吸引更多人参与互动; 5) 加强了微博显示的即时性,在“我的首页”、“大屏幕导播室”、“广场”等位置基本没有页面刷新也会即时得到最新信息; 6) 可以对感兴趣的微博进行收藏,以便以后随时查看。 3. 新增了4套频道皮肤和2套空间皮肤; 4. 其他改进: 1) 增加发布公告功能:管理员可以在后台发布公告,并且可以控制在频道、空间、群组不同的区域显示;公告也可以是外链;可以设置公告标题高亮显示(颜色、加粗、字号);阅读过的公告不再提示; 2) 增加身份认证功能:管理员可以定义不同的身份名称及图标,管理员可以为用户赋予身份及身份说明,身份标识在用户的空间显著显示,并且同时在微博、动态中显示; 3) 增强邀请朋友加入群组功能,可以自己邀请站外用户加入群组; 4) 后台首页增加了管理员待处理事项,对于需要做哪些管理操作一目了然; 5) 重新优化全文检索,使搜索结果更加准确; 6) 修复了70多个bug。   注意:Spacebuilder v3.2采用asp.net mvc 2.0开发,服务器安装 .net framework 3.5 (建议安装.net framework3.5 SP1)或 .NET Framework4.0。 如果使用SDK版本还需要安装 asp.net mvc 2.0。开发工具可以使用vs2010或vs2008(vs2008必须安装 sp1补丁)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值