记一次和阿里某总监对话引发的思考,分布式自

作者: 单机游戏资讯  发布:2019-06-17

记一次和阿里某总监对话引发的思考,分布式自动化缓存设计介绍。背景:

前不久和阿里的一个技术总监风动聊的时候,他问了这样一个问题:说说你框架的设计思路和优点?

话说,这个问题,5年前开始就一直经常出现在眼前,可我从没认真为它找出过答案!

记一次和阿里某总监对话引发的思考,分布式自动化缓存设计介绍。于是,夜深深,我躺在床上,用笔记本,一边思考,一边打字,试着找寻!

这些年来,我的框架或作品,都快凑满十二个了,每个单独都可以说上好几天。

记一次和阿里某总监对话引发的思考,分布式自动化缓存设计介绍。记一次和阿里某总监对话引发的思考,分布式自动化缓存设计介绍。但如果时间只有半小时,我要怎么介绍呢?介绍哪些呢?

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

大概是因为近期的精力都在这上面吧的吧(如当年我精力花在Qblog一样吧)。

CYQ.Data 分布式自动缓存

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

记一次和阿里某总监对话引发的思考,分布式自动化缓存设计介绍。在上一篇里,基本情况和思路,已经介绍的很清楚,这里就简单补充2点:

前言:

最近一段时间,开始了《IT连》创业,所以精力和写的文章多数是在分享创业的过程。

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

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

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

不过今天,就不写创业相关的文章了,先分享篇技术类的文章。

记一次和阿里某总监对话引发的思考,分布式自动化缓存设计介绍。说说你框架的设计思路?

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

如果要讲Aries或Taurus,就必须讲CYQ.Data,因为它们都是基于CYQ.Data的存在而存在的。

记一次和阿里某总监对话引发的思考,分布式自动化缓存设计介绍。所以问题就变成回答:说说你CYQ.Data框架的设计思路?

我感觉很难回答这个问题,内心也能感受到一丝抗拒这个问题的想法?

框架是漫长的岁月演进重构而来的,最早期的思路是这样的:

构造一个简单的MDataTable体系,传进一个表名,根据数据库链接拿到表结构,再根据行的列构造出SQL语句执行,把数据读到MDataTable返回。

以上一句概括了最早期的思路,但没有设计,简单并不亮。

如果要说说最新版本的设计思路,我想不到该怎么表达,因为重构的次数太多了,几百上千次了,太多细节,每个细节都独立带有它自己的设计思维。

就像腾迅最早也只是QQ发个消息,现在发展到生态圈,你说人家是怎么设计现在的帝国的?

总结:

对于本次升级来了两个好处:

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

2:对于喜欢手动修改数据库数据的,或对于框架无法监控的存储过程代码,也可以手工或存储过程中更新SysAutoCache表的时间,以便于通知框架更新缓存。

整体而言:

1:自动缓存能将你的应用程序提升一个质量的飞跃。

2:自动在一些大型的项目里,应该用的更精致一些,配置好哪些表不需要缓存,哪些列的更新不影响缓存。

3:请保存系统有足够的缓存。

总结:

对于本次升级来了两个好处:

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

2:对于喜欢手动修改数据库数据的,或对于框架无法监控的存储过程代码,也可以手工或存储过程中更新SysAutoCache表的时间,以便于通知框架更新缓存。

整体而言:

1:自动缓存能将你的应用程序提升一个质量的飞跃。

2:自动在一些大型的项目里,应该用的更精致一些,配置好哪些表不需要缓存,哪些列的更新不影响缓存。

3:请保存系统有足够的缓存。

好吧,设计思路回答不上来,那就讲讲框架有什么亮点吧?

我了个去,又是这个问题,一个在我内心深深留下伤痕的问题。

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

只能忘掉文章,重新思索了:

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);
                }
            }

方案原理:

每个应用程序,只要配置好数据库链接(配置的数据库可以是任意的):

            /// <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和CacheTime两列:

图片 1

接着框架会有定时扫描,来处理:

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

默认是1秒扫一次,你也可以自己配置扫描的间隔时间:

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

本文由bg游戏资讯发布于单机游戏资讯,转载请注明出处:记一次和阿里某总监对话引发的思考,分布式自

关键词: 记录点滴 框架亮点 cyq.data CYQ.Data V5系