于是精力和写的篇章多数是在享用创业的经过,介绍如何吧

背景:

近些年和阿里的一个技能老板风动聊的时候,他问了如此一个题目:说说您框架的统筹思路和亮点?

话说,这一个问题,5年前开头就直接平日出现在前边,可自己尚未认真为它找出过答案!

于是乎,夜深深,我躺在床上,用台式机,一边研商,一边打字,试着找寻!

那些年来,我的框架或小说,都快凑满十二个了,每个独立都可以说上好几天。

但若是时间唯有半时辰,我要怎么介绍呢?介绍咋样吧?

出现在脑英里的框架有三个:CYQ.Data、ASP.NET Aries、Taurus.MVC。

粗粗是因为近期的生命力都在那方面吧的呢(如当年自家生气花在Qblog一样吧)。

前言:

近年一段时间,开首了《IT连》创业,所以精力和写的篇章多数是在享用创业的进度。

而至于我三大框架CYQ.Data、Aries、Taurus.MVC的相干文章,基本都很少写了。

但框架的维护升级,依旧不时的在进展中的,这一点从开源的Github上的代码提交时间上就可以看出来了。

毕竟《IT连》的后台WebAPI,用的是Taurus.MVC,后台系统管理用的是Aries。

而是明天,就不写创业有关的篇章了,先分享篇技术类的稿子。

说说您框架的统筹思路?

框架的陈设性思路?哪个框架?我自己挑一个?

如果要讲Aries或Taurus,就务须讲CYQ.Data,因为它们都是根据CYQ.Data的留存而留存的。

从而问题就改成回答:说说你CYQ.Data框架的规划思路?

本人倍感很难回答那么些问题,内心也能感受到一丝抗拒那个题目的想法?

框架是旷日持久的光阴演进重构而来的,最早期的笔触是这么的:

布局一个简便的MDataTable种类,传进一个表名,按照数据库链接获得表结构,再依照行的列构造出SQL语句执行,把数据读到MDataTable重临。

如上一句概括了最初期的笔触,但从不布置,简单并不亮。

一经要说说新型版本的宏图思路,我想不到该怎么表述,因为重构的次数太多了,几百上千次了,太多细节,每个细节都单身带有它和谐的规划思想。

似乎腾迅最早也只是QQ发个音讯,现在迈入到生态圈,你说人家是怎么规划现在的王国的?

CYQ.Data 分布式自动缓存

事先写过一篇:CYQ.Data V5
分布式自动化缓存设计介绍

在上一篇里,基本景况和笔触,已经介绍的很清楚,那里就概括补充2点:

唯恐,只是做着做着,就那规范了〜〜〜才是答案吧。

1:自动缓存默许是打开状态的,相关决定和布局如下:

亟需全局关闭时:

能够在应用程序启动时的入口用代码:

AppConfig.Cache.IsAutoCache=false;

或者app.config、web.config配置:

<appSettings>
    <add key="IsAutoCache" value="false"/>
</appSettings>

亟需代码局部关闭时:

using (MAction action = new MAction("表名"))
{
     action.SetAopState(CYQ.Data.Aop.AopOp.OnlyOuter);//关闭自动缓存并保留Aop
}

用代码控制清除表缓存时:

string key= CacheManage.GetKey(CacheKeyType.AutoCache, "表名");
CacheManage.Instance.Remove(key);

任何控制的安顿项:

            /// <summary>
            /// AutoCache开启时,可以设置不缓存的Table,多个用逗号分隔
            /// </summary>
            public static string NoCacheTables
            {
                get
                {
                    return GetApp("NoCacheTables", "");
                }
                set
                {
                    SetApp("NoCacheTables", value);
                    CYQ.Data.Cache.AutoCache.NoCacheTables = null;
                }
            }

            /// <summary>
            /// AutoCache开启时,可以设置不受更新影响的列名,用Json格式。
            /// {talbeName1:'column1,column2',talbeName2:'column1,column2'}
            /// </summary>
            public static string IngoreCacheColumns
            {
                get
                {
                    return GetApp("IngoreCacheColumns", "");
                }
                set
                {
                    SetApp("IngoreCacheColumns", value);
                    CYQ.Data.Cache.AutoCache.IngoreCacheColumns = null;
                }
            }

好呢,设计思路回答不上来,那就讲讲框架有何样亮点啊?

自家了个去,又是那几个题材,一个在自己内心深深留下疤痕的题目。

我曾经用尽洪荒之力写过一篇小说,来介绍框架的优势,不过我现在记不起来了!

只得忘掉小说,重新思考了:

1:框架援助多数据库。(对白:支持多数据库的框架各处有啊)

