zoukankan      html  css  js  c++  java
  • 使用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;
                }
            }
  • 相关阅读:
    为什么要把MySQL的binlog格式修改为row
    面试官:你知道大事务会带来什么问题以及如何解决么?
    TCP三次握手、四次挥手、滑动窗口、流量控制
    SpringCloud Gateway拦截器遇到的小坑汇总
    Zipkin客户端链路追踪源码解析
    Hystrix失败处理逻辑解析
    Feign自动装配原理
    SpringCloud服务调用源码解析汇总
    Zipkin架构简介
    C#+Selenium抓取百度搜索结果前100网址
  • 原文地址:https://www.cnblogs.com/xiaoqi/p/2398014.html
Copyright © 2011-2022 走看看