使用Enyim.Caching访问阿里云的OCS

阿里云的开放式分布式缓存(OCS)简化了缓存的运维管理,使用起来很方便,官方推荐的.NET访问客户端类库为 Enyim.Caching,下面对此做一个封装。

首先引用最新版本 Enyim.Caching ,比如2.13.2.0 版本。

先按照阿里云的示例代码,封装一个基础的 MemCached访问类:

 public sealed class MemCached
    {
        private static MemcachedClient MemClient;
        static readonly object padlock = new object();
        //线程安全的单例模式
        public static MemcachedClient getInstance()
        {
            if (MemClient == null)
            {
                lock (padlock)
                {
                    if (MemClient == null)
                    {
                        MemClientInit();
                    }
                }
            }
            return MemClient;
        }

        static void MemClientInit()
        {

             //初始化缓存
             string host = System.Configuration.ConfigurationManager.AppSettings["MemoryCacheServer"];
             MemcachedClientConfiguration memConfig = new MemcachedClientConfiguration();
             IPAddress newaddress = IPAddress.Parse(Dns.GetHostEntry (host).AddressList[0].ToString());//your_ocs_host替换为OCS内网地址
             IPEndPoint ipEndPoint = new IPEndPoint(newaddress, 11211);

               // 配置文件 - ip
             memConfig.Servers.Add(ipEndPoint);
             // 配置文件 - 协议
             memConfig.Protocol = MemcachedProtocol.Binary;
             // 配置文件-权限
             memConfig.Authentication.Type = typeof(PlainTextAuthenticator);
             memConfig.Authentication.Parameters["zone"] = "";
             memConfig.Authentication.Parameters["userName"] =  System.Configuration.ConfigurationManager.AppSettings["CacheServerUID"];
             memConfig.Authentication.Parameters["password"] =  System.Configuration.ConfigurationManager.AppSettings["CacheServerPWD"];
             //下面请根据实例的最大连接数进行设置
             memConfig.SocketPool.MinPoolSize = 5;
             memConfig.SocketPool.MaxPoolSize = 200;
             MemClient=new MemcachedClient(memConfig);

            //如果采用配置文件,可以注释上面代码,直接下面一行代码:
            //MemClient = new MemcachedClient();
        }
    }

再定义一个缓存访问接口:

public interface ICacheManager
    {
        /// <summary>
        /// 是否启用缓存
        /// </summary>
        bool IsEnabled { get; }

        /// <summary>
        /// 根据key取缓存对象
        /// </summary>
        T Get<T>(string key);

        object Get(string key);

        /// <summary>
        /// 放入缓存
        /// </summary>
        bool Set(string key, object data, int cacheTime);

        /// <summary>
        /// 是否在缓存中
        /// </summary>
        bool IsSet(string key);

        /// <summary>
        /// 从缓存删除
        /// </summary>
        void Remove(string key);

        /// <summary>
        /// 根据规则删除
        /// </summary>
        void RemoveByPattern(string pattern);

        /// <summary>
        /// 清空所有缓存
        /// </summary>
        void Clear();
    }

最后封装 OCSManager:

public class OCSManager : ICacheManager
    {
        private static readonly MemcachedClient cache;
        private static readonly OCSManager instance;

        private OCSManager()
        {

        }

        static OCSManager()
        {
            cache = MemCached.getInstance();
            instance = new OCSManager();

        }

        private static bool isServerConnected = true;

        public static ICacheManager Instance
        {
            get { return instance; }
        }

        #region ICacheManager 成员

        public bool IsEnabled
        {
            get { return cache != null && isServerConnected; }
        }

        public T Get<T>(string key)
        {
            //var result = cache.ExecuteGet<T>(key);
            //return result.Value;
            return cache.Get<T>(key);
        }

        public object Get(string key)
        {
            return cache.Get(key);
        }

        public bool Set(string key, object data, int cacheTime)
        {
            if (data == null)
                return false;

            //var result= cache.ExecuteStore (Enyim.Caching.Memcached.StoreMode.Add,key,data,DateTime.Now + TimeSpan.FromMinutes(cacheTime));
            //return result.Success;

            return  cache.Store(Enyim.Caching.Memcached.StoreMode.Set, key, data, DateTime.Now + TimeSpan.FromMinutes(cacheTime));
        }

        public bool IsSet(string key)
        {
            object obj;
            return cache.TryGet(key, out obj);
        }

        public void Remove(string key)
        {
            cache.Remove(key);
        }

        public void RemoveByPattern(string pattern)
        {
            //throw new NotImplementedException();
        }

        public void Clear()
        {
            cache.FlushAll();
        }

        #endregion
    }

最后,在应用程序配置文件,增加上如下的配置节点:

   <configSections>
    <sectionGroup name="enyim.com">
      <section name="memcached" type="Enyim.Caching.Configuration.MemcachedClientSection, Enyim.Caching" />
    </sectionGroup>
  </configSections>

  <enyim.com>
    <memcached protocol="Binary">
      <servers>
        <add address="192.168.70.1" port="11211" />
      </servers>
      <socketPool minPoolSize="20" maxPoolSize="500" connectionTimeout="00:00:01" deadTimeout="00:00:01" receiveTimeout="00:00:01" />
      <authentication type="Enyim.Caching.Memcached.PlainTextAuthenticator,Enyim.Caching" zone="" userName="" password="" />
    </memcached>
  </enyim.com> 

注意:OCS使用的时候,会分配指定的用户名和密码, userName="" password="" ,请在实际使用之前做好这个配置。

时间: 2024-11-02 03:42:19

使用Enyim.Caching访问阿里云的OCS的相关文章

