使用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; } } 
       
     
  
    

你可能感兴趣的:(mongodb)