站长百科 | 数字化技能提升教程 数字化时代生存宝典
首页
数字化百科
电子书
建站程序
开发
服务器
办公软件
开发教程
服务器教程
软件使用教程
运营教程
热门电子书
WordPress教程
宝塔面板教程
CSS教程
Shopify教程
导航
程序频道
推广频道
网赚频道
人物频道
网站程序
网页制作
云计算
服务器
CMS
论坛
网店
虚拟主机
cPanel
网址导航
WIKI使用导航
WIKI首页
最新资讯
网站程序
站长人物
页面分类
使用帮助
编辑测试
创建条目
网站地图
站长百科导航
站长百科
主机侦探
IDCtalk云说
跨境电商导航
WordPress啦
站长专题
网站推广
网站程序
网站赚钱
虚拟主机
cPanel
网址导航专题
云计算
微博营销
虚拟主机管理系统
开放平台
WIKI程序与应用
美国十大主机
编辑“
SPB-设计机制-缓存机制
”
人物百科
|
营销百科
|
网赚百科
|
站长工具
|
网站程序
|
域名主机
|
互联网公司
|
分类索引
跳转至:
导航
、
搜索
警告:
您没有登录。如果您做出任意编辑,您的IP地址将会公开可见。如果您
登录
或
创建
一个账户,您的编辑将归属于您的用户名,且将享受其他好处。
反垃圾检查。
不要
加入这个!
<span style="text-align:center; border:1px solid #000; float:right; padding:6px;"><strong>导航:</strong> [[SpaceBuilde二次开发手册|上一页]]</span> <div style="clear:both;"></div> '''缓存用途''' 缓存是SPB中非常重要的一个临时存储,是提升性能的一个非常重要的设计机制。缓存的作用主要有如下几点: #缓存从数据库查询到的数据,减少与[[数据库]]的连接次数; #缓存从配置文件读取的数据,==减少==对文件系统的读写次数; #缓存依靠反射进行实例化的类的实例,减少反射的次数; #缓存View在某个皮肤中对应的[[aspx]]/ascx路径,减少View文件查找的时间; 缓存数据库中的数据是缓存在[[SpaceBuilder]]中最重要的用途。基本上所有数据都是在业务逻辑层首先在缓存中获取,如果找不到则从数据库中获取并缓存在内存中供下一次访问使用。SPB在提升性能的同时也必须考虑缓存与数据库实际数据的同步性,因此需要在增、删、改时手动使相应的缓存失效。 [[Image:Spacebuilder089.jpg]] '''使用规则''': 缓存使用示例代码:(获取SPBCacheManager) <pre> SPBCacheFactory.GetCacheManager(string cacheManagerName); </pre> '''如何使用缓存''' *配置CacheManage 在web.config的<cacheManagers>节点配置cacheManager <pre> <cacheManagers> <add expirationPollFrequencyInSeconds="120" maximumElementsInCacheBeforeScavenging="1000000" numberToRemoveWhenScavenging="10" backingStoreName="Null Storage" type="Microsoft.Practices.EnterpriseLibrary.Caching.CacheManager, Microsoft.Practices.EnterpriseLibrary.Caching" name="Blog" /> </cacheManagers> </pre> *获取SPBCacheManager <pre> SPBCacheManager CacheManager = SPBCacheManagerFactory.GetCacheManager(“Blog”); </pre> *缓存[[API]] [[Image:Spacebuilder090.jpg]] '''过期策略''' *绝对时间 <pre> CacheManager.Add(cacheKey, pds, SPBCacheManager.CachingExpirationType.ObjectCollection); </pre> 预定义的SPBCacheManager.CachingExpirationType包含以下几种类型: [[Image:Spacebuilder091.jpg]] *文件依赖 一般对于配置文件的缓存采用文件依赖,即当配置文件发生变化后,缓存自动失效。例如: <pre> string path = HttpContext.Current.Server.MapPath("~/SpaceBuilder.config"); config = new SPBConfig(path); cacheManager.Add(cacheKey, config, path); </pre> *手动过期 缓存对于性能的提升有诸多贡献,但是也存在一个常见的问题即缓存的数据与实际数据库的数据不同步,存在一定时间的延迟。为了解决这个问题,SpaceBuilder采用了缓存的手动过期策略。例如,以下代码用于获取ForumThread,并把数据放入缓存: <pre> public static ForumThread GetThread(int threadID, bool useCache) { string cacheKey = string.Format("ForumThread:{0}", threadID); ForumThread thread = null; if (useCache) { thread = CacheManager.Get(cacheKey) as ForumThread; } if (thread == null) { thread = ForumDataProvider.Instance().GetThread(threadID); if (useCache) { CacheManager.Add(cacheKey, thread, SPBCacheManager.CachingExpirationType.SingleObject); } } return thread; } </pre> 对于该缓存,只有两种情况需要使其失效:该BlogThread被修改及被删除,因此我们应该在以下代码中手动使其失效: <pre> public static void UpdateThread(ForumThread thread) { #region 设置AuditingStatus if (Auditings.NeedAuditing(thread.UserID, AuditingItemKeys.Instance().ForumThread(), AuditingStrictDegrees.Update)) thread.IsApproved = false; #endregion thread.Subject = WebUtils.HtmlEncode(thread.Subject); ForumEvents.PreBeforeForumThreadChange(thread, ObjectState.Update); ForumEvents.BeforeForumThreadChange(thread, ObjectState.Update); ForumDataProvider.Instance().CreateUpadateThread(thread, DataProviderAction.Update); ForumEvents.AfterForumThreadChange(thread, ObjectState.Update); //清除缓存 ClearCache(thread.SectionID, thread.ThreadID); } public static void DeleteThread(int threadID) { ForumThread thread = ForumThreads.GetThread(threadID); if (thread != null) { #region 删除附件 ForumPostQuery query = new ForumPostQuery(); query.EnablePaging = false; query.PageSize = ValueHelper.GetSafeSqlInt(int.MaxValue); query.IsApproved = null; query.ThreadID = thread.ThreadID; //删除回复附件 PagingDataSet<ForumPost> ps = ForumPosts.GetPosts(query); foreach (ForumPost fp in ps.Records) { ForumAttachmentManager.Instance().DeleteAttachmentsByAssociateID(fp.PostID); } //删除主题附件 ForumAttachmentManager.Instance().DeleteAttachmentsByAssociateID(thread.PostID); #endregion ForumEvents.PreBeforeForumThreadChange(thread, ObjectState.Delete); ForumEvents.BeforeForumThreadChange(thread, ObjectState.Delete); ForumDataProvider.Instance().DeletePost(thread.PostID); ForumEvents.AfterForumThreadChange(thread, ObjectState.Delete); //清除缓存 ClearCache(thread.SectionID, thread.ThreadID); } } /// <summary> /// 清除相关缓存 ///</summary> private static void ClearCache(int sectionID, int threadID) { if (threadID > 0) { CacheManager.Remove(string.Format("ForumThread:{0}", threadID)); CacheManager.RemoveItemsByStartsWith(string.Format("ForumPostSet::ThreadID:{0}", threadID)); } if (sectionID > 0) { CacheManager.RemoveItemsByStartsWith(string.Format("ForumThreads::SectionID:{0}", sectionID)); CacheManager.RemoveItemsByStartsWith(string.Format("ForumThreads::SectionID:{0}", -1)); } else { CacheManager.RemoveItemsByStartsWith("ForumThreads::"); } } </pre> 所以为了实施缓存的手动过期策略,一定要全面分析会影响某一缓存的所有操作,然后在这些操作中清除相应的缓存。 '''注意事项''' #每个应用建立一个自己的缓存区间(CacheManager),在web.config中进行配置; #CacheKey大小写不敏感; #CacheKey一定要保持唯一,需要制定CacheKey的命名规则; ==参考资料== *[http://doc.spacebuilder.cn SpaceBuilder官方] [[category:SpaceBuilder|S]]
摘要:
请注意,您对站长百科的所有贡献都可能被其他贡献者编辑,修改或删除。如果您不希望您的文字被任意修改和再散布,请不要提交。
您同时也要向我们保证您所提交的内容是您自己所作,或得自一个不受版权保护或相似自由的来源(参阅
Wordpress-mediawiki:版权
的细节)。
未经许可,请勿提交受版权保护的作品!
取消
编辑帮助
(在新窗口中打开)