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

news/2024/5/21 1:02:36/文章来源:https://blog.csdn.net/weixin_33924312/article/details/85473965

      这篇来讲如何利用memcached实现一级缓存,以及如何让一级缓存组件支持在企业库,memcached或者其它第三方实施方案之间的切换。memcached本人并没有太多经验,如果文中有说的不对的地方,还希望批评指出,且文中关于memcached的代码大多来自网络。
  
     创建memcached实现类MemcachedWebCacheProvider,由它来继承缓存提供者接口IWebCacheProvider,主里memcached客户端我采用.NET memcached client library ,这个类库很久没有更新这过了,没有和java版同步,有部分功能目前没有实现。
     1:初始化memcached服务,这段初始化代码在程序中保证执行一次就够,一般可以放在gloabl文件中,或者是设置一个静态变量来存储服务的状态。
  

ExpandedBlockStart.gif代码
 private void Setup()
        {
            String[] serverlist 
= { "127.0.0.1:11211" };
            
this._pool = SockIOPool.GetInstance("default");
            
this._pool.SetServers(serverlist); //设置服务器列
            
//各服务器之间负载均衡的设置
            this._pool.SetWeights(new int[] { 1 });
            
//socket pool设置
            this._pool.InitConnections = 5//初始化时创建的连接数
            this._pool.MinConnections = 5//最小连接数
            this._pool.MaxConnections = 250//最大连接数
            
//连接的最大空闲时间,下面设置为6个小时(单位ms),超过这个设置时间,连接会被释放掉
            this._pool.MaxIdle = 1000 * 60 * 60 * 6;
            
//通讯的超时时间,下面设置为3秒(单位ms),.NET版本没有实现
            this._pool.SocketTimeout = 1000 * 3;
            
//socket连接的超时时间,下面设置表示连接不超时,即一直保持连接状态
            this._pool.SocketConnectTimeout = 0;
            
this._pool.Nagle = false//是否对TCP/IP通讯使用Nalgle算法,.NET版本没有实现
            
//维护线程的间隔激活时间,下面设置为60秒(单位s),设置为0表示不启用维护线程
            this._pool.MaintenanceSleep = 60;
            
//socket单次任务的最大时间,超过这个时间socket会被强行中断掉(当前任务失败)
            this._pool.MaxBusy = 1000 * 10;
            
this._pool.Initialize();
        }

 

        2:获取一个memcached客户端。
        

        private MemcachedClient GetClient()
        {
            MemcachedClient client 
= new MemcachedClient();
            client.PoolName 
= "default";
            
return client;
        }

 

        3:根据memcached提供的功能实现IWebCacheProvider,代码就不贴了,大家可以自己去试试。
       
        到此我们就利用memcached实现了一级缓存,由于.NET memcached client library 实现了分布式,我们只需要在多台服务器上安装上memcached服务,在初始化memcached代码中增加了服务器相关配置即可。String[] serverlist = { "127.0.0.1:11211" };
        
        如何让一级缓存组件支持多实现方案之间的切换。
        MyWebCacheServiceClient:客户端缓存组件实例,它来完成一级缓存与二级缓存之间的联系,以及根据配置文件来选择一级缓存的实施方案。
        第一:CacheServiceMode,根据它就可以决定缓存是只缓存二级缓存还是两级都缓存。

                 1:LocalCacheOnlyMode,只启用web server上的二级缓存。

                 2:BufferedLCacheServerMode,即启用web server上的二级缓存也启用cache server上的缓存。

                 3:Off,关闭缓存功能。
        第二:IWebCacheProvider service = this .GetPrimaryCacheProvider(hashKey);方式决定了一级缓存的实施方案。
         

ExpandedBlockStart.gif代码
/// <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;
        }

 

         插入缓存的逻辑:原理就是根据配置文件中的CacheMode来完成缓存级别的判定以及一级缓存的方案。

