3 Answers

单例模式是OO设计层面的东西,说它是“缓存”,不如说它是类的一个实例在一个进程内的永久存储,因为它不会过期、不会被重建,而且单例模式很少用于维护很多状态属性的类(比如实体类),更多的是用于无状态属性或者状态属性全局必须一致的情况。
而相对于单例模式,通常意义上的缓存是为了加快数据访问而采取的一种介于业务对象和持久化数据间的缓冲处理手段,缓存的数据有可能是业务对象实例,也可能是对象的序列化结果。我们一般会把缓存定义为不可信的,它随时可以根据自己的机制将数据销毁(过期或LRU),而当缓存读取失败时再取读取持久化数据并重建缓存。缓存有多种方式——文件、内存、分布式等等。
我们可以看到单例模式和缓存的相同点并不多,在OO设计层面,与缓存更加类似的是对象池(比如数据库连接池、线程池等等)技术,同理,其区别在于一个用于加快持久化数据的访问,一个用于避免对象的重复创建。
当然,我们也完全可以把单例模式和对象池技术看做“缓存”的一种特例。

2010-11-13 06:18:08

cache缓存可以实现分布式的部署,cache可以放到本地,也可以放到别的服,使用灵活,支持的软件很多。

单件模式的缓存是需要有运行系统支持的,比如php就不能实现全局的单例,另外单件模式的缓存一般只能跑在一个应用里,共享起来非常麻烦

2010-11-13 07:46:52

以下纯属个人看法

做一般点的静态小站
可以考虑用google开源的一个pagespeed是Apache module

如果不用这玩意,
还可以考虑apache和nginx里边的mod,也有内存和文件的cache

如果分布式的话squid和memcache,也可以做这类功能

如果更有钱,据说F5之类的也可以做负载和cache

纯属愚见,见笑了:)

2010-11-13 09:06:17
您不能回答该问题或者回答已经关闭!

相关文章推荐

  • C#中using指令的几种用法

    using + 命名空间名字,这样可以在程序中直接用命令空间中的类型,而不必指定类型的详细命名空间,类似于Java的import,这个功能也是最常用的,几乎每个cs的程序都会用到

  • C#实例解析适配器设计模式

    将一个类的接口变成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够一起工作

  • C#开发高性能Log Help类设计开发

    项目中要在操作数据库的异常处理中加入写Log日志,对于商业上有要求,写log时对其它操作尽可能影响小,不能因为加入log导致耗时太多

  • 使用托管C++粘合C#和C++代码(二)

    本文实现一下C++代码调用C#代码的过程。我构造一个简单并且直观的例子:通过C++ UI 触发C# UI.

  • C#开发中的反射机制

    反射的定义:审查元数据并收集关于它的类型信息的能力。元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等

  • Async和Await使异步编程更简单

    C#5.0中async和await两个关键字,这两个关键字简化了异步编程,之所以简化了,还是因为编译器给我们做了更多的工作

  • C#运行时相互关系

    C#运行时相互关系,包括运行时类型、对象、线程栈和托管堆之间的相互关系,静态方法、实例方法和虚方法的区别等等

  • C#协变和逆变

    “协变”是指能够使用与原始指定的派生类型相比,派生程度更大的类型,“逆变”则是指能够使用派生程度更小的类型

  • C#基础概念之延迟加载

    延迟加载(lazy load)是Hibernate3关联关系对象默认的加载方式,延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作

  • C#中的索引器的简单理解和用法

    C#中的类成员可以是任意类型,包括数组和集合。当一个类包含了数组和集合成员时,索引器将大大简化对数组或集合成员的存取操作

  • 使用托管C++粘合C#和C++代码(一)

    C#在xml读写,数据库操纵,界面构造等很多方面性能卓越;C++的效率高,是底层开发的必备武器

  • 深入C# 序列化(Serialize)、反序列化(Deserialize)

    C#中的序列化和反序列化,序列化是.NET运行时环境用来支持用户定义类型的流化的机制