摘要: 回顾之前的章节,我们大致讲了下缓存的基本概念、原理、策略和常用方法。可能会有朋友会说,访问量小根本不需要缓存,徒增开发的复杂度,访问量大的话本地缓存也没意义。其实这话说的也不无道理,当然我们不能把这句话看成绝对的话,不然什么话都成废话了:),其实我们研究学习的任何技术都不会白学的,每种技术都有他的使用范畴,只是当我们面对新的层次时,需要改变,需要重新学习。我们之前讲的每篇都非常有用,本地缓存也非常有用。不过当我们面临大的数据量和访问量的考研时,就需要使用新的解决方案。今天就讲讲共享缓存那些事。到底什么是共享缓存?为什么要用共享缓存?新的层次就是指当我们仅仅依赖数据库和本地缓存已经无法满足我们的 阅读全文
posted @ 2011-11-01 21:16 君之蘭 阅读(1916) 评论(0) 推荐(0) 编辑
摘要: 我们开发web系统,用户身份验证是最常见不过的。最简单的办法就是定一个基类,基类里面有判断Cookie或Session是否存在,然后决定是否跳转。今天就利用MVC的特性来一个不一样的验证方式。publicclassCustomAuthorizeAttribute:AuthorizeAttribute{protectedoverrideboolAuthorizeCore(HttpContextBasehttpContext){UserIdentity user=WebUtility.GetIdentity(httpContext);if(user!=null){httpContext.User= 阅读全文
posted @ 2011-10-19 10:05 君之蘭 阅读(1604) 评论(5) 推荐(2) 编辑
摘要: Global.aspx.cspublicstaticvoidRegisterGlobalFilters(GlobalFilterCollectionfilters){filters.Add(newCustomHandlerErrorAttribute());}CustomHandlerErrorAttribute.cspublicclassCustomHandlerErrorAttribute:HandleErrorAttribute{publicoverridevoidOnException(ExceptionContextfilterContext){if(filterContext.Ex 阅读全文
posted @ 2011-10-08 11:42 君之蘭 阅读(1495) 评论(1) 推荐(1) 编辑
摘要: 我想朋友们对缓存已经有一个大致的认识了。从一些朋友的评论中,我了解到有些人也是基于理解,对应用来说可能还是有点力不从心。今天我们就实际案例来分析下缓存的具体应用,就拿博客来说吧。先分析下博客的网站的特点:页面简单(结构一致)、多用户、多文章、多评论、访问量大等。页面简单:几乎所有的页面都是头部标题+侧边栏+列表或内容+评论;多用户:每一个博客都是一个用户,所以可以想想每打开一个页面都会去调用博客表的信息;多文章:每一个博客都有多篇文章,用户越多文章就更多,上千万篇文章也很正常;多评论:文章的量已经很大了,评论又怎么会小呢;访问量大:访问量主要看网站是否受欢迎,我们当然是朝着大访问量的目标设计. 阅读全文
posted @ 2011-08-08 17:22 君之蘭 阅读(563) 评论(1) 推荐(0) 编辑
摘要: 缓存二字,从字面上分为两块:“缓”与“存”。上节我们提到的缓存原理,其实是在讲的一个“存”字,如何存取。大致回顾下是key对应的hashcode,根据hashcode作为数组下标来存取,因为存在hash冲突,速度虽达不到O(1),但也是非常之快。今天就说下“缓”的策略。 缓,便意味着“暂时”的意思,过一段时间就不再存在或被替换掉了,所以我们要说的其实是缓存的过期策略。在缓存入门篇中,主要提到了Cache类的Insert的方法,其中的几个变化的参数寓意着各种缓存策略,有具体依赖的有按时间的,一一来看。 按过期时间缓存 这种缓存策略最为简单,只要判断当前时间是否超过了指定的过期时间就remove. 阅读全文
posted @ 2011-08-01 14:48 君之蘭 阅读(671) 评论(0) 推荐(0) 编辑
摘要: 上次我们了解了缓存的基本使用技能,也知道为什么要用缓存,但只是单单谈到了缓存的优势的一点:就是缓存避免的重复性的耗时操作,提高系统性能。其实,如果缓存使用不当,会适得其反。为了避免这种情况的发生,我们更适合了解下缓存的原理。虽然缓存不仅仅是指缓存在内存里的数据,但本节还是以内存为主。 假如说A市有1000万人口,我们要根据某个身份证号码,查出这个人的资料,该如何做呢? 有两种做法: 1、把这些数据录入数据库,然后给 身份证 建立唯一索引,然后查询 身份证 = xxx 的用户 2、遍历所有用户,返回 身份证 = xxx 的数据 第一种是我们最常见的办法,当然也是比较现实的做法,但要依赖与某数据库 阅读全文
posted @ 2011-08-01 14:46 君之蘭 阅读(836) 评论(0) 推荐(0) 编辑
摘要: 昨天在群里有个朋友问,如何使用数据库的临时表。问其原因,原来是他想把查询的结果导出excel,但是苦于查询结果是100个里面随机挑出50个,所以他想把查询结果放在临时表里,导出的时候查询临时表。这个方法不是不可取,其实更好的办法就是把查询的结果DataTable,放到缓存里,导出的时候直接使用就行了。然后群里的同学们都纷纷表明如何使用缓存。本次我们就讲下.Net Framework自带的缓存类,这也算是走进缓存使用的大门了。Web开发中,常用的两个缓存对象是HttpContext.Cache和HttpRuntime.Cache,这两个对象的类型都是System.Web.Caching.Cach 阅读全文
posted @ 2011-08-01 14:45 君之蘭 阅读(807) 评论(0) 推荐(1) 编辑
摘要: 什么是缓存?对于刚入门的朋友来说可能比较模糊,或是只知道是个提高性能的东东。我按我的理解说一下:缓存的目的就是为了提高性能,而把一些数据存放在内存里,方便程序反复使用,所以缓存就是放在内存里的那些数据。那么我们在开发程序时,比如定义了一个静态变量,这个静态变量的值一般都会被一直存放在内存里,这个变量就是缓存了。当然这个缓存的生命周期是第一次被调用直到程序结束。也并非说只有全局的静态变量才叫缓存。比如我们在一个httpRequest接收开始便声明了当前上下文(CurrentContext),那么在整个页面的生命周期里,我们都可以获得当前上下文,那么这个Context也是缓存。 假如我们把... 阅读全文
posted @ 2011-08-01 14:44 君之蘭 阅读(606) 评论(0) 推荐(0) 编辑
摘要: #include <vector>using namespace std;class HeapSort{private: int len; vector<int> list; void SwapNode(int i,int heapSize);public: void Sort(); void Print(); HeapSort(void); ~HeapSort(void);};#include <iostream>#include "HeapSort.h"using namespace std;HeapSort::HeapSort(vo 阅读全文
posted @ 2011-05-21 23:25 君之蘭 阅读(2807) 评论(0) 推荐(0) 编辑
摘要: 乍看这题真够唬人的,群里看到这个题目后争先恐后的说看法。最简单的办法不外乎就是遍历每个数,然后toString() 看看里面有多少个1,最后全部加起来,这是我们得到标准答案的办法。群里算上我3个人写了3个笨方法都跑出来了,3个笨方法,呵呵 有意思,笨方法也不一样。 程序的实现真是变幻莫测。var re = /1{1}/g;var max = 4 * 10000 * 10000;getTotal(f);getTotal(f1);getTotal(f2);function getTotal(func){ var total = 0; var begin = new Date(); for(var 阅读全文
posted @ 2011-04-16 09:18 君之蘭 阅读(1263) 评论(1) 推荐(0) 编辑
摘要: 今天捣鼓了半天的jqGrid,搜索了很多结果看看这家伙怎么用,每个参数的含义,发现也不是很完美。比如本地排序+json绑定,貌似不支持。 虽然以前自己也写过类似的插件,不过自己都懒的维护,还是用jqGrid这样的,也方便项目的维护工作。 做了一个小小的封装,目前只支持json绑定。 用法如下:前端代码:<table id="lst" title="博客多次发表文章审核" multiselect=1> <thead> <tr> <th name="UserName" width="10 阅读全文
posted @ 2011-04-12 15:57 君之蘭 阅读(3098) 评论(2) 推荐(0) 编辑
摘要: 前面三节讲了控件的构造、呈现和数据绑定,我想该差不多了。本想讲一个自定义控件来终结控件部分,但是我个人不太喜欢控件这些东西,所以也就懒的写相关的内容,抱歉了。虽然我不喜欢使用控件,但我还是喜欢整个WebForm的设计。一个字:“太神了”。前面章节将Page生命周期的时候有朋友评论说内容太少了,今天开始就从来围绕生命周期的话,讲讲相关的内容吧。 IHttpModule是个什么东西呢?对我们Web开发有什么用呢? 先从名字来看他是一个接口,接口就是让人来继承的,我们要用它就得继承他,并实现他的方法。Module的意思是模块、组件的意思。如果说我们实现了这个接口,并配置了web.config,让I. 阅读全文
posted @ 2011-04-11 09:16 君之蘭 阅读(5638) 评论(14) 推荐(9) 编辑
摘要: 数据绑定,databind()是多么亲切的方法,我们每天很不能敲上几百遍。但是你有木有想过他是如何实现的?有木有!!!(咆哮体:)今天,我们拿Repeater来说说DataBind那些事儿。如果朋友你有看过我写的模版引擎里Label的初级应用的话,我在最后贴了一个List的Label的实现,其中有点意思的就是模仿Repeater。不过看没看过无所谓的。今天我们看看微软人家正儿八经的Repeater。 一般控件的绑定我们都是在Page_Load事件方法里这么写 if(!IsPostBack) { BindList(); } 而BindList方法就是我们绑定控件用的方法,独立出来的目的是可能多. 阅读全文
posted @ 2011-04-08 09:11 君之蘭 阅读(3647) 评论(3) 推荐(4) 编辑
摘要: 我们搞程序的多多少少都了解点算法。总体来讲,算法是什么?算法就是“时间”和“空间”的互换策略。我们常常考究一个算法的时间复杂度或空间复杂度,如果我们有绝对足够的时间或空间,那么算法就不需要了,可惜这种条件是不存在的,只是在某些情况下相对来说我们不用去考虑其中一个。今天我们讨论的“缓存”,自然就是“用空间换时间”的算法。 缓存就是把一些数据暂时存放于某些地方,可能是内存,也有可能硬盘。总之,目的就... 阅读全文
posted @ 2011-04-05 11:43 君之蘭 阅读(10020) 评论(62) 推荐(35) 编辑
摘要: 这是一个固定长度的双向链表,没有闭合,当然是起初没写成闭合的。怎么缓存的呢? 就是比如 长度是3000,你缓存一篇文章 就放进去一个, 如果你从里面获取一个A,则A被提到链表的头部,再放入一个B,则B在头部,其他的就会靠后排。如果缓存的数量超过的3000,再缓存新的时候会踢掉尾部的那个。因为那个用的次数很少。public class CacheList<T> where T : class { public class Item { public string Key { get; set; } public T Value { get; set; } public Item Le 阅读全文
posted @ 2011-03-24 14:27 君之蘭 阅读(3429) 评论(7) 推荐(5) 编辑