ExpandedBlockStart.gif代码
public void Insert(string key, object value, string region, string subRegion, CacheItemConfig cacheItemConfig)
        {
            
if (string.IsNullOrEmpty(key) || value == null)
                
return;
            
//关闭模式,不使用缓存
            if (Options.CacheServiceMode == ECacheServiceMode.Off)
            {
                
return;
            }
            
else if (Options.CacheServiceMode == ECacheServiceMode.BufferedLCacheServerMode
                
|| Options.CacheServiceMode == ECacheServiceMode.LocalAndCacheServerAndSql
                
|| Options.CacheServiceMode == ECacheServiceMode.LocalCacheOnlyMode)
            {
//使用带缓冲的模式
                if (Options.BufferType == ECacheDependencyType.SlidingTime)
                {
                    SecondaryCacheProvider.Insert(key, value, region, subRegion, MyCacheItemPriority.Normal, Options.BufferSlidingTime);
                }
                
else if (Options.BufferType == ECacheDependencyType.AbsoluteTime)
                {
                    SecondaryCacheProvider.Insert(key, value, region, subRegion, MyCacheItemPriority.Normal, Options.BufferAbsoluteTime);
                }

                
if (Options.CacheServiceMode == ECacheServiceMode.LocalCacheOnlyMode)
                {
//只使用本地缓存
                    return;
                }
            }

            checkKey(key);
            
uint hashKey = hash(key);

            
try
            {
                
if (Options.CacheServiceMode == ECacheServiceMode.CacheServerMode
                    
|| Options.CacheServiceMode == ECacheServiceMode.BufferedLCacheServerMode
                    
|| Options.CacheServiceMode == ECacheServiceMode.CacheServerAndSql
                    
|| Options.CacheServiceMode == ECacheServiceMode.LocalAndCacheServerAndSql)
                {
//CacheServer模式使用Cache服务器保存Cache                                      
                    IWebCacheProvider service = this .GetPrimaryCacheProvider(hashKey);
                    
byte[] byteValue = SerializationHelper.SaveToBinaryBytes(value);
                    var cachePriority 
= ModelConverter.ToRefClass(cacheItemConfig.CachePriority);
                    
if (cacheItemConfig.CacheType == ECacheDependencyType.AbsoluteTime)
                    {
                        AbsoluteTimeCacheDependency absTime 
= new AbsoluteTimeCacheDependency();
                        absTime.AbsoluteTime 
= DateTime.Now.AddMinutes(cacheItemConfig.CacheTimeMinutes);
                        service.Insert(key, byteValue, region, subRegion, cachePriority, absTime);
                    }
                    
else if (cacheItemConfig.CacheType == ECacheDependencyType.SlidingTime)
                    {
                        SlidingTimeCacheDependency slTime 
= new SlidingTimeCacheDependency();
                        slTime.SlidingTime 
= new TimeSpan(0, cacheItemConfig.CacheTimeMinutes, 0);
                        service.Insert(key, byteValue, region, subRegion, cachePriority, slTime);
                    }
                }
            }
            
catch (Exception ex)
            {
//出现异常,保存到数据库中
                servicePool.ReplaceServiceClient(hashKey);
                
this.SendLogEmail(ex);
            }
           

        }

 

        
        客户端调用代码:为了调用方便,创建一个CacheHelper来帮助完成:

ExpandedBlockStart.gif代码
public class CacheHelper
    {
        
/// <summary>
        
/// 主分区
        
/// </summary>
        public const string REGION = "MyBlog";
        
/// <summary>
        
/// 子分区
        
/// </summary>
        public const string SUB_REGION = "default";
        
public const string BlogListConfigKey = "BlogListConfigKey";
        
#region 页面间数据传递
        
/// <summary>
        
/// 新增页面间传递数据到WebCache
        
/// </summary>
        
/// <returns>返回PageKeyID,用于页面间传递的键值</returns>
        public static string InsertPageParams(string configKey, object obj,string pageKey)
        {
            
string result = null;

            MyWebCacheServiceClient cacheClient 
= CacheClientFactory.GetWebCacheServiceClient(REGION, SUB_REGION, configKey);
            cacheClient.Insert(
                MyWebCacheServiceClient.BuildKey(configKey,pageKey),
                obj,
                REGION,
                SUB_REGION);

            
return result;
        }
        
/// <summary>
        
/// 从Cache里获取页面传递Cache
        
/// </summary>
        
/// <param name="key">FlightCacheKey里的常量</param>
        
/// <param name="pageKeyID">页面传递的键值</param>
        public static object GetPageParams(string configKey, string pageKey)
        {
            
object result = null;
            MyWebCacheServiceClient cacheClient 
= CacheClientFactory.GetWebCacheServiceClient(REGION,
                SUB_REGION, configKey);
            result 
= cacheClient.Get(
                MyWebCacheServiceClient.BuildKey(configKey, pageKey),
                REGION,
                SUB_REGION);

            
return result;

        }
        
#endregion
    }

 

 

        两级缓存类结构图:

        以上代码贴出来看起来有点乱,这里贴出网站两级缓存类结构图:

         

 


