微软企业库5.0 学习之路——第四步、使用缓存提高网站的性能(EntLib Caching)

news/2024/5/12 19:14:55/文章来源:https://blog.csdn.net/weixin_33795093/article/details/93934797

首先先补习下企业库的Caching Application Block的相关知识:

1、四大缓存方式,在Caching Application Block中,主要提供以下四种保存缓存数据的途径,分别是:内存存储(默认)、独立存储(Isolated Storage)、数据库存储(DataBase Cache Storage)和自定义存储(Custom Cache Storage)。

2、多种存储方式,抛开自定义存储不谈,内存存储是最基本的缓存,仅仅是将数据缓存到内存当中,虽然速度快但是无法进行持久化存储,而独立存储和数据库存储一个是存储到本地的磁盘中(视操作系统不同存储到不同的位置)而另一个则是存储到数据库中(方便进行分布式缓存),所以可以进行持久化保存不会因为关机而丢失(可以到。在EntLib50Src\Blocks\Caching\Src\Database\Scripts下找到脚本进行安装)

3、优秀的易用性,虽然在.NET类库System.Web中已经提供了Cache类,但是有局限性,仅可适用于控制台、Winform、Web、服务等。

4、安全性,企业库中的缓存模块可以和加密模块很好的结合起来,当适用数据库缓存、独立存储或者自定义存储的时候可以适用加密模块对缓存的数据进行加密,但存储到内存当中的数据就无法进行加密了。

 

在了解了缓存的基本知识后我们就可以开始进行具体的操作了。

我现在就是使用Cache模块为项目中反射具体数据库DAL层对象实例进行缓存,这样不用每次在调用底层的时候都反射一次,只需在第1次反射后缓存,以后的访问直接从缓存中读取,提高了访问的速度。

通过企业库配置工具添加个Caching Settings

pic17

这里使用默认设置,保存到内存中,过期轮询时间,最大存储数量和移除数量都使用了默认的设置。

如果不想使用默认的内存存储可以建立独立存储或者数据库存储。

这里有个要提的就是企业库的缓存模块的数据库存储是使用存储过程来进行缓存与数据库 之间的交互,但是本项目中使用了多数据库,如Sqlite,就无法支持存储过程,所以这边需要自定义存储方式,可以直接查看企业库代码中 Cache.DataBase.DataBackingStore.cs类,仿照DataBackingStore类自定义一个存储方式,只不过在进行数 据库交互的时候使用SQL语句进行。

