网站架构之缓存应用(2)实现篇

news/2024/5/9 17:33:09/文章来源:https://blog.csdn.net/weixin_30586085/article/details/95278080

    上一篇我主要总结了网站缓存中的一些基本概念,以及我对于网站架构缓存应用的架构实现思路,这篇主要分享下如何利用微软企业库来实现一二级缓存的缓存服务。
   
    为了能够有效的管理缓存,需要对使用缓存方法上做一些规范,即要想使用缓存组件提供的服务,需要在指定的配置文件中按照一定的规则来配置缓存条目,不允许在配置之处使用缓存。下面先展示下一条Cache条目的配置:

ExpandedBlockStart.gif代码
<Region name="MyBlog">
    
<SubRegion name="default">   
      
<Cache CacheMode="LocalCacheOnlyMode" Key="BlogListConfigKey" BufferType="AbsoluteTime" BufferTimeSeconds="300" CacheType="AbsoluteTime" CacheTimeMinutes="30" CachePriority="Normal"/>     
    
</SubRegion>
  
</Region>

 

   
     上面的代码中,其实由三部分构成:
     1:主分区:Regin,如果一个网站分很多子系统,可以为每个子系统定义一个这样的主分区,例如食品频道Food,手机频道Mobile等;
     2:子分区:SubRegion,主分区下面的子分区,即对子系统更加小的划分,可以根据子系统的功能来划分,例如产品列表页List,详细页Detail等;
     3:缓存条目:Cache,指具体的一则缓存条目规则,这里的缓存条目规则并不是指某一条缓存设置,而是指一条缓存规则,与具体的缓存条目是一对多的关系。
        <1>:CacheMode,设置缓存模式,是只有二级缓存还是即有一级缓存也有二级缓存,例如用户页面之间的信息沟通就只需要二级缓存,即缓存在web server上。而产品列表页的数据属于全局数据,就需要即采用二级缓存也需要一级缓存。
        <2>:BufferType,指二级缓存的过期方式,分为绝对过期,滑动过期,文件依赖。
        <3>:BufferTimeSeconds,二级缓存Timespan中的秒。
        <4>:CacheType,一级缓存的过期方式,类型同BufferType.
        <5>:CacheTimeMinutes,一级缓存Timespan中的分钟。
        <6>:CachePriority,缓存的优先级。


     二级缓存实现:
     第一:IWebCacheProvider,缓存提供者接口,它公布了所有缓存组件需要的方法,接口之所以加上了ServeiceContract标签,是由于下面的一级缓存WCF服务也继承此接口的原因。小提示:WCF服务契约对于方法重载的实现和普通方式有小小区别,请注意OperationContract标签的定义。
     

ExpandedBlockStart.gif代码
 [ServiceContract]
    
public  interface IWebCacheProvider
    {
        [OperationContract(Name 
= "Add")]
        
void Insert(string key, object value, string region, string subRegion);

        [OperationContract(Name 
= "AddByAbsoluteTime")]
        
void Insert(string key, object value, string region, string subRegion, MyCacheItemPriority scavengingPriority, AbsoluteTimeCacheDependency absoluteTimeCacheDependency);

        [OperationContract(Name 
= "AddBySlidingTime")]
        
void Insert(string key, object value, string region, string subRegion, MyCacheItemPriority scavengingPriority, SlidingTimeCacheDependency slidingTimeCacheDependency);

        [OperationContract(Name 
= "AddByFile")]
        
void Insert(string key, object value, string region, string subRegion, MyCacheItemPriority scavengingPriority, FileCacheDependency fileCacheDependency);

        [OperationContract]
        
void Delete(string key, string region, string subRegion);

        [OperationContract]
        
object Get(string key, string region, string subRegion);

        [OperationContract]
        
void Clear(string region);

        [OperationContract]
        
int Count(string region);
    }

 

    
    第二:EntLibWebCacheProvider,微软企业库实现缓存实现类。代码并不贴了,基本就是利用企业库的缓存组件实现上面的接口。
   
     第三:MyWebCacheServiceClient,提供缓存客户端的实例。包含了两个重要的属性:一级缓存实例,二级缓存实例。余下的就是调用EntLibWebCacheProvider来完成缓存的调用,以及根据缓存规则,选择操作一级缓存以及二级缓存。

           说明:下面代码中的GetMemcachedWebCacheProvider是下篇文章会提到的利用memcached实现一级缓存,由于需要支持一级缓存在企业库以及memcached之间的切换才出现的逻辑。
      

ExpandedBlockStart.gif代码
      //一级缓存
        IWebCacheProvider PrimaryCacheProvider;
        
//二级缓存
        IWebCacheProvider SecondaryCacheProvider;
         
