sp1234在CSDN写的Cache精华贴

老大的挥一挥衣袖,又给我们普通程序员带来了春风。

以下是sp1234发的帖子:

仔细模拟一下你的数据库程序,你有没有发现在计算时(特别是多用户计算时)经常重复读取数据库数据?!这是数据库处理程序的性能的最主要的杀手。 

有些人说在写程序之前应该把算法想好,使得数据记录成批地、一次性地读取。但是这实际上往往不可能,因为复杂的程序贴近逻辑流程才清晰可维护。更何况这也 不能解决多用户访问的情况。最好,我们根本不用在写程序时去考虑数据是否会被重复读取从而改变程序流程,但是又能自然而然地防止重复读取数据库。当对计算 过程进行优化,而又不想破坏逻辑清晰性的时候,当然就是要依靠简单的Cache —— 对象只要能够缓存几秒钟就好。

下面我这里写一个世界上最懒惰的程序员使用.net写的一个最简单的Cache,但是它往往可以让复杂的计算程序大大提高计算速度。

using  System;
using  System.Collections.Generic;

namespace  DomainBase
{
     public   class  ObjectCache
    {
         // Dictionary<K,T> 会自动维护一个空链表来保存不用的单元。
         // 这里,使用被缓存对象的“弱引用”,允许这些对象被垃圾回收。

         private  Dictionary < string , WeakReference >  Buffer  =   new  Dictionary < string , WeakReference > ();

         public   object   this [ string  key]
        {
             get
            {
                WeakReference ret;
                 if  (Buffer.TryGetValue(key,  out  ret)  &&  ret.IsAlive)
                     return  ret.Target;
                 else
                     return   null ;
            }
             set
            {
                WeakReference ret;
                 if  (Buffer.TryGetValue(key,  out  ret))
                    ret.Target  =  value;
                 else
                    Buffer.Add(key,  new  WeakReference(value));
            }
        }

         public   void  Remove( string  key)
        {
            Buffer.Remove(key);
        }
    }

}

 这就是最简单的Cache。例如: 

public Class User 

    static ObjectCache Buffer=new ObjectCache(); 

    public static GetUser(string id) 
    { 
      User ret=Buffer[id]; 
      if(ret==null) 
      { 
            ret=读取数据库产生User对象(id); 
            Buffer[id]=ret; 
      } 
      return ret; 
    } 
..... 

这里,在一个Dictionary <K,T>结构字典中保存了对象的key以及对象的“弱引用”。这样,当内存不足时GC会照样去释放被缓存的对象。当我们需要将对象在几秒钟内进行缓存时,使用这个最简单的Cache很有用。 

.net framework中有非常多非常多的东西需要程序员去了解,不要仅仅抱着那些空洞、不实惠的“放之四海而皆准”的大部头的著作,有时间要多读一些实际地 分析 .net framework 系统本身的方面的资料。在每一个技术中都可以找对一两个细节,这个细节就像掌握DNA技术一样能够让你不但扩展原理而且通过动手能力得到巨大实惠。

 

http://www.cnblogs.com/wknight/archive/2008/12/09/1351408.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值