作者:姜敏
出处:http://www.cnblogs.com/aspnet2008/ 

 

 

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

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

相关文章

【办公实用网站收集】免费模板

目录1 办公区1.1 PPT模板1.2 简历模板2 IT女孩必备2.1 经典配色2.1.1 在线取色器2.1.2 配色表2.1.3 配色收藏网站2.2 在线格式转换2.2.1 png、jpg、gif转ico图标2.2.2 API免费接口免费API接口2.2.3 在线视频处理3 网站素材3.1 免费整站模板3.2 jQuery插件库3.3 高清图库3.4 LOG…

大型网站技术架构(八)网站的安全架构

2019独角兽企业重金招聘Python工程师标准>>> 从互联网诞生起&#xff0c;安全威胁就一直伴随着网站的发展&#xff0c;各种Web攻击和信息泄露也从未停止。常见的攻击手段有XSS攻击、SQL注入、CSRF、Session劫持等。 1、XSS攻击 XSS攻击即跨站点脚本攻击&#xff08;…

大型网站技术架构(四)网站的高性能架构

2019独角兽企业重金招聘Python工程师标准>>> 网站性能是客观的指标&#xff0c;可以具体体现到响应时间、吞吐量、并发数、性能计数器等技术指标。 1、性能测试指标 1.1 响应时间 指应用执行一个操作需要的时间&#xff0c;指从发出请求到最后收到响应数据所需要的时…

WF4.0实战(十七):实现自动访问网站机器人

概述篇 用WF4.0实现自动访问’机器人’&#xff0c;听起来有点不可思议。还是老方式&#xff0c;看效果&#xff0c;在讲述一下如何实现&#xff0c;最后总结,附代码下载。 这篇文章用这个’机器人’玩转了一回博客园。包括&#xff1a;机器人登录&#xff0c;机器人回帖&#…

Hexo-SEO搜索引擎优化(sitemap)

一、提交站点地图的作用 假如你在百度上搜索信息&#xff1a;hexo&#xff08;sakura&#xff09;博客&#xff1a; 会返回n多条搜索结果&#xff0c;来源于不同的平台推送&#xff0c;但是每条结果都会有不同的匹配度&#xff0c;按搜索引擎排序规则进行排序。 作为站长&am…

hexo美化(豆瓣阅读、电影、常用网站搜索页)

文章目录1.增加豆瓣阅读、电影分享页1.1预览1.2装配2.增加常用网站搜索页2.1预览2.2装配1.增加豆瓣阅读、电影分享页 1.1预览 阅读&#xff1a; 电影&#xff1a; 1.2装配 我现在用的butterfly是支持hexo-douban插件的&#xff0c;所以直接使用就好了。 在豆瓣注册一个账…

八大免费SSL证书-给你的网站免费添加Https安全加密

https://www.freehao123.com/top-8-free-ssl-cert/ https://www.freehao123.com/top-8-free-ssl-cert/ https://www.freehao123.com/top-8-free-ssl-cert/ 八大免费SSL证书-给你的网站免费添加Https安全加密 SSL证书&#xff0c;用于加密HTTP协议&#xff0c;也就是HTTPS。…

如何申请https证书、搭建https网站

如何申请https证书、搭建https网站 https://freessl.wosign.com/https-web.html https://freessl.wosign.com/https-web.html https://freessl.wosign.com/https-web.html 随着国内搜索引擎巨头百度启用全站https加密服务&#xff0c;全国掀起了网站https加密浪潮。越来越多…

SSL证书是否影响网速和网站访问速度

http://globalsign.baijia.baidu.com/article/188567 http://globalsign.baijia.baidu.com/article/188567http://globalsign.baijia.baidu.com/article/188567SSL证书是否影响网速和网站访问速度 GlobalSign数字证书 10月10日 10:50https ssl 网速 分类 :互联网阅读:423 还有…

20 个免费的网站设计模板

为什么80%的码农都做不了架构师&#xff1f;>>> 1. Download Free Photoshop PSD Template 2. Magnate: Professional Website PSD Template 3. Free Website Template PSD 4. Landing Page Free PSD 5. Web layout psd html FREE 6. Free PSD Website Template fo…