/// <summary>
        
/// 实例化二级缓存
        
/// </summary>
        
/// <param name="configFilePath"></param>
        
/// <returns></returns>
        private IWebCacheProvider GetSecondaryCacheProvider()
        {
            IWebCacheProvider provider 
= null;
            provider 
= WebCacheProviderFactory.GetEntLibWebCacheProvider(configFilePath);
            
return provider;
        }
        
/// <summary>
        
/// 获取一级缓存
        
/// </summary>
        
/// <param name="hashKey"></param>
        
/// <param name="configFilePath"></param>
        
/// <returns></returns>
        private IWebCacheProvider GetPrimaryCacheProvider(uint hashKey)
        {
            IWebCacheProvider provider 
= null;
            
string cacheType = WebConfig.ChannelConfig["CacheType"].ToString().ToLower();
            
switch (cacheType)
            {
                
case "memcached":
                    provider 
= WebCacheProviderFactory.GetMemcachedWebCacheProvider(configFilePath);
                    
break;
                
case "entlib":
                    provider 
= servicePool.GetServiceClient(hashKey) as IWebCacheProvider;
                    
break;
            }
           
            
return provider;
        }

 

        
       一级缓存的实现:由于一级缓存也采用微软企业库实现,而企业库本身是不具备分布式功能的,就算是memcached,本身也不具备分布式,而在于客户端的实现,所以企业库我们也可以实现分布式。
        首先:我们把实现了缓存的组件以WCF服务形式分布出来,在多个服务器上部署,形成一个服务器群;
        其实:实现分布式的客户端,让服务的请求均匀的分布到之前部署的WCF缓存服务器上。这里采用一致性hash算法实现,主要是根据key的hash值以及服务器数量来选择存储的服务器,这里贴些主要的实现代码,供参考:
        
        1:定义一个hash的服务器实例集合,为每个服务器分配250个hash值,这里的值可以根据实际情况调整。

private Dictionary<uint, isRoc.Common.Cache.CacheProvider.IWebCacheProvider> hostDictionary;

 

        2:定义一个hash的服务实例key集合,用来统计所有服务器实例中的hash key。  

private uint[] hostKeysArray;

 

        3:创建服务器列表的hash值。 

ExpandedBlockStart.gif代码
/// <summary>
        
/// 重新设置服务器列表
        
/// </summary>
        
/// <param name="hosts">服务器列表</param>
        internal void Setup(List<WebCacheServerInfo> hosts)
        {
            hostDictionary 
= new Dictionary<uint, isRoc.Common.Cache.CacheProvider.IWebCacheProvider>();
            List
<isRoc.Common.Cache.CacheProvider.IWebCacheProvider> clientList = new List<isRoc.Common.Cache.CacheProvider.IWebCacheProvider>();
            List
<uint> hostKeysList = new List<uint>();
            
foreach (WebCacheServerInfo host in hosts)
            {
                
//创建客户端

                isRoc.Common.Cache.CacheProvider.IWebCacheProvider client 
= ServiceProxyFactory.Create<isRoc.Common.Cache.CacheProvider.IWebCacheProvider>(host .HostUri );
                
//Create 250 keys for this pool, store each key in the hostDictionary, as well as in the list of keys.
                for (int i = 0; i < 250; i++)
                {
                    
uint key = 0;
                    
switch (this.HashAlgorithm)
                    {
                        
case EHashAlgorithm.KetamaHash:
                            key 
= (uint)Math.Abs(KetamaHash.Generate(host.HostUri + "-" + i));
                            
break;
                        
case EHashAlgorithm.FnvHash32:
                            key 
= BitConverter.ToUInt32(new ModifiedFNV1_32().ComputeHash(Encoding.UTF8.GetBytes(host.HostUri + "-" + i)), 0);
                            
break;
                    }

                    
if (!hostDictionary.ContainsKey(key))
                    {
                        hostDictionary.Add(key, client);
                        hostKeysList.Add(key);
                    }
                }

                clientList.Add(client);
            }

            
//Hostlist should contain the list of all pools that has been created.
            clientArray = clientList.ToArray();

            
//Hostkeys should contain the list of all key for all pools that have been created.
            
//This array forms the server key continuum that we use to lookup which server a
            
//given item key hash should be assigned to.
            hostKeysList.Sort();
            hostKeysArray 
= hostKeysList.ToArray();

        }

 

        4:如何根据key值来查找具体的缓存服务实例呢,即具体的key存储在哪一台服务器上呢?根据传入的key值,计算出对应的hash值,然后经过特定的算法计算出服务器实例地址。
       

