且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2022-09-16 18:12:01

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

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

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

使用Enyim.Caching访问阿里云的OCS
 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();
        }
    }
使用Enyim.Caching访问阿里云的OCS

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

使用Enyim.Caching访问阿里云的OCS
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();
    }
使用Enyim.Caching访问阿里云的OCS

最后封装 OCSManager:

使用Enyim.Caching访问阿里云的OCS
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
    }
使用Enyim.Caching访问阿里云的OCS

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

使用Enyim.Caching访问阿里云的OCS
   <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> 
使用Enyim.Caching访问阿里云的OCS

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


    本文转自深蓝医生博客园博客,原文链接:http://www.cnblogs.com/bluedoctor/p/5642650.html,如需转载请自行联系原作者