zoukankan      html  css  js  c++  java
  • sp1234在CSDN写的Cache精华贴

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

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

  • 相关阅读:
    Python学习 之 文件
    Python学习 之 对内存的使用(浅拷贝和深拷贝)
    Python学习 之 爬虫
    Python学习 之 正则表达式
    为何现在的网页广告都是有关你搜索或者购买过的商品 2015-08-22 22:06 1534人阅读 评论(35) 收藏
    Junit使用注意点
    用递归方式在JSON中查找对象
    利用StringBuffer来替换内容
    使用ant时 出现 java.lang.OutOfMemoryErro r: Java heap space的解决办法
    python-re使用举例
  • 原文地址:https://www.cnblogs.com/neekerss/p/1921664.html
Copyright © 2011-2022 走看看