20个免费为您的网站和博客提供的音频播放器

文章转载 http://www.iteye.com/topic/797728 之前&#xff0c;我为大家准备了 21个为您的网站和博客提供的免费视频播放器&#xff0c;在本文中我爱互联网将给您提供一些免费的在线音频播放器&#xff0c;在线音频播放器允许任何人在他们的站点和博客上添加&#xff0c;比如常…

20个免费为您的网站和博客提供的音频播放器

文章转载 http://www.iteye.com/topic/797728 之前&#xff0c;我为大家准备了 21个为您的网站和博客提供的免费视频播放器&#xff0c;在本文中我爱互联网将给您提供一些免费的在线音频播放器&#xff0c;在线音频播放器允许任何人在他们的站点和博客上添加&#xff0c;比如常…

美女SEO系列八:何为目标关键词?

大家好&#xff0c;我是实名网络营销团队的美女SEO周珍&#xff0c;昨天我和大家分享的是《美女SEO系列七&#xff1a;什么是长尾关键词》的文章。那么今天我继续来为大家分享的是&#xff0c;关于目标关键词的内容&#xff0c;欢迎大家的踊跃围观&#xff0c;谢谢。 一、何为目…

使用Hexo搭建个人博客网站-01-安装Node.js

一、检查 Node.js 在电脑桌面上或其他任何位置右击 Git Bash Here&#xff0c;输入&#xff1a;node -v。 如果电脑上还没有安装 Node.js&#xff0c;显示将会如下图所示&#xff1a; 提示出错&#xff0c;主要是由于我们还没有安装 Node.js 的原因&#xff0c;则需要按照后面…

使用Hexo搭建个人博客网站-02-安装Hexo

一、检查 Hexo 在电脑桌面上或其他任何位置右击 Git Bash Here&#xff0c;输入&#xff1a;hexo version。 如果电脑上还没有安装 Hexo&#xff0c;显示将会如下图所示&#xff1a; 提示出错&#xff0c;主要是由于我们还没有安装 Hexo 的原因&#xff0c;则需要按照后面的步…

使用Hexo搭建个人博客网站-03-创建并测试本地Hexo仓库

一、选择路径 在电脑上任意选择一个自己觉得合适的位置&#xff0c;用来存放本地 Hexo 仓库。 我这里就选择电脑 D 盘根目录作为存放路径。 二、确定名称 我们还需要取个名称&#xff0c;用来存放本地 Hexo 仓库&#xff0c;按理说这个名称也是可以用户自己任意起的。 这里我…

使用Hexo搭建个人博客网站-04-将本地Hexo仓库部署到GitHub Pages上

一、创建 GitHub 远程仓库 仓库名称必须要遵守格式&#xff1a;账户名.github.io&#xff0c;并且必须勾选 Initialize this repository with a README。如下图所示&#xff1a; 点击 Create repository&#xff0c;创建仓库。 创建完成后&#xff0c;网页会跳到如下图所示界…

使用Hexo搭建个人博客网站-06-解析并绑定域名

假设大家已经拥有了可以用来绑定我们个人网站的域名。 一、测试域名 我之前在阿里云上买了一个域名&#xff1a;oceanwang.top&#xff0c;后面我会用来解析和绑定。这边先尝试用浏览器去访问一下&#xff0c;验证一下确实是还没有被使用过。结果如下图所示&#xff1a; 浏览…

使用Hexo搭建个人博客网站-07-解析www域名

零、序 前面我们在完成域名解析和绑定之后&#xff0c;已经够可以成功访问域名了&#xff0c;但是却发现如果在域名前面加上 www 之后&#xff0c;竟然不能访问了&#xff0c;以我自己的域名为例&#xff1a;oceanwang.top 是可以正常访问的&#xff0c;但是 www.oceanwang.to…

使用Hexo搭建个人博客网站-05-个人网站更换Hexo主题

零、序 我们既然已经搭建好了我们的个人网站&#xff0c;接下来就该做写有意思点的事情了&#xff0c;比如&#xff1a;给我们的个人网站换个主题&#xff01; 最开始 hexo init 的时候&#xff0c;默认下载安装的主题是 landscape&#xff0c;如下图所示&#xff1a; 我们也…