使用Mongodb 做对象缓存

mongodb高效的访问速度,用来快速存取数据再合适不过了,缓存神马的,可以用这个的

另外,有的时候,如果仅仅存储几条数据,单独去建立一张表代价太大,这个时候,不妨试试这个

 

先发一个mongodb数据访问帮助类

 

再来看具体的实现:

原理:将对象通过序列化操作后以二进制的方式存储到mongodb中

存实现:

/// <summary>
        /// 存储数据
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key">
        /// <param name="value">
        public static void Set<t>(string key, T value)
        {
            try
            {
                using (MongdbHelper db = new MongdbHelper(DefaultDbName, DefaultTableName))
                {
                    IMongoQuery query = new QueryDocument()
                {
                    {"Key",key}
                };
                    var document = db.DataSet.FindOne(query);
                    if (document != null)
                    {
                        document["Value"] = SerializeHelper.BinarySerialize(value);
                        document["Type"] = value.GetType().Name;
                        document["Date"] = DateTime.Now.ToString();
                    }
                    else
                    {
                        IDictionary<string ,="" object=""> newDict = new Dictionary<string ,="" object="">();
                        newDict.Add("Value", SerializeHelper.BinarySerialize(value));
                        newDict.Add("Key", key);
                        newDict.Add("Type", value.GetType().Name);
                        newDict.Add("Date", DateTime.Now.ToString());
                        document = new BsonDocument(newDict);
                    }
                    db.DataSet.Save(document);
                }
            }
            catch (Exception ex)
            {
                throw new Exception("保存数据出错", ex);
            }
        }</string></string></t>

取实现:

/// <summary>
        /// 获取对象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key">
        /// <returns></returns>
        public static T Get<t>(string key)
        {
            using (MongdbHelper db = new MongdbHelper(DefaultDbName, DefaultTableName))
            {
 
                IDictionary<string ,="" object=""> dict = new Dictionary<string ,="" object="">();
                dict.Add("Key", key);
 
                IMongoQuery query = new QueryDocument()
                {
                    {"Key",key}
                };
 
                // 查询
                var document = db.DataSet.FindOne(query);
 
                if (document != null)
                {
                    try
                    {
                        byte[] bytes = ((MongoDB.Bson.BsonBinaryData)document["Value"]).Bytes;
 
                        #region 反序列化字节数组
 
                        if (string.Equals(document["Type"].ToString(), typeof(T).Name, StringComparison.InvariantCultureIgnoreCase))
                        {
                            return SerializeHelper.BinaryDeSerialize<t>(bytes);
                        }
                        else
                        {
                            return default(T);
                        }
 
                        #endregion
                    }
                    catch
                    {
                        return default(T);
                    }
                }
                return default(T);
 
            }
        }</t></string></string></t>

另外,为了方便存储单个对象的数据,例如配置信息,增加下面两个方法:

/// <summary>
        /// 存储对象
        /// 适用于只有单个对象或单条记录的数据,例如系统配置
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="value">
        public static void Set<t>(T value)
        {
            Set(typeof(T).Name, value);
        }
 
        /// <summary>
        /// 获取对象
        /// 适用于只有单个对象或单条记录的数据,例如系统配置
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public static T Ge<t>()
        {
            return Get<t>(typeof(T).Name);
        }</t></t></t>

 

完整代码:

 

使用举例:

有这个一个用户类:

/// <summary>
    /// 简易的用户模型
    /// </summary>
    [Serializable]
    public class UserModel
    {
        public int UserId
        {
            get;
            set;
        }
 
        public string UserName
        {
            get;
            set;
        }
 
        public string Name
        {
            get;
            set;
        }
    }

可以用这样的方式来进行存取:

public UserModel CurrentUser
        {
            get
            {
                if (currentUser == null)
                {
                    if (!string.IsNullOrEmpty(CurrentUserName))
                    {
                        currentUser = DataService.Get<usermodel>(this.CurrentUserName);
 
                        if (currentUser == null)
                        {
                            var user = IoC.Resolve<iuserrepository>().FindByAccountName(CurrentUserName);
                            if (user != null)
                            {
                                currentUser = new UserModel
                                {
                                    UserName = CurrentUserName,
                                    Name = user.Name,
                                    UserId = user.ID
                                };
 
                                // 保存到mongodb 长久存储
                                DataService.Set<usermodel>(this.CurrentUserName, currentUser);
                            }
                        }
                    }
                }
                return currentUser;
            }
        }</usermodel></iuserrepository></usermodel>

关注作者

欢迎关注作者微信公众号, 一起交流软件开发:欢迎关注作者微信公众号

posted @   JadePeng  阅读(5026)  评论(1编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示