2:嗯,重点框架能把数据从一种数据库转向任意一种数据库(独白:项目里须要混合数据库的现象太少,那意义没啥觉得)

再想想:

1:框架的缓存集成了Memcache、Redis(对白:集成不是很简单的事情么?)

2:嗯,但客户端从未引用第三方,都是友善写的,Json解析都是友好写的(对白:只好说技术好,但效益不算亮点)

再想想:

1:框架完毕了自行缓存。(独白:缓存有甚尤其,Hibernate也有二级缓存,说说你它有吗不一致?)

2:嗯,Hibernate的二级缓存无法自动失效,因为它的失灵策略没办法处理自定义的sql语句(对白:你是怎么决定的?)

3:嗯,我是经过分析执行的SQL语句,得到语句所涉及的表,通过表这几个维度来决定的(独白:那不会发出很多缓存无效问题?表的修改无处不在,能操纵到行么?)

4:不可以,但足以控制列,嗯,所以自己还安顿了,可以指定忽略哪些字段的翻新不触发缓存失效,也得以指定哪些表不要求缓存(对白:如若不在SQL层面,在选用规模怎样决定缓存失效?)

5:在工作代码控制呢?或者通过AOP统一宰制?(对白:不是自我想要的答案)

6:也得以经过数据库来触发缓存失效,MSSQL就有提供缓存着重(对白:具体怎么得以完结呢?)

7:微软的一向调就好了,具体原理是透过触发器把修改的多少写入指定的表,再通过定时器扫表。(独白:也不是本人想要的答案,还有任何答案么?)

8:没有了,你说说(对白:在此以前好像讲过,现在想不起来了,说说您尤其Aries框架的亮点吗)

半小时已经基本上了,亮点依旧没有被感觉出来〜〜〜

Aries的助益?我还没回复洪荒之力再给它写一篇框架的优势篇呢,该怎么介绍?

1:嗯,框架就是传一个表名,就足以自动生成增删改查导入导出,还自定义了一套简单的前端语法,结合后端很简单开发(独白:不明了你说怎样,如故闲聊一下其余的吧…..)

 

-------------------重新考虑,若只有半时辰,该怎么介绍框架-----------------

 

2:分布式应用时的缓存控制

对此单一应用程序,框架已经处理的很好。

而对于七个应用程序,框架提供的方案是因而陈设启用分布式缓存MemCache或Redis。

有关的配置如下(AppConfig下的都得以对应web.config下的AppSettings项):

            /// <summary>
            /// MemCache分布式缓存的服务器配置,多个用逗号(,)分隔
            /// </summary>
            public static string MemCacheServers
            {
                get
                {
                    return GetApp("MemCacheServers", string.Empty);
                }
                set
                {
                    SetApp("MemCacheServers", value);
                }
            }

            /// <summary>
            /// MemCache 备份服务器(当主服务器挂了后,请求会转向备用机)
            /// </summary>
            public static string MemCacheServersBak
            {
                get
                {
                    return GetApp("MemCacheServersBak", string.Empty);
                }
                set
                {
                    SetApp("MemCacheServersBak", value);
                }
            }

            /// <summary>
            /// Redis分布式缓存的服务器配置,多个用逗号(,)分隔
            /// </summary>
            public static string RedisServers
            {
                get
                {
                    return GetApp("RedisServers", string.Empty);
                }
                set
                {
                    SetApp("RedisServers", value);
                }
            }
            /// <summary>
            /// Redis 使用的DB数(默认1,使用db0)
            /// </summary>
            public static int RedisUseDBCount
            {
                get
                {
                    return GetAppInt("RedisUseDBCount", 1);
                }
                set
                {
                    SetApp("RedisUseDBCount", value.ToString());
                }
            }
            /// <summary>
            /// Redis 使用的DB 索引(默认0,若配置,则会忽略RedisUseDBCount)
            /// </summary>
            public static int RedisUseDBIndex
            {
                get
                {
                    return GetAppInt("RedisUseDBIndex", 0);
                }
                set
                {
                    SetApp("RedisUseDBIndex", value.ToString());
                }
            }
            /// <summary>
            /// Redis  备份服务器(当主服务器挂了后,请求会转向备用机)
            /// </summary>
            public static string RedisServersBak
            {
                get
                {
                    return GetApp("RedisServersBak", string.Empty);
                }
                set
                {
                    SetApp("RedisServersBak", value);
                }
            }

介绍:CYQ.Data的亮点

思维了1天,发现亮点效率太多:元数据缓存、AOP、UI交互、调试、模板引擎、Json工具、DB工具、分布式缓存、批量、内存表、文本数据库、防SQL注入、多数据库转换等。

即使一个一个介绍及聊其技术细节,十年的收获,讲四天三夜也没完!

