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

news/2024/5/15 18:04:42/文章来源:https://blog.csdn.net/weixin_33912445/article/details/90126801

     在前面的企业库学习之路里我分别使用了Data Access构建多数据库访问和使用Exception Handle+Logging记录系统的异常。今天我来介绍下企业库中的Caching模块在本项目中如何应用。

首先先补习下企业库的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,用以操作缓存,其中我自定义了一个缓存刷新操作类(此类必须为可序列化),用于将已经过期的对象重新加入到缓存当中,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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个构造函数可以指定一个过期时间或指定一个过期时间和一个最后使用时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public SlidingTime(TimeSpan slidingExpiration)
{
   // Check that expiration is a valid numeric value
   if (!(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层调用的时候只需传递要转成的接口即可,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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层调用代码如下:

1
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

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

 

微软企业库5.0 学习之路系列文章索引:

第一步、基本入门

第二步、使用VS2010+Data Access模块建立多数据库项目

第三步、为项目加上异常处理(采用自定义扩展方式记录到数据库中) 

第四步、使用缓存提高网站的性能(EntLib Caching)

第五步、介绍EntLib.Validation模块信息、验证器的实现层级及内置的各种验证器的使用方法——上篇第五步、介绍EntLib.Validation模块信息、验证器的实现层级及内置的各种验证器的使用方法——中篇 

第五步、介绍EntLib.Validation模块信息、验证器的实现层级及内置的各种验证器的使用方法——下篇

第六步、使用Validation模块进行服务器端数据验证

第七步、Cryptographer加密模块简单分析、自定义加密接口及使用—上篇

第七步、Cryptographer加密模块简单分析、自定义加密接口及使用—下篇

第八步、使用Configuration Setting模块等多种方式分类管理企业库配置信息

第九步、使用PolicyInjection模块进行AOP—PART1——基本使用介绍

第九步、使用PolicyInjection模块进行AOP—PART2——自定义Matching Rule

第九步、使用PolicyInjection模块进行AOP—PART3——内置Call Handler介绍

第九步、使用PolicyInjection模块进行AOP—PART4——建立自定义Call Handler实现用户操作日志记录 

第十步、使用Unity解耦你的系统—PART1——为什么要使用Unity?

第十步、使用Unity解耦你的系统—PART2——了解Unity的使用方法(1)

第十步、使用Unity解耦你的系统—PART2——了解Unity的使用方法(2)

第十步、使用Unity解耦你的系统—PART2——了解Unity的使用方法(3)

第十步、使用Unity解耦你的系统—PART3——依赖注入

第十步、使用Unity解耦你的系统—PART4——Unity&PIAB

扩展学习:

扩展学习篇、库中的依赖关系注入(重构 Microsoft Enterprise Library)[转]

 


本文转自kyo-yo博客园博客,原文链接:http://www.cnblogs.com/kyo-yo/archive/2010/06/24/Learning-EntLib-Forth-Use-Caching.html,如需转载请自行联系原作者


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

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

相关文章

SEO终极算法(三),百度排名引流So easy

大家都知道做SEO要分析网站日志&#xff0c;要查看百度蜘蛛抓取网站页面的情况。我不知道大家有没有发现一个规律?百度蜘蛛会不定期的抓取网站所有页面的链接&#xff0c;不管是没有被收录的页面和还是已经被收录的页面&#xff0c;百度蜘蛛都会来抓取&#xff0c;不过有的页面…

Linux系统查看网站访问日志

日志地址 /www/wwwlogs/网站名称-access_log 下载到本地&#xff0c;改成txt文件 打开WPS&#xff0c;创建表格&#xff0c;导入数据&#xff0c;选择文件&#xff0c;然后点击下一步&#xff0c;直到选择文件类型时&#xff0c;选择分隔符号&#xff0c;下一步&#xff0c;把勾…

大型网站架构之百万PV网站架构案例

一、案例概述 本案例采用四层模式实现&#xff0c;主要分为前端反向代理、web层、数据库缓存层和数据库层。 前端反向代理采用主备模式web层采用群集模式数据库缓存层采用主备模式数据库层采用主从模式由于实验条件限制&#xff0c;本次实验共打开四台虚拟机&#xff0c;此处实…

用户登录界面(1.8版本--网站框架改进)

1.创建数据库db_user与表users 1 CREATE DATABASE db_user CHARACTER SET utf8;2 3 CREATE TABLE users (4 userid TINYINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,5 username varchar(20),6 passwd varchar(20),7 email varchar(30),8 priority int9 ); 10…

《Linux就该这么学》培训笔记_ch20使用LNMP架构部署动态网站环境

《Linux就该这么学》培训笔记_ch20使用LNMP架构部署动态网站环境 文章最后会post上书本的笔记照片。 文章主要内容&#xff1a; 源码包程序LNMP动态网站架构 配置Mysql服务配置Nginx服务配置php服务搭建Discuz论坛选购服务器主机书本笔记源码包程序 在RPM和Yum出现之前&#xf…

5-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案微信小程序篇(配置网站--网站配置上数据库)...

https://www.cnblogs.com/yangfengwu/p/11037653.html php和数据库打交道,这样整个网页就完美了,有了数据存储,交互,动态网页才完美 首先修改下php.ini 文件 告诉php当前的扩展库路径 扩展库--就是扩展的其它功能的库 这个就是扩展库文件夹,里面有很多功能性文件 就是增加这…

C#中利用JQuery实现视频网站的缩略图采集

最近有朋友想要采集优酷的视频标题和缩略图 (哈哈, 并非商业目的). 找到我帮忙, 考虑到有我刚刚发布的SpiderStudio, 我毫不犹豫的答应了. 首先在网页上视频的基本结构为: div.v- div.v-meta-title //标题- div.v-thumb / img //缩略图 对应的JQuery表达式为: $("div.v&q…

网站被劫持到其它网站如何解决

2019独角兽企业重金招聘Python工程师标准>>> 前段时间网站被黑了&#xff0c;从百度打开网站直接被劫持跳转到了cai票&#xff0c;du博网站上去&#xff0c;网站的首页index.html文件也被篡改成一些什么北京sai车&#xff0c;pk10&#xff0c;一些cai票的关键词内容…

没有网站,靠什么来吸引近9亿的互联网用户

2018年水果连锁企业百果园&#xff0c;其线上销售额突破20亿元、日订单量达6万单,光小程序用户数累计达到了1300万。 数据显示&#xff0c;以互联网起家的瑞幸咖啡在2018年的互联网市场占有率在30%左右&#xff0c;而作为咖啡巨头的星巴克互联网市场占有率仅10%左右。为什么会出…

Ajax_Apache访问资源文件的权限配置、资源存放路径配置、配置虚拟主机、动态网站静态网站区别...

1、配置资源的访问权限 修改配置文件&#xff1a;httpd.conf 文件 改完之后要重启 2、切换资源默认存放目录www 修改配置文件httpd.conf 文件中的存放目录 3、Apache是否能够同时支持多个站点 Apache能否支持通过不同的域名访问不同的站点 可以 做法&#xff1a;配置虚拟主机…

我的第一个发布到网上的程序,已经超过二十家网站收录了,呵呵,高兴

邮箱专家 1.3┊具备了文件拖放/自动搜索/自动解析等功能┊简体中文绿色免费版 软件大小&#xff1a;106 K热门等级&#xff1a; 更新时间&#xff1a;2008-08-21联 系 人&#xff1a;x_iayu163.com下载次数&#xff1a;450开 发 商&#xff1a; 界面预览&#xff1a;无软件类别…

python怎么测试一个网站的延迟_测量服务器的ping延迟-Python

I have a list of server IP addresses, I need to check if each one is online and how long the latency is. I havent found any straight forward ways of implementing this, and there seems to be a few problems in calculating latency accurately. Any ideas? 解决…

支付回调失败怎么处理_Thinkphp网站支付宝异步回调验签失败问题

php中文网最新课程每日17点准时技术干货分享手头一个项目&#xff0c;用到了支付宝手机网站支付&#xff0c;项目用tp做的&#xff0c;下载支付宝SDK后修改后调起正常&#xff0c;同步接口也可访问&#xff0c;但异步接口验签总是错误失败&#xff0c;fail&#xff0c;追踪到Ao…

最炫表白网站html5源码_(自适应手机版)响应式滚屏智能化物流设备类网站织梦模板 HTML5蓝色人工智能设备网站源码...

模板名称&#xff1a;(自适应手机版)响应式滚屏智能化物流设备类网站织梦模板 HTML5蓝色人工智能设备网站源码下载本套织梦模板采用织梦最新内核开发的模板&#xff0c;这款模板使用范围广&#xff0c;不仅仅局限于一类型的企业&#xff0c;物流设备、智能设备、人工智能类的网…

php冗余数据,WordPress网站提速优化之清理数据库冗余数据

最近小 C 发现数据库中有很多冗余数据&#xff0c;就想清理优化下数据库加快网站的运行速度&#xff0c;下面小 C 就教大家如何清理数据库表。PS&#xff1a;请注意看观看此文请认真&#xff0c;一定要先备份&#xff0c;备份&#xff0c;备份重要的事说三遍。备份后在执行 SQL…

laravel 开发的双语网站_2019年重庆市第十二届中等职业学校技能大赛网页前端开发项目教师培训成功举办...

点上方蓝字&#xff0c;欢迎关注我们&#xff01;2019年11月7日&#xff0c;重庆市第十二届中等职业学校技能大赛Web前端开发项目在重庆市南川隆化职业中学校成功举办&#xff01;本次培训由重庆市教育科学研究院主办&#xff0c;重庆市南川隆化职业中学校承办&#xff0c;成都…

说说大型高并发高负载网站的系统架构(更新)【转】

我在CERNET做过拨号接入平台的搭建&#xff0c;而后在Yahoo&3721从事过搜索引擎前端开发&#xff0c;又在MOP处理过大型社区猫扑大杂烩的架构升级等工作&#xff0c;同时自己接触和开发过不少大中型网站的模块&#xff0c;因此在大型网站应对高负载和并发的解决方案上有一些…

ISA2006发布内网非80端口网站

一&#xff1a;环境介绍1&#xff1a;内部网络有几个网站需要发布A&#xff1a;[url]http://10.0.0.171[/url]B&#xff1a;[url]http://10.0.0.172[/url]C&#xff1a;[url]http://10.0.0.173:8081[/url]2&#xff1a;内部网络通过ISA2006与外网相连&#xff0c;ISA外网地址是…

门户网站建设方案ppt_停车场整体建设方案(ppt)

交通大脑一体化平台解决方案(ppt)数据大脑运营中心规划方案(ppt)停车大数据平台总体规划方案(ppt)停车场整体规划方案(ppt)5G智慧公交大脑平台方案(ppt)5G中杆路内视频停车解决方案(ppt)AI城市数据大脑平台建设方案(图文)城市数据大脑平台技术规划方案(ppt)城市数据大脑平台演进…

云服务器ecs上能放几个网站,云服务器ecs能放几个站点

云服务器ecs能放几个站点 内容精选换一换对于已安装Cloud-Init/Cloudbase-Init的云服务器&#xff0c;首次执行切换/故障切换操作&#xff0c;或者创建容灾演练后&#xff0c;系统第一次启动时会运行Cloud-Init/Cloudbase-Init&#xff0c;为云服务器重新注入初始化数据&#x…