ExpandedBlockStart.gif代码
 internal isRoc.Common.Cache.CacheProvider.IWebCacheProvider GetServiceClient(uint hash)
        {
            
//Quick return if we only have one host.
            if (clientArray.Length == 1)
            {
                
return clientArray[0];
            }

            
//New "ketama" host selection.
            int i = Array.BinarySearch(hostKeysArray, hash);

            
//If not exact match...
            if (i < 0)
            {
                
//Get the index of the first item bigger than the one searched for.
                i = ~i;

                
//If i is bigger than the last index, it was bigger than the last item = use the first item.
                if (i >= hostKeysArray.Length)
                {
                    i 
= 0;
                }
            }
            
return hostDictionary[hostKeysArray[i]];
        }

 

        
        总结:本文简单的介绍了如何利用微软企业库来实现具有两级缓存的缓存组件,上篇我提到过,实现一级缓存也可以采用memcached,采用memcached可以不用自己开发分布式客户端,目前有两个成熟的解决方案:1:Memcached.ClientLibrary2:EnyimMemcached。下篇我来介绍一级缓存如何通过memcached实现,以及如何让组件在一级缓存上即支持企业库也支持memcached。

转载于:https://www.cnblogs.com/ASPNET2008/archive/2011/01/15/1936501.html

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

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

相关文章

seo技术_基础知识_网站pr值的意义_如何提升网站权重和PR值?

点击关注 不迷路如何提升网站权重和PR值网站权重是什么?类似于一个人的人品或威望一样&#xff0c;网站在搜索引擎那边也有一个威望的衡量指标&#xff0c;叫做网站权重。可以简单说&#xff0c;网站权重就是指网站的重要性。如何查看网站权重?01网站权重是什么?类似于一个人…

十个帮助你提高字体使用和排版技巧的网站

我一直觉得掌握字体的使用和排版技巧是很难的。之前和大家分享了很多的字体资源&#xff0c;有英文手写字体、复古字体、广告字体、LOGO字体等等很多的字体资源&#xff0c;在这么多的字体中&#xff0c;如何把合适的字体用在合适的地方是很有学问的。下面收集了十个字体使用技…

mapreduce编程初级实践_2020年学习编程最好的10个网站