继续回到主题上,我这边写了一个简单的CacheHelper,用以操作缓存,其中我自定义了一个缓存刷新操作类(此类必须为可序列化),用于将已经过期的对象重新加入到缓存当中,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;using Microsoft.Practices.EnterpriseLibrary.Caching;
using Microsoft.Practices.EnterpriseLibrary.Caching.Expirations;
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;namespace EntLibStudy.Helper
{public static class CacheHelper{//2种建立CacheManager的方式//ICacheManager cache = EnterpriseLibraryContainer.Current.GetInstance<ICacheManager>();private static ICacheManager cache = CacheFactory.GetCacheManager();/// <summary>/// 添加缓存/// </summary>/// <param name="key"></param>/// <param name="value"></param>/// <param name="isRefresh">是否刷新</param>public static void Add(string key, object value, bool isRefresh = false){if (isRefresh){//自定义刷新方式,如果过期将自动重新加载,过期时间为5分钟cache.Add(key, value, CacheItemPriority.Normal, new MyCacheItemRefreshAction(), new AbsoluteTime(TimeSpan.FromMinutes(5)));}else{cache.Add(key, value);}}/// <summary>/// 获取缓存对象/// </summary>/// <param name="key"></param>/// <returns></returns>public static object GetCache(string key){return cache.GetData(key);}/// <summary>/// 移除缓存对象/// </summary>/// <param name="key"></param>public static void RemoveCache(string key){cache.Remove(key);}}/// <summary>/// 自定义缓存刷新操作/// </summary>
    [Serializable]public class MyCacheItemRefreshAction : ICacheItemRefreshAction{#region ICacheItemRefreshAction 成员/// <summary>/// 自定义刷新操作/// </summary>/// <param name="removedKey">移除的键</param>/// <param name="expiredValue">过期的值</param>/// <param name="removalReason">移除理由</param>void ICacheItemRefreshAction.Refresh(string removedKey, object expiredValue, CacheItemRemovedReason removalReason){if (removalReason == CacheItemRemovedReason.Expired){ICacheManager cache = CacheFactory.GetCacheManager();cache.Add(removedKey, expiredValue);}}#endregion}
}

1、缓存等级,在企业库的缓存模块中已经提供了4个缓存等级:LowNormalHighNotRemovable,在超出最大缓存数量后会自动根据缓存等级来移除对象。

2、ICacheItemRefreshAction,这个接口用来方便开发人员扩展使用的,开发人员可以根据移除原因在对象过期后进行相应的操作,其中CacheItemRemovedReason分

Expired:过期被移除

Removed:被手动移除

Scavenged:因为缓存数量已满,则根据缓存等级移除较低级的缓存

Unknown:未知移除,不建议使用

3、过期方式,企业库默认提供4种过期方式

AbsoluteTime:绝对是时间过期,传递一个时间对象指定到时过期

SlidingTime:缓存在最后一次访问之后多少时间后过期,默认为2分钟,有2个构造函数可以指定一个过期时间或指定一个过期时间和一个最后使用时间

public SlidingTime(TimeSpan slidingExpiration)
{// Check that expiration is a valid numeric valueif (!(slidingExpiration.TotalSeconds >= 1)){throw new ArgumentOutOfRangeException("slidingExpiration",Resources.ExceptionRangeSlidingExpiration);}this.itemSlidingExpiration = slidingExpiration;}
public SlidingTime(TimeSpan slidingExpiration, DateTime originalTimeStamp) : this(slidingExpiration)
{timeLastUsed = originalTimeStamp;}

ExtendedFormatTime :指定过期格式,以特定的格式来过期,通过ExtendedFormat.cs类来包装过期方式,具体可参照ExtendedFormat.cs,源代码中已经给出了很多方式

FileDependency:依赖于文件过期,当所依赖的文件被修改则过期,这个我觉得很有用,因为在许多网站,如论坛、新闻系统等都需要大量的配置,可以将配置文件信息进行缓存,将依赖项设为配置文件,这样当用户更改了配置文件后通过ICacheItemRefreshAction.Refresh可以自动重新缓存。

在介绍了Cache的相关参数后我们来看下具体如何使用,我这边将原来的DataAccess类重新修改了一下,因为觉得如果每次多增加一个数据表,对应的工厂就需要多写一个反射方法实在是不方便,所以修改成泛型类(同时附了原来的反射代码,可以对比下那种方式比较好),在BLL层调用的时候只需传递要转成的接口即可,代码如下:

public static class DataAccess<T>{private static readonly string assemblyString = ConfigurationManager.AppSettings["DAL"];/// <summary>/// 通用对象反射(包含缓存)/// </summary>/// <param name="className">要反射的类名</param>/// <returns></returns>public static T CreateObject(string className){var typeName = assemblyString + "." + className;//判断对象是否被缓存,如果已经缓存则直接从缓存中读取,反之则直接反射并缓存var obj = (T)CacheHelper.GetCache(typeName);if (obj == null){obj = (T)Assembly.Load(assemblyString).CreateInstance(typeName, true);CacheHelper.Add(typeName, obj, true);}return obj;}public static IClassInfoService CreateClassInfo(){string typeName = assemblyString + ".ClassInfoService";//判断对象是否被缓存,如果已经缓存则直接从缓存中读取,反之则直接反射并缓存if (CacheHelper.GetCache(typeName) != null){return (IClassInfoService)CacheHelper.GetCache(typeName);}else{IClassInfoService service = (IClassInfoService)Assembly.Load(assemblyString).CreateInstance(typeName, true);CacheHelper.Add(typeName, service, true);return service;}}

BLL层调用代码如下:

private IClassInfoService classInfoService = DataAccess<IClassInfoService>.CreateObject("ClassInfoService");

需要注意的是由于使用企业库的Cache,如果缓存到数据库或者独立存储必须要求缓存对象必须是可序列化的,内存中缓存就不需要,而我这边缓存的对象为DAL层中具体的操作类,所以如果要更改为非内存存储需要将操作类加上[Serializable]特性。

这样以后再添加新的表就无需修改工厂中的DataAccess类了。

以上就是缓存在本项目中的一些基本应用,由于水平有限,所以暂时无法提出缓存的一些高级应用,请大家见谅。

相关Cache模块配置可以查看huangcong写的Cache模块(初级),一些相关知识可以查看virusswb写的缓存的设计目的。

 

注意:

1、MSSQL数据库在DataBase目录下(需要自行附加数据库),SQLite数据库在Web目录的App_Data下,由于考虑到项目的大小,所以每个项目的BIN目录都已经删除,如出现无法生成项目请自行添加相关企业库的DLL。

2、由于微软企业库5.0 学习之路这个系列我是准备以一个小型项目的形式介绍企业库的各模块,所以源代码会根据系列文章的更新而更新,所以源代码不能保证与文章中所贴代码相同。

3、项目开发环境为:VS2010+SQL2005。

4、管理员帐户:admin

              密码:admin

源代码下载地址:点我下载

 

转载于:https://www.cnblogs.com/wuxl360/p/5753436.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_835293.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

零碎笔记:浏览器访问一个网站所经历的步骤

浏览器访问一个网站所经历的步骤 Chrome搜索自身的DNS缓存搜索操作系统自身的DNS缓存&#xff08;浏览器没有找到缓存或缓存已经失效&#xff09;查看Chrome浏览器的DNS缓存信息(chrome://net-internals/#dns)&#xff1a;读取本地HOST文件 浏览器发起一个DNS的一个系统调用 宽…

SEO独家干货:利用外链投票模型操作新站快速排名

今年我在卢松松博客投稿了不少的干货文章&#xff0c;其中有一篇叫做“SEO外链算法独家揭秘”&#xff0c;里面提到了很多朋友或许都没有思考到的点&#xff0c;我一直相信&#xff0c;在搜索引擎优化当中&#xff0c;当任何一个点优化到极致&#xff0c;你的排名将顺从着你的极…

如何利用网站博客打造个人品牌

如果你正在计划在网上创业&#xff0c;最好的方法就是建立自己的网络明星地位&#xff0c;获得更多关注和取得潜在客户的信任&#xff0c;那就是打造自己的个人品牌。下面懒人创富为你准备了一个用博客打造个人品牌的方法步骤&#xff0c;建议你收藏下来&#xff1a; 1.确定你的…

《大型网站服务器容量规划》一2.2 服务器容量规划的源由

本节书摘来异步社区《大型网站服务器容量规划》一书中的第2章&#xff0c;第2.2节&#xff0c;作者&#xff1a; 郑钢 责编&#xff1a; 张涛&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看。 2.2 服务器容量规划的源由 为什么要做容量规划呢&#xff1f;当…

Mozilla 推出免费的网站安全测试服务

Mozilla 安全工程师 April Knight 发布了一个名叫 Observatory 的项目&#xff0c;旨在为大家提供一款类似于 SSL Labs、High-Tech Bridge 等扫描服务的免费版网站安全扫描工具。这项服务基于 GitHub 上的一个 Python 代码库&#xff0c;开发历时好几个月&#xff0c;并终于在昨…

PS网页设计教程II——在Photoshop中创建健康及营养或健身的网站

作为编码者&#xff0c;美工基础是偏弱的。我们可以参考一些成熟的网页PS教程&#xff0c;提高自身的设计能力。套用一句话&#xff0c;“熟读唐诗三百首&#xff0c;不会作诗也会吟”。 本系列的教程来源于网上的PS教程&#xff0c;都是国外的&#xff0c;全英文的。本人尝试翻…

思维导图形式带你读完《大型网站技术架构》中

下面所有图片原图及思维导图源文件和软件&#xff0c;欢迎关注我的微信公众号:"Java面试通关手册" 后台回复 “大型网站技术架构” 免费领取。 5 万无一失&#xff1a;网站的高可用架构 6 永无止境&#xff1a;网站的伸缩性架构 7 随机应变&#xff1a;网站的可扩展架…

web网站如何实现兼容手机

web网站如何实现兼容手机 一、总结 一句话总结&#xff1a;加上这句话即可&#xff1a;<meta name"viewport" content"widthdevice-width,initial-scale1.0">。 1、移动设备上的三个viewport是哪三个&#xff0c;分别代表什么&#xff1f; ppk把移动…

阿里云助力中小企业建站 在线免费自助建站成新用户首选...

阿里云助力中小企业建站 在线免费自助建站成新用户首选 提供云计算服务的行业头部企业-阿里云&#xff0c;对于广大中小企业来说&#xff0c;应该都不陌生。在企业需要建设自己官方网站&#xff0c;或者个人需要建设个人网站时&#xff0c;一般都需要购买网站空间或者云服务器来…

网站导航php,【网址导航系统】基于PHP+MYSQL开发的开源网站分类目录管理系统

DYCMS的主要特性包括&#xff1a;纯净的导航界面(去繁求简)响应式设计的前端设计聚合式搜索框(一键切换百度&#xff0c; 搜狗&#xff0c;360&#xff0c;必应搜索平台)用户可自行申请收B J – C b录&#xff0c;由管理员后台审核文章管理A F 2 P W发布功能每篇文章均有评论功…

(转) Web 建站技术中,HTML、HTML5、XHTML、CSS、SQL、JavaScript、PHP、ASP.NET、Web Services 是什么?...

Web 建站技术中&#xff0c;HTML、HTML5、XHTML、CSS、SQL、JavaScript、PHP、ASP.NET、Web Services 是什么&#xff1f; 建站有很多技术&#xff0c;如 HTML、HTML5、XHTML、CSS、SQL、JavaScript、PHP、http://ASP.NET、Web Services、浏览器脚本、服务器脚本等。它们的区别…

http://qq.im谁能查一下这是什么网站

这网站不是腾讯的&#xff0c;浏览此网站请小心&#xff0c;不要弄丢你的QQ号等。 我5月份QQ.im被谁抢注了的时候&#xff0c;网站页面也忘了啥来着&#xff0c;非常简陋&#xff0c;好像就是联系卖此域名的。 今天又上去看了一下&#xff0c;变成了“QQ.im增值服务中心”&am…

APACHE开启GZIP提升网站JS加载速度

2016/4/18 //by xbw// win服务器下xampp搭建的服务器端&#xff0c; 我们先找到apache文件夹->找到conf文件夹->找到httpd.conf文件打开&#xff0c; 找到 LoadModule deflate_module modules/mod_deflate.soLoadModule filter_module modules/mod_filter.so LoadModule…

Google提示:西安电子科技大学计算机学院网站可能含有恶意软件

真不知道计算机学院那帮是怎么搞的&#xff0c;还不麻利点快修复阿&#xff0c;多影响声誉。

购物网站Laravel版

Web_Shop 需要代码的同学请留言 Intro Using xampp(phpmysqlapache)Using Laravel frameworkUsing BootStrap framework ScreenShot Usage step 1. git clone https://github.com/xbw12138/Web_Shop.gitstep 2. use composer php composer.phar installor composer ins…

spreadfirefox网站闪现不和谐图片被逮个正着

spreadfirefox.com出现支持的图片。该图片&#xff08;地址http://www.flickr.com/photos/22641130N05/2465538480&#xff09;保存于flickr网站&#xff0c;且该图片主人还有诸多不和谐图片。 不清楚spreadfirefox是怎么显示这些图片的&#xff0c;是自动从flickr上所有的标注…

网站排名第一的暗黑手法:标签网站中的黑帽SEO

和 Digg相似的共享书签网站 Reddit&#xff0c;用户可对所刊登内容以“支持&#xff08;up&#xff0c;上&#xff09;”或“否决&#xff08;down&#xff0c;下&#xff09;”的投票方式&#xff0c;让最热门的连结会出现在首页面的前端或是其他显著的位置。 在伦敦,一位Bla…

网站开发

创建一个企业形象网站&#xff0c;要做好商业网站开发的前期准备、中期制作和后期的测试发布工作。前期准备包括了解网站的业务背景、明确网站的设计风格、确定网站内容等&#xff1b;中期制作主要包括创建站点、制作首页、制作模板和制作样式&#xff1b;后期的测试发布工作包…

手机网站优化技巧

1、域名尽量简短&#xff0c;越短的域名&#xff0c;用户记忆越容易记忆&#xff1b; 2、robots限制放开&#xff0c;百度spider的爬虫UA是Baiduspider&#xff08;www和wap一致&#xff09;&#xff0c;个别站长经常会误认为百度手机爬虫的UA是baiduspider-mobile&#xff1b…

网站建设优势有哪些?

1.响应式网站 站点访问终端是跨多个平台实现的&#xff0c;多样性&#xff0c;从台式机、笔记本电脑、平板电脑、手机&#xff0c;可以适应不同大小的显示网页&#xff0c;现在页面的趋势是未来的设计趋势很长一段时间。因此&#xff0c;响应的网站是解决问题。这种网络开发方…