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);
其它控制的配置项:
![复制代码](http://common.cnblogs.com/images/copycode.gif)
/// summary /// AutoCache开启时,可以设置不缓存的Table,多个用逗号分隔 /// /summary public static string NoCacheTables return GetApp("NoCacheTables", ""); SetApp("NoCacheTables", value); CYQ.Data.Cache.AutoCache.NoCacheTables = null; /// summary /// AutoCache开启时,可以设置不受更新影响的列名,用Json格式。 /// {talbeName1:column1,column2,talbeName2:column1,column2} /// /summary public static string IngoreCacheColumns return GetApp("IngoreCacheColumns", ""); SetApp("IngoreCacheColumns", value); CYQ.Data.Cache.AutoCache.IngoreCacheColumns = null; }
![复制代码](http://common.cnblogs.com/images/copycode.gif)
对于单一应用程序,框架已经处理的很好。
而对于多个应用程序,框架提供的方案是通过配置启用分布式缓存MemCache或Redis。
相关的配置如下(AppConfig下的都可以对应web.config下的AppSettings项):
![复制代码](http://common.cnblogs.com/images/copycode.gif)
/// summary /// MemCache分布式缓存的服务器配置,多个用逗号(,)分隔 /// /summary public static string MemCacheServers return GetApp("MemCacheServers", string.Empty); SetApp("MemCacheServers", value); /// summary /// MemCache 备份服务器(当主服务器挂了后,请求会转向备用机) /// /summary public static string MemCacheServersBak return GetApp("MemCacheServersBak", string.Empty); SetApp("MemCacheServersBak", value); /// summary /// Redis分布式缓存的服务器配置,多个用逗号(,)分隔 /// /summary public static string RedisServers return GetApp("RedisServers", string.Empty); SetApp("RedisServers", value); /// summary /// Redis 使用的DB数(默认1,使用db0) /// /summary public static int RedisUseDBCount return GetAppInt("RedisUseDBCount", 1); SetApp("RedisUseDBCount", value.ToString()); /// summary /// Redis 使用的DB 索引(默认0,若配置,则会忽略RedisUseDBCount) /// /summary public static int RedisUseDBIndex return GetAppInt("RedisUseDBIndex", 0); SetApp("RedisUseDBIndex", value.ToString()); /// summary /// Redis 备份服务器(当主服务器挂了后,请求会转向备用机) /// /summary public static string RedisServersBak return GetApp("RedisServersBak", string.Empty); SetApp("RedisServersBak", value); }
![复制代码](http://common.cnblogs.com/images/copycode.gif)
在多个应用程序时,分布式缓存可以集中控制,固然是一种方案。
但对于单一的服务器来说,开始思考有没有更简单的方案,可以不装MemCache或Redis。
比如《IT连》创业项目的webapi和aries后台是两套程序,同一个服务器下共同操作一个数据库,各自有自动缓存的情况下。
经过思考,最后选择了通过定时扫描表来处理。
方案原理:每个应用程序,只要配置好数据库链接(配置的数据库可以是任意的):
![复制代码](http://common.cnblogs.com/images/copycode.gif)
/// summary /// CYQ.Data.Cache 自动缓存 - 数据库链接配置 /// 在多个不同的应用项目里操作同一个数据库时(又不想使用分布式缓存MemCache或Redis),可以开启此项,达到缓存智能清除的效果。 /// /summary public static string AutoCacheConn if (_AutoCacheConn == null) _AutoCacheConn = AppConfig.GetConn("AutoCacheConn"); return _AutoCacheConn; _AutoCacheConn = value; }
![复制代码](http://common.cnblogs.com/images/copycode.gif)
接着框架会自动创建一个SysAutoCache表,包含CacheKey和CacheTime两列:
接着框架会有定时扫描,来处理:
![复制代码](http://common.cnblogs.com/images/copycode.gif)
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(); }
![复制代码](http://common.cnblogs.com/images/copycode.gif)
默认是1秒扫一次,你也可以自己配置扫描的间隔时间:
![复制代码](http://common.cnblogs.com/images/copycode.gif)
/// summary /// 当AutoCacheConn开启后,定时扫描数据库的任务时间(毫秒),默认1000 /// /summary public static int AutoCacheTaskTime return GetAppInt("AutoCacheTaskTime", 1000); SetApp("AutoCacheTaskTime", value.ToString()); }
![复制代码](http://common.cnblogs.com/images/copycode.gif)
对于本次升级来了两个好处:
1:多应用下更简单了,多了一种可选方案。
2:对于喜欢手动修改数据库数据的,或对于框架无法监控的存储过程代码,也可以手工或存储过程中更新SysAutoCache表的时间,以便于通知框架更新缓存。
整体而言:
1:自动缓存能将你的应用程序提升一个质量的飞跃。
2:自动在一些大型的项目里,应该用的更精致一些,配置好哪些表不需要缓存,哪些列的更新不影响缓存。
3:请保存系统有足够的缓存。
本文原创发表于博客园,作者为路过秋天,原文链接:http://www.cnblogs.com/cyq1162/p/7080510.html
设计一个缓存策略,动态缓存热点数据 写在前面,因为我们最近的大作业项目需要用到热点排行这个功能,因为我们是要使用Elasticsearch来存储数据,然后最初设想是在ES中实现这个热点排行的功能,但是经过仔细思考,在我们这个项目中使用ES来做热点排行是一个很蠢的方式,因为我们这只是一个很小的排行,所以最终我们还是使用Redis来实现热点排行
如何设计一个缓存函数 在项目中你有优化过自己写过的代码吗?或者在你的项目中,你有用过哪些技巧优化你的代码,比如常用的函数防抖、节流,或者异步懒加载、惰性加载等。
第06篇:Mybatis缓存设计 MyBatis 内置了一个强大的事务性查询缓存机制,它可以非常方便地配置和定制。本篇文章,小编将会在最短的时间呢,通过观察源码来深刻了解Mybatis的 一级二级缓存;然后在说如何定制。
相关文章
- 通过代理模式(包一层),实现对业务增加功能如日志,异常处理,缓存结果,到达不破坏原有的业务代码,扩展了功能
- iOS清除WKWebView缓存
- 【原创】分布式之数据库和缓存双写一致性方案解析(三) 前端面试送命题(二)-callback,promise,generator,async-await JS的进阶技巧 前端面试送命题(一)-JS三座大山 Nodejs的运行原理-科普篇 优化设计提高sql类数据库的性能 简单理解token机制
- 基于.net的分布式系统限流组件 C# DataGridView绑定List对象时,利用BindingList来实现增删查改 .net中ThreadPool与Task的认识总结 C# 排序技术研究与对比 基于.net的通用内存缓存模型组件 Scala学习笔记:重要语法特性
- Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群
- 怎样使用ListView实现一个带有网络请求,解析,分页,缓存的公共的List页面来大大的提高工作效率
- 分布式缓存 Memcached Linux 系统安装
- Redis缓存异常及处理方案总结
- 分布式缓存详解
- 分布式系列教程(03) -分布式Redis缓存(SpringBoot整合Redis)
- 分布式系列教程(02) -分布式Redis缓存(简介&安装&基础)
- memcached&redis等分布式缓存的实现原理
- 使用memoizee缓存函数提升性能,竟引发了indexOf的性能问题
- C++中TCP socket中接收和发送是不同的两个缓存区,接收远程数据时收到的数据都被填入接收缓冲区,什么时候接收什么时候清空,接收一个清空一个类似于队列。
- C# Redis Server分布式缓存编程(二)
- ARP缓存记录种类动态条目和静态条目
- 缓存日志截取字段上传FTP
- 2015第45周五IE11实用开发工具摘录及设置IE缓存
- 用REDIS实现分布式缓存
- 浅析nginx的location匹配规则、history模式、跨域、缓存、反向代理、灰度部署、优雅降级、以目录区分多个history单文件
- 高并发场景下的redis缓存和数据库双写不一致问题分析与解决方案设计
- RDMA高速低延时网络:流动缓存背后的功臣
- webpack高级概念,webpack与浏览器的缓存,打包文件hash命名(系列九)
- EhCache 分布式缓存/缓存集群
- NoHttp封装--04 缓存
- 6种.net分布式缓存解决方式
- iOS开发 - 使用IJKPlayer时,关于需求要边下边播的缓存功能,退回来后播放缓存不再耗流量
- 微服务实践分享(5)缓存中心
- 清除linux缓存命令
- 配置域从DNS服务器以及缓存DNS服务器
- 分布式服务器框架之Server.Common中通过Xml配置渠道、服务器集群、热更新信息代码解析Xml缓存进内存