可假若时间有限,只好讲多个,那我不能够不对其进展抽象计算。

经过一连的思想,忽略人有本人优,只选人无我有的角度,总计了三个为主:

分布式下缓存的失效策略提高

在两个应用程序时,分布式缓存可以集中控制,即便是一种方案。

但对于单一的服务器来说,初叶思索有没有更简明的方案,可以不装MemCache或Redis。

譬如《IT连》创业项目标webapi和aries后台是两套程序,同一个服务器下同步操作一个数据库,各自有活动缓存的情状下。

因而考虑,最终选项了通过定时扫描表来拍卖。

1:自动缓存:抗并发。

对此中小型项目,自动解决抗并发问题,进步网站性能、简化代码,精简架构!

对此大型的高并发大数据量的扑朔迷离工作,缓存照旧要尤其细化控制命中率。

方案原理:

各样应用程序,只要配置好数据库链接(配置的数据库可以是随意的):

            /// <summary>
            /// CYQ.Data.Cache 自动缓存 - 数据库链接配置
            /// 在多个不同的应用项目里操作同一个数据库时(又不想使用分布式缓存MemCache或Redis),可以开启此项,达到缓存智能清除的效果。
            /// </summary>
            public static string AutoCacheConn
            {
                get
                {
                    if (_AutoCacheConn == null)
                    {
                        _AutoCacheConn = AppConfig.GetConn("AutoCacheConn");
                    }
                    return _AutoCacheConn;
                }
                set
                {
                    _AutoCacheConn = value;
                }
            }        

随后框架会自动成立一个SysAutoCache表,包罗CacheKey和Cache提姆e两列:

图片 1

继而框架会有定时环顾,来拍卖:

 public static void AutoCacheKeyTask(object threadID)
        {

            while (true)//定时扫描数据库
            {
                int time = AppConfig.Cache.AutoCacheTaskTime;
                if (time <= 0)
                {
                    time = 1000;
                }
                Thread.Sleep(time);
                if (removeListForKeyTask.Count > 0)
                {
                    string baseKey = removeListForKeyTask.Dequeue();
                    if (!string.IsNullOrEmpty(baseKey))
                    {
                        KeyTable.SetKey(baseKey);
                    }
                }
                if (KeyTable.HasAutoCacheTable) //读取看有没有需要移除的键。
                {
                    KeyTable.ReadAndRemoveKey();
                }
            }
        }

默许是1秒扫一次,你也可以友善安排扫描的间隔时间:

            /// <summary>
            /// 当AutoCacheConn开启后,定时扫描数据库的任务时间(毫秒),默认1000
            /// </summary>
            public static int AutoCacheTaskTime
            {
                get
                {
                    return GetAppInt("AutoCacheTaskTime", 1000);
                }
                set
                {
                    SetApp("AutoCacheTaskTime", value.ToString());
                }

            }

2:水平扩张:零编码。

A:单系列数据库伸张到多种类数据库。

B:单机缓存扩充到分布式缓存。

C:单数据库扩充到集群数据库(读写分离)。

统统只要简单追加安顿即可。

总结:

对于这次提拔来了三个便宜:

1:多使用下更简短了,多了一种可选方案。

2:对于喜欢手动修改数据库数据的,或对于框架不可能监督的囤积进程代码,也足以手工或存储进程中更新SysAutoCache表的日子,以便于通告框架更新缓存。

全体而言:

1:自动缓存能将您的应用程序进步一个质料的马上。

2:自动在一些巨型的项目里,应该用的更小巧一些,配置好怎么表不须求缓存,哪些列的换代不影响缓存。

3:请保存系列有丰硕的缓存。

3:数据结构:自由转。

A:Json、Xml、实体类:可互转。

B:泛型、字典、集合,与A类:可互转。

C:数据库表与A类、B类:可互转。

 

深感那样抽象计算后,应该半钟头就足以介绍完重点了,哈〜〜

至于星座十二宫框架:ASP.NET
Aries(白羊)、Taurus.MVC(金牛)、还有在重写中的第三星座Gemini.Workflow(双子)。

该怎么抽象其牵线,要求多多少个早上待我仔细想想〜〜〜

总结:

通过本次思考,意识到四个问题:

1:曾以为好的文章,不须求去告诉用户怎么好,用了当然领会好在哪个地方。

首后天真的纵然了用户率先会用,其次假若了用户会口口相传。

2:曾经以为经验充分就足以Hold住一切,自由发挥。

对此日常出现的题目或气象,与其每趟都随意爆发答案,不如深度的考虑总计出一种较优的永恒答案。

末段,不知底用过框架的小伙伴们是何等感觉?