今天先来说缓存的问题,对于数据缓存就我自己来说经历过很多次的反复,不过在.NET社区很多人都支持按需读取的原则,不过我觉的这是个误区,在单击程序的时候由于个人电脑的内存比较小和多用途性,很多程序都强调尽量少占用内存。不过在写服务程序的时候就是一个误区了,把常用数据缓存起来,在需要的时候快速调用才是提高性能的法宝,现在个人电脑的内存都按G算的年代,如何合理充分利用内存才是正途。
所以我们决定要在我们的demo orm中实现一个缓存,缓存什么呢?,insert语句的执行结果显然是不用了,我们只需要缓存每一次select的结果。并且由于.NET的Cache对象的局限性(只能在Web用),我们只有自己来实现一个。
其实设计上并不困难,我们之前在对配置的处理上其实已经用到了缓存的,我们只需要对其作一下修改,首先基础结构还是静态的HashTable,不过需要先确定以下用什么做Key,value好说,HashTable的Value就是个object,所以存个IList也行,int也行,一个对象也行,所以对于Select的结果来说还是很合适的。
主要就是确定Key的问题
我们这里确定一个前提就是,数据如果不变的情况下,那么如果Sql语句一样的话,select的结果应该都是一样的,那么我们直接用Sql语句来做Key。但是有的SQl是带变量的,比如select XX from TT where ID=@ID,
这个时候我们把Sql处理处理,用值把@ID Replace掉就行了:}
但是还有一个问题,如果有表被Insert了数据,或者update了数据,或者Delete了数据,那么之后Select出来的不就变了?确实,所以我们在做了这些操作后就要判断哪些缓存项是需要刷新的了。这个时候我们需要Key里面包含表的信息,虽然可以直接分析Sql获取,不过加大了成本,所以我们在生成Key的时候就把这条SQL涉及的表用[Tablename]的方式加在Key的最前面。
最后我们来看看代码:
说了半天其实代码也不多,有的时候觉得很复杂的其实就这么简单。
不过这种Cache比较局限的就是可能Cache冗余的数据
to be continue......