Linux通过端口转发来访问内网服务(端口转发访问阿里云Redis数据库等服务)

# 安装rinetd wget http://www.boutell.com/rinetd/http/rinetd.tar.gz&&tar -xvf rinetd.tar.gz&&cd rinetd sed -i 's/65536/65535/g' rinetd.c (修改端口范围) mkdir /usr/man&&make&&make install 说明:IP的端口是双字节,也就是256*256-1, 256*256对计算机来说就是0,因

网络问题1 ---- 关于局域网内无法访问阿里云服务器的问题

问题描述:办公室突然无法访问阿里云的其中一台服务器,IP可以ping通,但是端口不通,并不是完全不能访问,有时可以,有时不可以,有的电脑可以,有的电脑不可以,外网是可以的,问题一直没有解决,发现IDC机房的服务器是可以访问的,所以使用隧道技术,将办公室的80端口请求转发到阿里云,临时解决.一段时间后IDC服务器又出现类似问题.将问题报告给IDC机房,IDC机房更换端口后,恢复正常,过一段时间又出现问题. 解决方法:寻求阿里云技术支持,多次后,终于找到问题解决方案,修改阿里云服务器的内核参数. c

网络---关于无法访问阿里云ECS问题

问题描述:办公室突然无法访问阿里云的其中一台服务器,IP可以ping通,但是端口不通,并不是完全不能访问,有时可以,有时不可以,有的电脑可以,有的电脑不可以,外网是可以的,问题一直没有解决,发现IDC机房的服务器是可以访问的,所以使用隧道技术,将办公室的80端口请求转发到阿里云,临时解决.一段时间后IDC服务器又出现类似问题.将问题报告给IDC机房,IDC机房更换端口后,恢复正常,过一段时间又出现问题. 解决方法:寻求阿里云技术支持,多次后,终于找到问题解决方案,修改阿里云服务器的内核参数. c

阿里云的OCS缓存机制

OCS简介 OCS( Open Cache Service)为分布式高速缓存服务,主要实现热点数据的快速响应: OCS支持Key/Value的数据结构,兼容memcachebinary protocol且支持SASL的客户端都可与服务端通信.OCS 支持即开即用的方式快速部署:业务系统的时延和吞吐量受限于数据的更新和获取,常见的解决方案是在业务层和持久化层之间增加缓存层,从而降低持久化层的压力,提高系统整体的反应速度.与自建memcached相同之处在于OCS兼容memcached协议,与用户环

#Memcached系列#(6)使用Enyim.Caching访问Memcached的一个C#控制台程序

这篇文章主要是通过Enyim.Caching来完成访问Memcached. 这篇文章标为"原创",其实,是从多个地方整合过来的内容:但觉得"转载"也不合适,也并不是完全照搬别人的东西. 参考网址(不过,感觉它的配置写的乱糟糟的):http://www.cnblogs.com/luyinghuai/archive/2008/08/28/1278200.html (1)首先下载EnyimMemcached(文件名:EnyimMemcached-master.zip).

mac下配置和访问阿里云服务器(Ubuntu系统)

在阿里云租用了一个服务器,却不知道如何使用,百度了很多都写的很乱,所以在这里特地将自己如何搭建服务器以及如何配置做一个简单的归纳. 1.购买云服务器(http://www.aliyun.com/?spm=5176.3047821.1.1.vHFBuw) 注册帐号,在产品页面选择合适的服务器,进入详细页面选择配置,购买.就不多说了.购买完成后进入管理控制台——云虚拟主机.ECS云服务器查看服务器状态. 2.购买域名.阿里云也提供域名注册和购买的功能.操作很简单,想一个合适的域名难. 3.域名解析.

通过公司代理服务器访问阿里云ECS

通常在企业内部的网络环境内,想访问外部资源是需要通过代理服务器的,主要是为了保护信息安全,另外还能屏蔽员工的非工作的HTTP请求(访问京东,淘宝, 游戏网站).这样一来,貌似我们就无法直接用自己的工作电脑远程连接阿里云服务器了(SSH, SFTP), 臣妾ping不到啊. 代理服务器拥有尊贵的公网IP,将我们的请求转发出去,顺带拦截一些网站的请求,还可以监视我们的访问记录并且统计流量(缺德啊). 通常我们的代理服务器都是做HTTP proxy代理的,有的也支持socks的代理. 在我们设置IE的

ftp搭建后外网无法连接和访问阿里云服务器(非软件)

阿里云服务器由于性价比高,是不少企业建站朋友们的首选.而在购买阿里云服务器后,不少客户反映其在搭建FTP后出现外网无法访问的问题,这里特意搜集整理了关于ftp搭建后外网无法连接和访问的问题,提供以下解决方法. 问题原因一:购买的阿里云ECS未开放外网访问端口. 解决方法:开放端口. 登录阿里云ECS服务器控制面板,[网络和安全]->[安全组],在右边选择[配置规则]->[添加安全组规则],协议选全部,授权对象填0.0.0.0/0 点击确定后,再试一下外网访问FTP,是不是已经可以正常访问了?

阿里云如何让外网访问自己的服务器公网访问阿里云自己服务器

1.在自己阿里云控制台上设置开发端口 必须要开发端口不然外网访问不了你的网页 2.阿里云搭建flask项目供外网访问 用flask进行web项目开发,因为我是阿里云直接用的,Centos7.3,Python3.6.5 然后发现按照廖雪峰老师的代码,无法访问,但是没有采用flask的时候,是可以进行访问的,所以肯定是代码有问题. flask默认IP用的是127.0.0.1,端口是5000,但是我的外网无法访问,所以需要指定IP和端口进行操作, run(host=‘x.x.x.x’ ,port=80