程序员书库(ID&#xff1a;CodingBook) 猿妹编译链接&#xff1a;https://levelup.gitconnected.com/its-time-to-start-learning-coding-top-20-best-websites-to-learn-programming-in-2020-9c5105c76c96编程领域的人才增长率是21%(比其他领域都要高)&#xff0c;很明显&…

centos服务端ftp的搭建_如何使用8元搭建一个网站

如何使用8元搭建一个网站&#xff08;我也是第一次&#xff09;首先你需要如下&#xff1a; 一台服务器&#xff08;建议使用香港地区的服务器&#xff0c;不需要备案&#xff09;&#xff0c;一个域名&#xff08;要不要都可以&#xff09;还有一双手&#xff08;我相信大家都…

浅谈移动互联网时代中小企业该如何革命?---手机网站

中国移动通信集团公司董事长奚国华表示“创新是技术发展的原动力。我们在技术上能够提供宽带业务&#xff0c;关键是互联网企业加强开发出老百姓喜闻乐见的各种各样的应用。”CBSi(中国)高级副总裁刘小东同样表示&#xff0c;“将旧有的互联网服务简单的照搬到移动互联网上并不…

【转】IIS网站访问需要输入用户名和密码

xp系统下安装IIS5&#xff0c;并设置好网站路径&#xff0c;但是访问网站时需要输入用户名和密码&#xff0c;这个问题极大可能是因为你网站放置在一个文件系统为NTFS的盘符上&#xff0c;而IIS默认的访问用户时IUSR开头的来宾账户&#xff0c;而此IUSR开头的账户对放置网站的那…

Ubuntu 网站服务器环境搭建

如果想用Ubuntu作为网站的服务器&#xff0c;一些基本的服务是必备的。本文对环境的搭建做一个简单的整理。 Appach Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上&#xff0c;由于其跨平台和安全性被广泛使用&#xff0c;是最流行的…

Docker学习のDocker中部署静态页网站

前言&#xff1a;部署一个静态页网站&#xff0c;我们需要 常见映射80端口的交互式容器安装Nginx&#xff08;或其他服务器&#xff09;安装文本编辑器vim创建静态页面修改Ngnix的配置文件运行Ngnix验证网站的防高温一、设置容器的端口映射 访问网站需要开放端口&#xff0c;因…

使用Bootstrap 3开发响应式网站实践02,轮播

本篇体验图片轮播。html部分为&#xff1a;<div class"carousel slide" id"myCarousel" ><!--Indicators--><ol class"carousel-indicators"><li class"active" data-slide-to"0" data-target"#…

百度商桥放在php网站哪里_什么是营销型网站,你是真的知道吗

营销型网站和展示型网站差别不大&#xff0c;偶买噶&#xff0c;那你就错了&#xff0c;大错特错了&#xff0c;你老板也该哭了&#xff0c;花钱买了假货营销型网站会比展示型网站往往贵出1倍甚至10倍&#xff0c;其实&#xff0c;我个人觉得现在的销售为了签单&#xff0c;总是…

复制网站部分内容_个人网站项目之范文网站运营可行性和盈利模式

我们在上学的时候有没有寻找个人简历模板和自荐信参考范文&#xff1f;我们在工作的时候有没有寻找年终总结和工作计划范文&#xff1f;我们参与演讲的时候有没有找到演讲稿&#xff1f;时时刻刻我们在工作和学习中都会寻找和参考范文&#xff0c;所以我们遇到范文需求参考的时…

url获取网站信息不包含网页源文件内的标签_今天教大家一招最简单的爬虫!利用urllib进行简单的网页抓取!...

(1)protocol&#xff1a;第一部分就是协议&#xff0c;例如百度使用的就是https协议&#xff1b;(2)hostname[:port]&#xff1a;第二部分就是主机名(还有端口号为可选参数)&#xff0c;一般网站默认的端口号为80&#xff0c;例如百度的主机名就是www.baidu.com&#xff0c;这个…

在线音乐网站【04】Part two 功能实现

今天把剩余功能的具体实现补充总结&#xff0c;如果你想对整个小项目有清楚的了解&#xff0c;建议去看下前几篇博客。 1.在线音乐网站&#xff08;1&#xff09;需求和功能结构 2.在线音乐网站&#xff08;2&#xff09;数据库和开发环境 3.在线音乐网站&#xff08;3&#xf…

js外链跳转_贴吧外链,百度贴吧推广对SEO有用吗?

对于SEO而言&#xff0c;我们的兴趣爱好更多的是大于工作&#xff0c;因此&#xff0c;在很长一段时间里&#xff0c;我会花费大量的时间去测试与研究&#xff0c;相关的优化策略是否具有实际的操作价值。特别是在外链增长这一块&#xff0c;虽然&#xff0c;搜索引擎一在试图调…

centos删除mysql服务器上,centos如何删除mysql_网站服务器运行维护,centos

docker如何运行项目_网站服务器运行维护docker运行项目的方法是&#xff1a;1、进入存放自己项目war的目录&#xff1b;2、build镜像&#xff1b;3、运行docker容器&#xff1b;4、执行命令【192.168.1.178:8888/myproject】访问项目即可。彻底卸载mysql&#xff1a;卸载mysql安…

php fpm独立用户,PHP网站简单架构 – 单独跑php-fpm

这个架构比较简单,不做过多的说明前端1台Nginx&#xff1a;负载均衡nfs中间2台php&#xff1a;php-fpm后端1台数据库&#xff1a;MySQL安装略&#xff0c;参考《lnmp最新源码一键安装包》192.168.112安装Tengine192.168.1.113/192.168.1.115安装php192.168.1.114安装MySQLnfs配…

tocat服务器怎么登陆网站,如何登陆Tomcat的控制台(Web管理界面)

当我们成功安装启动Tomcat服务后&#xff0c;在浏览器输入http://localhost:8080(8080是Tomcat的默认端口&#xff0c;可自行修改)回车&#xff0c;可看到如下界面右上角可以看到三个控制台&#xff1a;Server Status、Manager App、Host ManagerServer Status&#xff1a;用于…

全球银行网站成黑客主攻目标 阿里云提供安全防御应急方案

近日&#xff0c;阿里云监控发现&#xff0c;匿名者&#xff08;Anonymous&#xff09;组织成员正在发起针对全球中央银行网站的攻击行动&#xff0c;截止目前&#xff0c;国内有超过2家以上的重要网站被攻击&#xff0c;攻击特征主要为DDoS攻击和CC攻击。 此次事件中&#xff…

云服务器的维护方法,网站服务器的维护方法

网站服务器的维护方法 内容精选换一换云解析服务提供不同网络场景中的解析服务。云解析服务在不同的使用场景下&#xff0c;可以选择多种类型的解析方式&#xff0c;请参见表1。如果用户已注册华为云&#xff0c;可直接登录管理控制台&#xff0c;访问云解析服务。如果用户没有…

移动端Viewport 使用rem来开发移动端网站

移动端Viewport & 使用rem来开发移动端网站 Viewport大神 无双 的精彩解释 具体参数各型号是否支持参见: http://www.cnblogs.com/2050/p/3877280.html#commentform 摘录: 移动设备上的viewport: 设备的屏幕上能用来显示我们的网页的那一块区域 设备像素比: docment.device…