使用Mongodb 做对象缓存

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

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

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

public class MongdbHelper : IDisposable
    {
        public MongoServer Server { get; private set; }

        public MongoDB.Driver.MongoDatabase Database { get; private set; }

        public MongoCollection DataSet { get; set; }

        public MongdbHelper( string dbName, string tableName)
        {
            Server = MongoServer.Create("mongodb://localhost/?socketTimeoutMS=2400000");
            Database = Server.GetDatabase(dbName);
            DataSet = Database.GetCollection(tableName);
        }

        public MongdbHelper(string connectionString, string dbName, string tableName)
        {
            Server = MongoServer.Create(connectionString);
            Database = Server.GetDatabase(dbName);
            DataSet = Database.GetCollection(tableName);
        }

        public void Dispose()
        {
            Server.Disconnect();
        }

        public static List GetOnColumn(string dbName, string tableName, string column, Func convert)
        {
            try
            {
                using (MongdbHelper db = new MongdbHelper(dbName, tableName))
                {
                    List results = new List();
                    var r = db.DataSet.FindAll();
                    r.SetFields(column);
                    foreach (var c in r)
                    {
                        results.Add(convert(c[column]));
                    }

                    return results;
                }
            }
            catch
            {
                return null;
            }
        }

        public static bool IsExist(string dbName, string tableName, string column, object value)
        {
            try
            {
                using (MongdbHelper db = new MongdbHelper(dbName, tableName))
                {
                    IMongoQuery query = new QueryDocument() { { column, value.ToString() } };
                    var results = db.DataSet.FindOne(query);
                    return results != null;
                }
            }
            catch
            {
                return false;
            }
        }
    }

再来看具体的实现:

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

存实现:

/// 
        /// 存储数据
        /// 
        /// 
        /// 
        /// 
        public static void Set(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 newDict = new Dictionary();
                        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);
            }
        }

取实现:

/// 
        /// 获取对象
        /// 
        /// 
        /// 
        /// 
        public static T Get(string key)
        {
            using (MongdbHelper db = new MongdbHelper(DefaultDbName, DefaultTableName))
            {

                IDictionary dict = new Dictionary();
                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(bytes);
                        }
                        else
                        {
                            return default(T);
                        }

                        #endregion
                    }
                    catch
                    {
                        return default(T);
                    }
                }
                return default(T);

            }
        }

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

/// 
        /// 存储对象 
        /// 适用于只有单个对象或单条记录的数据,例如系统配置
        /// 
        /// 
        /// 
        public static void Set(T value)
        {
            Set(typeof(T).Name, value);
        }

        /// 
        /// 获取对象
        /// 适用于只有单个对象或单条记录的数据,例如系统配置
        /// 
        /// 
        /// 
        public static T Ge()
        {
            return Get(typeof(T).Name);
        }

完整代码:

public class SerializeHelper
    {
        /// 
        /// 反序列化
        /// 
        /// 
        /// 
        /// 
        public static T BinaryDeSerialize(byte[] serializedObject)
        {
            MemoryStream serializationStream = new MemoryStream();
            serializationStream.Write(serializedObject, 0, serializedObject.Length);
            serializationStream.Seek(0L, SeekOrigin.Begin);
            object obj2 = new BinaryFormatter().Deserialize(serializationStream);
            serializationStream.Close();
            serializationStream.Dispose();
            return (T)obj2;
        }

        /// 
        /// 序列化
        /// 
        /// 
        /// 
        public static byte[] BinarySerialize(object obj)
        {
            MemoryStream serializationStream = new MemoryStream();
            new BinaryFormatter().Serialize(serializationStream, obj);
            serializationStream.Seek(0L, SeekOrigin.Begin);
            byte[] buffer = serializationStream.ToArray();
            serializationStream.Close();
            serializationStream.Dispose();
            return buffer;
        }
    }

    /// 
    /// 简易的mongodb数据存储服务
    /// 
    public class DataService
    {
        /// 
        /// 数据接名
        /// 
        static string DefaultDbName = "MongodbService";

        static string DefaultTableName = "DataSet";

 
        /// 
        /// 获取对象
        /// 
        /// 
        /// 
        /// 
        public static T Get(string key)
        {
            using (MongdbHelper db = new MongdbHelper(DefaultDbName, DefaultTableName))
            {

                IDictionary dict = new Dictionary();
                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(bytes);
                        }
                        else
                        {
                            return default(T);
                        }

                        #endregion
                    }
                    catch
                    {
                        return default(T);
                    }
                }
                return default(T);

            }
        }

        /// 
        /// 存储数据
        /// 
        /// 
        /// 
        /// 
        public static void Set(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 newDict = new Dictionary();
                        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);
            }
        }


        /// 
        /// 存储对象 
        /// 适用于只有单个对象或单条记录的数据,例如系统配置
        /// 
        /// 
        /// 
        public static void Set(T value)
        {
            Set(typeof(T).Name, value);
        }

        /// 
        /// 获取对象
        /// 适用于只有单个对象或单条记录的数据,例如系统配置
        /// 
        /// 
        /// 
        public static T Ge()
        {
            return Get(typeof(T).Name);
        }

    }

