zoukankan      html  css  js  c++  java
  • .net关于应用程序缓存的一些疑惑

    疑惑:获取缓存后强制转换为实体对象传递给前台,如果前台对这个实体对象中属性更改的话缓存中的数据也随之改变,为啥???

    首先是创建缓存的方法:

    /// <summary>
            /// 创建缓存项过期
            /// </summary>
            /// <param name="key">缓存Key</param>
            /// <param name="obj">object对象</param>
            /// <param name="expires">过期时间(分钟)</param>
            public static void Insert(string key, object obj, int expires)
            {
                HttpContext.Current.Cache.Insert(key, obj, null, Cache.NoAbsoluteExpiration, new TimeSpan(0, expires, 0));
            }

    获取缓存的方法:

    /// <summary>
            /// 获取缓存对象
            /// </summary>
            /// <param name="key">缓存Key</param>
            /// <returns>object对象</returns>
            public static object Get(string key)
            {
                if (string.IsNullOrEmpty(key))
                {
                    return null;
                }
                return HttpContext.Current.Cache.Get(key);
            }

    开始使用缓存:

    /// <summary>
            /// 得到一个对象实体
            /// </summary>
            public Model.article_news GetNewsModel(int id)
            {
                string key = "getmo" + id.ToString();
                object objModel = CacheHelper.Get(key);
                if (objModel == null)
                {
                    objModel = dal.GetNewsModel(id);
                    if (objModel != null)
                    {
                        CacheHelper.Insert(key, objModel, 10);
                    }
                }
                return (Model.article_news)objModel;
            }
    

     这个方法逻辑总没问题吧

    接着来前台的代码:

           BLL.article bll = new BLL.article();
                Model.article_news model = bll.GetNewsModel(_id);
                object obj = System.Web.HttpContext.Current.Cache.Get("getmo" + _id + "");
                model.title = "222222222222222";
                ddlCategoryId.SelectedValue = model.category_id.ToString();
                object obj2 = System.Web.HttpContext.Current.Cache.Get("getmo" + _id + "");
                txtTitle.Text = model.title;
    

      下面的代码就省略了,就是获取一个实体对象,对比更改title后的原缓存值

    第一个obj对象中的值如图:

     这当然是正常的。

    接着是更改title后的缓存对象的值:

    我改的是Model中的值,但是缓存中title的值也变了,why???

    引用类型数据? 我new了一个Model的对象还是这种结果!!!

    最总解决方法是使用深复制拷贝一个新的model对象

    解决步骤:

    先建一个公共的处理类,用于深复制:

    #region 引用数据类型深复制
            /// <summary>
            /// 引用数据类型深复制
            /// </summary>
            /// <typeparam name="T">数据类型</typeparam>
            /// <param name="serializableObject">要复制的范本</param>
            /// <returns>返回拷贝后的新对象</returns>
            public static T CloneOf<T>(T serializableObject)
            {
                object objCopy = null;
                MemoryStream stream = new MemoryStream();
                BinaryFormatter binFormatter = new BinaryFormatter();
                binFormatter.Serialize(stream, serializableObject);
                stream.Position = 0;
                objCopy = (T)binFormatter.Deserialize(stream);
                stream.Close();
                return (T)objCopy;
            } 
            #endregion

    最后获取缓存的方法如下:

    /// <summary>
            /// 得到一个对象实体
            /// </summary>
            public Model.article_news GetNewsModel(int id)
            {
                string key = "getmo" + id.ToString();
                object objModel = CacheHelper.Get(key);
                if (objModel == null)
                {
                    objModel = dal.GetNewsModel(id);
                    if (objModel != null)
                    {
                        CacheHelper.Insert(key, objModel, 10);
                    }
                }
                Model.article_news model = (Model.article_news)objModel;
                Model.article_news model2 = Utils.CloneOf<Model.article_news>(model);
                return model2;
            }
    

    发现我根本就不懂C# !

  • 相关阅读:
    confluence的安装、破解和汉化
    Linux学习经验集锦
    MFS 分布式文件系统
    MFS
    Docker 搭建 WordPress
    ansible入门
    docker搭建pxc集群与haproxy负载均衡
    mysql-proxy 实现读写分离
    Linux内核学习总结
    lab8:理解进程调度时机跟踪分析进程调度与进程切换的过程
  • 原文地址:https://www.cnblogs.com/New-world/p/3229015.html
Copyright © 2011-2022 走看看