缓存 - 存储经常使用的值,通常是因为查找和/或创建不容易。例如,如果从数据库中频繁使用查找表,或者从磁盘上的文件读取值,则将其保留在内存中并定期刷新会更有效率。
缓存仅管理缓存中对象的生命周期,但不对缓存中保存的内容强制执行语义。缓存也不创建项目,而只是存储对象。
池 - 描述由池本身管理的一组资源的术语。例如(数据库)连接池 - 当需要连接时,它是从池中获取的,完成后则返回到池中。
池本身处理池化对象的创建和销毁,并管理任何时候可以创建多少个对象。
通常使用池来减少开销并限制对资源的访问。您不希望每个servlet请求都打开一个新的数据库连接。因为那样就有了活动请求和打开连接之间的1:1关系。创建和销毁这些连接的开销是浪费的,而且您可能会轻易地使数据库超负荷。通过使用池,这些打开的连接可以共享。例如,500个活动请求可能共享仅5个数据库连接,具体取决于典型请求需要连接的时间。
缓存池 - 主要似乎描述存在的(独立的?)缓存数量。例如,asp.net应用程序每个应用程序域具有1个缓存(缓存不在asp.net应用程序之间共享)。字面上是缓存池,尽管这个术语似乎很少使用。
使用池既可以重用内存,也可以减少进程的内存占用(同时消除对象创建开销)。值得一提的是,池在上下文的生命周期内反复使用相同的对象,而缓存(至少在LRU中)则会驱逐对象以为新创建的对象腾出空间。
另一个区别是回答以下问题。您想要返回特定对象还是任何对象都可以?答案明确了您需要什么 - 缓存或池。
public interface Cache { Resource acquire(Identity id)} // implement usually Map
连接池接口:
public interface Pool { Resource acquire() } // implement usually List
它们用于资源(内存、连接、线程等)的重复使用。这意味着缓存必须具有标识以便查找,但池不需要。因此,从池中获取资源是透明的。例如:内存池、内存缓存、缓冲区缓存池、连接池。