使用举例:

有这个一个用户类:

/// 
    /// 简易的用户模型
    /// 
    [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(this.CurrentUserName);

                        if (currentUser == null)
                        {
                            var user = IoC.Resolve().FindByAccountName(CurrentUserName);
                            if (user != null)
                            {
                                currentUser = new UserModel
                                {
                                    UserName = CurrentUserName,
                                    Name = user.Name,
                                    UserId = user.ID
                                };

                                // 保存到mongodb 长久存储
                                DataService.Set(this.CurrentUserName, currentUser);
                            }
                        }
                    }
                }
                return currentUser;
            }
        }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程思想之路

Activity加载view6.0源码分析---setContentView

本篇博文介绍三个方面的知识 chapter One:认识Activity的布局 chapter Two:启动activity时的布局--从setContent...

1868
来自专栏技术之路

WPF之TreeList的实现方法(一)

做项目的时候根据需求,WPF现有的控件不能完全满足我们的需求, 很多时候我们需要对现有的控件做一下加工。 最简单的我们可能会把Tree转换成List形式有的叫G...

1935
来自专栏jessetalks

由浅入深表达式树(完结篇)重磅打造 Linq To 博客园

  一个多月之后,由浅入深表达式系列的最后一篇终于要问世了。想对所有关注的朋友说声:“对不起,我来晚了!” 希望最后一篇的内容对得起这一个月时间的等待。在学习完...

3656
来自专栏hbbliyong

WPF里ItemsControl的分组实现 --listbox 实现分组

我们在用到ItemsControl时,有时会用到分组,如ListBox,ListView,DataGrid。WPF的ItemsControl可以实现分组,是依托...

611
来自专栏ASP.NET MVC5 后台权限管理系统

构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(12)-系统日志和异常的处理②

上一讲我们做了日志与异常的结果显示列表,这一节我们讲要把他应用系统中来。 首先我们在App.Common类库中创建一个通用类ResultHelper,这个类里面...

1816
来自专栏恰同学骚年

轻量级ORM框架初探-Dapper与PetaPoco的基本使用

  EF是传统的ORM框架,也是一个比较重量级的ORM框架。这里仍然使用EF的原因在于为了突出轻量级ORM框架的性能,所谓有对比才有更优的选择。

1043
来自专栏跟着阿笨一起玩NET

C# 同步工作站与SQL服务器的时间,设置本机时间

本文转载:http://www.csframework.com/archive/2/arc-2-20130101-1971.htm

422
来自专栏魂祭心

原 (手工)base64加密解密

3446
来自专栏ASP.NET MVC5 后台权限管理系统

ASP.NET MVC5+EF6+EasyUI 后台管理系统(19)-权限管理系统-用户登录

我们之前做了验证码,登录界面,却没有登录实际的代码,我们这次先把用户登录先完成了,要不权限是讲不下去了 把我们之前的表更新到EF中去 ? 登录在Account控...

15310
来自专栏智能大石头

SQLite事务与自增深度分析

SQLite什么都好,就怕“database is locked”这些年来想尽办法去规避它。 测试代码: static void Test2() { ...

1767

扫描关注云+社区