摘要: 上周将本地缓存切换到远程缓存后,导致系统运行缓慢,经分析是一个页面反复读取缓存数据。Reveiw代码,发现是开发人员对缓存调用不够规范,导致循环调用缓存。代码遍布整个项目,修复成本较高,只能从底层的缓存框架解决。经构思,觉得在远程缓存基础上增加本地缓存,默认本地缓存超时6秒,这样基本解决一次请求,相同的缓存反复请求远程缓存问题,修改如下:1、请求缓存的时候,先请求本地缓存,如没有请求远程,远程有数据的时候,再本地缓存一份备份2、设置缓存的时候,同时设置本地和远程缓存3、省略本地缓存和远程缓存同步(因本地缓存设置过期时间非常短,只为了减少并发请求远程缓存,一般3-5秒左右)缓存接口: //... 阅读全文
posted @ 2013-09-23 01:26 gzkeo 阅读(1794) 评论(2) 推荐(1) 编辑
摘要: 闲着无聊,测试了一下公司ORM的性能,和其它的ORM相比,该有的都有了,不该有的也勉强塞了进去,总体考虑是并发与扩展性问题,譬如读写分离,消息总线服务整合,缓存内置。测试机是I7,16G内存,这里只根据测试场景写了最简单的数据库操作测试。采用了火地晋的测试工具,下面是测试代码 1 public class DataTest :ITest 2 { 3 4 public void Init() 5 { 6 } 7 8 public bool Insert() 9 {10 va... 阅读全文
posted @ 2013-09-15 00:52 gzkeo 阅读(563) 评论(1) 推荐(0) 编辑
摘要: 接一的考虑,那么就做Redis的SessionProvider就非常简单了,只考虑整个Session的缓存,主要实现以下两个函数就可以了 1 public override SessionStateStoreData GetItem(System.Web.HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) 2 { 3 OpenRedis(); 4 ... 阅读全文
posted @ 2013-09-14 21:28 gzkeo 阅读(1117) 评论(0) 推荐(0) 编辑
摘要: CustomerSessionProvider需要实现SessionStateStoreProviderBase在设计Redis Session Provider的时候,需要考虑1、是否每个用户的SessionStateStoreData存储为一个key,如果一个用户存储在Session里面的变量非常多,这样每次返回的对象还是比较大,网络消耗比较大2、Session是否需要加锁3、SessionId的格式初步考虑1、Session一般不放置太多的对象,所以一个用户(SessionId)对应一个Key还是可以接受的2、Session一般是连续访问,并发的情况非常少,可以忽略加锁的问题3、Sess 阅读全文
posted @ 2013-09-14 13:00 gzkeo 阅读(425) 评论(0) 推荐(0) 编辑
摘要: MVC的结构非常棒,基本你能想到注入的地方都可以找到地方,譬如IActionFilter,IResultFilter,IAuthorizationFilter以及IExceptionFilter以下是测试过比较好的通用异常处理public virtual void OnException(ExceptionContext filterContext) { if (filterContext.IsChildAction) return; if (filterContext.ExceptionHandled |... 阅读全文
posted @ 2013-09-14 08:08 gzkeo 阅读(262) 评论(0) 推荐(0) 编辑
摘要: 在MVC中,需要对某些页面进行静态化,用ActionFilter来做静态化,把页面存到缓存中。如下代码所示,其中Result.RenderString是扩展方法,第一次缓存的时候,Action代码会运行两次,其中一次是RenderString这个方法重复调用Action的Render,待改善不采用IResultFilter是因为需要跳过Action的执行过程 /// /// 页面缓存 /// /// 缓存过期时间 /// 缓存器名称 public ResultCachingAttribute(int expi... 阅读全文
posted @ 2013-09-13 16:35 gzkeo 阅读(330) 评论(0) 推荐(0) 编辑
摘要: Dotliquid是不错的Template Engine,为了更方便使用,扩展了一下,使它支持json数据的替换,引用了Newtonsoft.Json.Linq /// /// 从JObject创建模板变量 /// /// /// protected Hash FromJson(JObject jsonObject) { if (jsonObject == null) return null; var hash = new Hash(); ... 阅读全文
posted @ 2013-09-01 15:13 gzkeo 阅读(675) 评论(0) 推荐(0) 编辑