CYQ.Data V5 分布式自动化缓存设计介绍(二)
前言:
最近一段时间,开始了《IT连》创业,所以精力和写的文章多数是在分享创业的过程。
而关于本人三大框架CYQ.Data、Aries、Taurus.MVC的相关文章,基本都很少写了。
但框架的维护升级,还是时不时的在进行中的,这点从开源的Github上的代码提交时间上就可以看出来了。
毕竟《IT连》的后台WebAPI,用的是Taurus.MVC,后台系统管理用的是Aries。
不过今天,就不写创业相关的文章了,先分享篇技术类的文章。
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;
}
}
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", );
}
set
{
SetApp("RedisUseDBCount", value.ToString());
}
}
/// <summary>
/// Redis 使用的DB 索引(默认0,若配置,则会忽略RedisUseDBCount)
/// </summary>
public static int RedisUseDBIndex
{
get
{
return GetAppInt("RedisUseDBIndex", );
}
set
{
SetApp("RedisUseDBIndex", value.ToString());
}
}
/// <summary>
/// Redis 备份服务器(当主服务器挂了后,请求会转向备用机)
/// </summary>
public static string RedisServersBak
{
get
{
return GetApp("RedisServersBak", string.Empty);
}
set
{
SetApp("RedisServersBak", value);
}
}
分布式下缓存的失效策略升级
在多个应用程序时,分布式缓存可以集中控制,固然是一种方案。
但对于单一的服务器来说,开始思考有没有更简单的方案,可以不装MemCache或Redis。
比如《IT连》创业项目的webapi和aries后台是两套程序,同一个服务器下共同操作一个数据库,各自有自动缓存的情况下。
经过思考,最后选择了通过定时扫描表来处理。
方案原理:
每个应用程序,只要配置好数据库链接(配置的数据库可以是任意的):
/// <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两列:
接着框架会有定时扫描,来处理:
public static void AutoCacheKeyTask(object threadID)
{ while (true)//定时扫描数据库
{
int time = AppConfig.Cache.AutoCacheTaskTime;
if (time <= )
{
time = ;
}
Thread.Sleep(time);
if (removeListForKeyTask.Count > )
{
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", );
}
set
{
SetApp("AutoCacheTaskTime", value.ToString());
} }
总结:
对于本次升级来了两个好处:
1:多应用下更简单了,多了一种可选方案。
2:对于喜欢手动修改数据库数据的,或对于框架无法监控的存储过程代码,也可以手工或存储过程中更新SysAutoCache表的时间,以便于通知框架更新缓存。
整体而言:
1:自动缓存能将你的应用程序提升一个质量的飞跃。
2:自动在一些大型的项目里,应该用的更精致一些,配置好哪些表不需要缓存,哪些列的更新不影响缓存。
3:请保存系统有足够的缓存。
CYQ.Data V5 分布式自动化缓存设计介绍(二)的更多相关文章
- CYQ.Data V5 分布式自动化缓存设计介绍
前方: 其实完成这个功能之前,我就在思考:是先把想法写了来,和大伙讨论讨论后再实现,还是实现后再写文论述自己的思维. 忽然脑后传来一个声音说:你发文后会进入发呆阶段. 所以还是静下心,让我轻轻地把代码 ...
- CYQ.Data V5 分布式缓存Redis应用开发及实现算法原理介绍
前言: 自从CYQ.Data框架出了数据库读写分离.分布式缓存MemCache.自动缓存等大功能之后,就进入了频繁的细节打磨优化阶段. 从以下的更新列表就可以看出来了,3个月更新了100条次功能: 3 ...
- CYQ.Data V5 数据库读写分离功能介绍
前言 好多年没写关于此框架的新功能的介绍了,这些年一直在默默地更新,从Nuget上的记录就可以看出来: 这几天在看Java的一些东西,除了觉的Java和.NET的相似度实在太高之外,就是Java太原始 ...
- CYQ.Data V5 分布式缓存MemCached应用开发介绍
前言 今天大伙还在热议关于.NET Core的东西,我只想说一句:在.NET 跨平台叫了这么多年间,其实人们期待的是一个知名的跨平台案例,而不是一堆能跨平台的消息. 好,回头说说框架: 在框架完成数据 ...
- CYQ.Data V5 从入门到放弃ORM系列:框架的优势
前言: 框架开源后,学习使用的人越来越多了,所以我也更加积极的用代码回应了. 在框架完成了:数据库读写分离功能 和 分布式缓存功能 后: 经过三天三夜的不眠不休,终于完成框架第三个重量级的功能:自动化 ...
- CYQ.Data 支持分布式数据库(主从备)高可用及负载调试
前言: 继上一篇,介绍 CYQ.Data 在分布式缓存上支持高可用,详见:CYQ.Data 对于分布式缓存Redis.MemCache高可用的改进及性能测试 本篇介绍 CYQ.Data 在对数据库层面 ...
- CYQ.Data V5 MDataTable 专属篇介绍
前言 以前一两个月才出一篇,这三天有点变态地连续1天1篇(其实都是上周末两天写好的存货). 短期应该没有新的和此框架相关的文章要写了,这应该是最后一篇,大伙且看且珍惜. 前两篇讲数据库读写分离和分布式 ...
- CYQ.Data 对于分布式缓存Redis、MemCache高可用的改进及性能测试
背景: 随着.NET Core 在 Linux 下的热动,相信动不动就要分布式或集群的应用的需求,会慢慢火起来. 所以这段时间一直在研究和思考分布式集群的问题,同时也在思考把几个框架的思维相对提升到这 ...
- 终于等到你:CYQ.Data V5系列 (ORM数据层)最新版本开源了
前言: 不要问我框架为什么从收费授权转到免费开源,人生没有那么多为什么,这些年我开源的东西并不少,虽然这个是最核心的,看淡了就也没什么了. 群里的网友:太平说: 记得一年前你开源另一个项目的时候我就说 ...
随机推荐
- Django models Fild详解
本文参考自:django官方文档models/field 在model中添加字段的格式一般为: field_name = field_type(**field_options) 一 field o ...
- hdu4681 String DP(2013多校第8场)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4681 思路: 我是胡搞过的 就是先预处理出(i,j)的正向的最大连续子串和逆向最大连续子串 然后对于A ...
- linux之vi编辑器的基础命令
1,假如要在这个php文件的phpinfo.php;之后加入一行,我们可以先按键盘的"a",光标就会跳转到之前绿色光标之后,也就是说,"a"是代表在当前光标之后 ...
- linux下MongoDB客户端shell基本操作
MongoDB 是一款NoSql数据库,没有固定的模式,即同一个集合中的不同文档结构可以不同,如:第一条记录{name:”xiaoming”},第二条记录:{name:”xiaoli”,age:15} ...
- JAVA Semaphore详解
Semaphore(信号量):是一种计数器,用来保护一个或者多个共享资源的访问.如果线程要访问一个资源就必须先获得信号量.如果信号量内部计数器大于0,信号量减1,然后允许共享这个资源:否则,如果信号量 ...
- EntityFramework中出现DateTime2异常的完美解决办法
今天在使用entityframework往数据库插入数据的时候,突然出现了一个数据类型转换异常的问题: System.Data.SqlClient.SqlException: 从 datetime2 ...
- SQLite 之 C#版 System.Data.SQLite 使用
简介 SQLite简介 SQLite,是一款轻型的关系型数据库.它的设计目标是嵌入式. 它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 C++.C ...
- 分享一个完整的Mybatis分页解决方案
Mybatis 的物理分页是应用中的一个难点,特别是配合检索和排序功能叠加时更是如此. 我在最近的项目中开发了这个通用分页器,过程中参考了站内不少好文章,阅读源码帮助更大minglisoft.cn/t ...
- Jenkins 发布后自动创建git tag
为了便于项目中对发布的版本进行回滚,所以我们每次发布完成以后自动创建git tag. 1,创建一个Jenkins任务,命名成为push_tag_demo: 2,配置<源码管理>,这里配置比 ...
- [C#] BarcodeLib -- 一个精简而不失优雅的条形码生成库
BarcodeLib -- 一个精简而不失优雅的条形码生成库 引言 在百度进行“C# 条形码”等类似关键字搜索的时候,基本上是使用 ZXing 类库进行条形码的生成.今天我所介绍的是另一款类库 Bar ...