• Windows系统下Memcached缓存系列二:CouchbaseClient(c#客户端)的详细试用,单例模式


    在上一篇文章里面 ( Windows系统下Memcached缓存系列一:Couchbase(服务器端)和CouchbaseClient(c#客户端)的安装教程 ),我们介绍了服务器端的安装和客户端的安装,以及一个简单的例子,这一篇介绍详细的使用方法.

    这次以一个web项目为例.

    配置文件配置调用

    第一步:首先上一下配置文件,在web.config文件里面的 configuration 节点中  添加以下配置

    <!--配置缓存开始-->
            <configSections>
                <section name="couchbase" type="Couchbase.Configuration.CouchbaseClientSection, Couchbase"/>
            </configSections>
            <couchbase>
                <servers bucket="default" bucketPassword="">
                    <add uri="http://127.0.0.1:8091/pools"/>
                    <!--<add uri="http://192.168.0.3:8091/pools"/>-->
                </servers>
            </couchbase>
        <!--配置缓存结束--> 
    

    可以看到Servers节点下只添加了一个URI,而且是我的本机。这个地方通常会配置多个URI列表,是客户端获取信息的集群配置。默认的Couchbase 服务端安装是创建一个名为default、没有密码的存储区(bucket),所以这里存储区密码(bucketpassword)的属性为可选。如果你创建了一个已认证的存储区,你必须在上面的设置中配置那个值。这里暂时就先使用默认的进行吧。

    第二步: 编写缓存接口,实例化客户端,增删改查

    在实际开发中,创建客户端的实例是昂贵的。 客户端会增加开销,因为它创建连接池并设置线程获得集群配置。 因此,最好的做法是创建一个单一的客户端实例,也就是单列。

    我们创建一个类,这个类的静态属性就是我们的实例。 下面是代码

    2.1 缓存接口

    public interface ICacheManager
        {
            bool AddCache(string key, object obj);
            T GetCache<T>(string key) where T : class;
            bool ClearCache(string key);
            bool AddCache(string key, object obj, int minutes);
            void FlushAll();
        }
    2.2 缓存的实现,以及单例
    //缓存工厂
        public  class MemCacheFactory : ICacheManager   //继承缓存的接口
        {
            private static readonly object SyncRoot = new object();    //程序运行时创建一个静态的只读对象(用于下面的加锁)
    
            #region 缓存工厂的基础属性字段,静态构造方法
    
            private static readonly CouchbaseClient _instance;
    
            //静态构造函数,在类初始化的时候执行,不用加 public / private 没有意义,因为这个是由.net自动来调用
            //在创建第一个类实例或任何静态成员被引用时,.NET将自动调用静态构造函数来初始化类
            static MemCacheFactory()
            {
                _instance = new CouchbaseClient();
            }
    
            private static CouchbaseClient Instance
            {
                get { return _instance; }
            }
    
            #endregion
    
            #region CRUD 接口的实现
    
            #region AddCache 添加缓存(以序列化保存)
    
            /// <summary>
            /// 添加缓存
            /// </summary>
            /// <param name="key"></param>
            /// <param name="obj"></param>
            /// <returns></returns>
            public bool AddCache(string key, object obj)
            {
                //注意:如果我们直接是用obj来保存,则缓存会帮我们自动加密
                //如果我们按照下面的方法,先序列化后,再保存,那么就不会加密
                string jsonobj = JsonConvert.SerializeObject(obj);
                return Instance.Store(StoreMode.Set, key, jsonobj);  
            }
    
            #endregion
    
            #region AddCache 添加缓存并设置时间(以序列化保存)
    
            /// <summary>
            /// AddCache 添加缓存并设置时间(以序列化保存)
            /// </summary>
            /// <param name="key"></param>
            /// <param name="obj"></param>
            /// <param name="minutes"></param>
            /// <returns></returns>
            public bool AddCache(string key, object obj, int minutes)
            {
                string jsonobj = JsonConvert.SerializeObject(obj);
                return Instance.Store(StoreMode.Set, key, jsonobj, DateTime.Now.AddMinutes(minutes));
            }
    
            #endregion
    
            #region GetCache 获得缓存(并且是已经反序列化的)
    
            /// <summary>
            /// 获得缓存
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="key"></param>
            /// <returns></returns>
            public T GetCache<T>(string key) where T : class
            {
                string jsonobj = Instance.Get<String>(key);
                if (string.IsNullOrEmpty(jsonobj))
                    return null;
                return (T) JsonConvert.DeserializeObject(jsonobj, typeof (T));
    
            }
    
            #endregion
    
            #region ClearCache 清除缓存
    
            /// <summary>
            /// 清除缓存
            /// </summary>
            /// <param name="key"></param>
            /// <returns></returns>
            public bool ClearCache(string key)
            {
                return Instance.Remove(key);
            }
    
            #endregion
    
            #region FlushAll 设置缓存过期(失效后通过get就取不出来了)
    
            /// <summary>
            /// 设置缓存过期(失效后通过get就取不出来了)
            /// </summary>
            public void FlushAll()
            {
                Instance.FlushAll();
            }
    
            #endregion
    
            #endregion
    
            #region 工厂的单例
    
            private static MemCacheFactory _shareInstance;
    
            public static MemCacheFactory GetCurrentMemCache()
            {
                if (_shareInstance == null)
                    lock (SyncRoot)
                    {
                        _shareInstance = new MemCacheFactory();
                    }
                return _shareInstance;
            }
    
            #endregion
    
    
        }



    StoreMode.Add ,StoreMode.Replace 和 StoreMode.Set 的区别

    Add ,表示添加一个新的key

    Replace ,表示更新一个已经存在的key

    set ,表示如果key不存在则添加、存在则更新。

    如果我们不使用set,而是用 Add和Replace的话,可能会报错,报错的原因如下  :如果key已经存在那么Add就会失败,如果key不存在Replace操作会失败。

    所以建议还是用 Set吧

     

     

    (注意里面有意思的地方,obj的值如果是序列化的,则服务器上显示的是序列化的值,不加密.  如果obj的值不序列化,那么服务器会加密)

    也就是如果我们的添加保存的方法里面,把obj进行了序列化,那么服务器上显示的值,就是序列化后的字符串

    public bool AddCache(string key, object obj, int minutes)
            {
                string jsonobj = JsonConvert.SerializeObject(obj);
                return Instance.Store(StoreMode.Set, key, jsonobj, DateTime.Now.AddMinutes(minutes));
            }

    image

    如果我们保存的obj就是一个对象的话,那么服务器上显示的就是这个对象加密过的数据

    public bool AddCache(string key, object obj, int minutes)
            {
                //string jsonobj = JsonConvert.SerializeObject(obj);
                //return Instance.Store(StoreMode.Set, key, jsonobj, DateTime.Now.AddMinutes(minutes));
                return Instance.Store(StoreMode.Set, key, obj, DateTime.Now.AddMinutes(minutes));
            }

    image

    总结: 支持中文的key,如果保存的值是一个对象,那么服务器上保存的是对象加密后的值,如果保存的是一个序列化的字符串,则服务器上保存的是字符串.

    如果我们保存的序列化的值,我们通过Json属性来更改,会怎么样? 例如下面有这样的类,上面用JsonProperty打了标签,保存到缓存会怎么样?
    public class Person
        {
            [JsonProperty("id")]
            public string  Name { get; set; } 
            [JsonProperty("myaddress")]
            public string  Address { get; set; } 
        }

    保存到缓存里面

    image

    如果是我们获取到缓存之后,是使用  .Name 还是 .id 呢?  答案是:还是用 .Name

    var temp=MemCacheFactory.GetCurrentMemCache().GetCache<Person>(txtkey);
                    litResult.Text = temp.Name

    最后写一下使用方法

    protected void btnAdd_Click(object sender, EventArgs e)
            {
                string txtkey = txtKey.Text.Trim();
                string txtvalue = txtValue.Text.Trim();
    
                MemCacheFactory.GetCurrentMemCache().AddCache(txtkey, txtvalue);
                Response.Redirect("add.aspx");
    
            }

     

    疑问: 好像是不能使用  FlushAll的

  • 相关阅读:
    web.py利用模板的详细步骤
    Arduino入门笔记(9):蓝牙模块及第一辆蓝牙遥控小车
    Python常用模块之sys
    使用Supervisor管理Linux进程
    Python socket聊天室程序
    Ubuntu 文件文件夹查看权限和设置权限
    python遍历目录
    linux tail命令的使用方法详解
    Python使用openpyxl读写excel文件
    python中enumerate()的用法
  • 原文地址:https://www.cnblogs.com/joeylee/p/3605182.html
Copyright © 2020-2023  润新知