大数据之(一)——缓存处理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Daybreak1209/article/details/45743307


1、缓存概念:

缓存就是数据交换的缓冲区,当应用程序需要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接执行,找不到的话再从内存中找。由于缓存的运行速度比内存快得多,所以使用缓存就大大提高了数据查找的效率。

缓存可以视为主数据的缩影,是内存中少部分数据的复制品。

2、实际应用:

2.1业务前提:

      现在正在开发的项目中数据库一共存有至少150张表,表的类型主要有历史数据表和时效数据表,分别用于存储不同设备的不同历史状态和最常使用数据;毋庸置疑,每张历史数据表的数据内容都是庞大的。而表间又存在多表关联关系,所以对数据进行查询等操作时,SQL语句长,数据操作效率低也成了必然;

2.2缓存的应用:

      应对以上问题,我们组选择的解决办法便是利用缓存,具体方案是在oracle数据库与应用程序中间加了一层缓存服务,也就是我这一周的主要工作:写缓存。将时效性数据更新加载到字典表中供程序调用;插入更新操作除了对数据库进行操作之外,同时调用缓存字典表操作方法,实现缓存与数据库的同步更新。

 

下面以异物传感器状态表DD_M_STATEFREIGNMATTERDEVICE为例,阐述该表的缓存字典表的具体实现步骤。


2.2.1 D层创建数据库表对应字典表:

对字典表进行初始化

 # region 异物传感器状态字典初始化 StateForeignDeviceDic     

        private static bool InitFNDDFlag = false;
        private object FNDDlockerObj = new object();

        ///<summary>
        ///传感器状态字典初始化方法
        /// </summary>
        private void InitFNDD()
        {
            lock (FNDDlockerObj)
            {
                if (InitFNDDFlag)
                {
                    return;
                }
                string strSql = @"select t.* from DD_M_STATEFREIGNMATTERDEVICE t,
    (  select v.s_monitoringPointcode,max(to_date(s_monitoringtime,'yyyy-mm-dd hh24:mi:ss')) as monitorTime  from DD_M_STATEFREIGNMATTERDEVICE v where v.d_createtime>(sysdate - interval '1' day)   group by v.s_monitoringPointcode) p 
    where t.s_monitoringpointcode= p.s_monitoringpointcode  and  to_date(t.s_monitoringtime,'yyyy-mm-dd hh24:mi:ss') = p.monitorTime and  t.d_createtime>(sysdate - interval '1' day) ";
                DataSet ds = DbHelperOra.Query(strSql);
                if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                {
                    foreach (DataRow row in ds.Tables[0].Rows)
                    {

                        EditFNDD(FNDDDataRowToModel(row));
                    }
                }
                InitFNDDFlag = true;
            }

        }

        ///<summary>
        ///获得一个传感器对象实体
        /// </summary>
        /// 
        private ICT.RCS.Modules.Service.Model.DD_M_STATEFREIGNMATTERDEVICE FNDDDataRowToModel(DataRow row)
        {
            ICT.RCS.Modules.Service.Model.DD_M_STATEFREIGNMATTERDEVICE model = new ICT.RCS.Modules.Service.Model.DD_M_STATEFREIGNMATTERDEVICE();
            if (row != null)
            {
                if (row["ID"] != null)
                {
                    model.ID = row["ID"].ToString();
                }
                if (row["D_CREATETIME"] != null && row["D_CREATETIME"].ToString() != "")
                {
                    model.D_CREATETIME = DateTime.Parse(row["D_CREATETIME"].ToString());
                }
            }
            return model;
        }

        /// <summary>
        /// 编辑异物感器状态字典
        /// </summary>
        /// <param name="model"></param>
        private void EditFNDD(DD_M_STATEFREIGNMATTERDEVICE model)
        {
            lock (FNDDlockerObj)
            {
                if (StateFreignMatterDeviceDic.ContainsKey(model.S_MONITORINGPOINTCODE))
                {
                    DD_M_STATEFREIGNMATTERDEVICE nowModel = StateFreignMatterDeviceDic[model.S_MONITORINGPOINTCODE];
                    if (DateTime.Parse(model.S_MONITORINGTIME) > DateTime.Parse(nowModel.S_MONITORINGTIME))
                    {
                        StateFreignMatterDeviceDic[model.S_MONITORINGPOINTCODE] = model;
                    }
                }
                else
                {
                    StateFreignMatterDeviceDic.Add(model.S_MONITORINGPOINTCODE, model);
                }
            }
        }
        # endregion

对字典表进行数据操作

#region 传感状态字典操作   StateForeignDeviceDic

        ///<summary> 
        ///更新一个异物传感器状态
        /// </summary>
        /// <param name="model"></param>
        public void UpdateFNDD(DD_M_STATEFREIGNMATTERDEVICE model)
        {
            InitFNDD();
            EditFNDD(model);
        }

        ///<summary>
        ///根据监测点ID获取异物传感器状态
        /// </summary>
        /// <param name="monitorPointCode"></param>
        /// <returns></returns>
        public DD_M_STATEFREIGNMATTERDEVICE GetFNDD(string monitorPointCode)
        {
            InitFNDD();
            lock (FNDDlockerObj)
            {
                DD_M_STATEFREIGNMATTERDEVICE model = null;
                if (StateFreignMatterDeviceDic.ContainsKey(monitorPointCode))
                {
                    model = StateFreignMatterDeviceDic[monitorPointCode];
                }
                return model;
            }
        }
        #endregion

2.2.2 B层调用D层方法

直接调用

       ///更新一个异物侵线传感器状态
        ///<param name="model"></param>
        public void UpdateFNDDDic(DD_M_STATEFREIGNMATTERDEVICE model)
        {
            stateDeviceDB.UpdateFNDD(model);
        }

2.2.3服务层提供对外访问接口

 [OperationContract]
         void UpdateStateFNDDic(string s_id, string lineCode, string monitorPointKm, string foreignPowerState, string connectstatus, string monitoringTime, string railwayAdministrator);

通过在数据库与应用程序之间加入一套字典表,通过字典表对数据库中常用的或者最新更新的数据进行存储,程序调用时,首先在缓存字典表中进行查找,减少了数据检索的时间,以这种方式应对大数据检索时效率低,查询慢的问题。同时减少服务器压力,提高客户端响应速度。还起到在数据库意外崩溃时,程序仍可以安然无恙的继续运转。



没有更多推荐了,返回首页