缓存和池化的区别是什么?

25
什么是缓存和连接池之间的区别?
6个回答

31

缓存 - 存储经常使用的值,通常是因为查找和/或创建不容易。例如,如果从数据库中频繁使用查找表,或者从磁盘上的文件读取值,则将其保留在内存中并定期刷新会更有效率。

缓存仅管理缓存中对象的生命周期,但不对缓存中保存的内容强制执行语义。缓存也不创建项目,而只是存储对象。

池 - 描述由池本身管理的一组资源的术语。例如(数据库)连接池 - 当需要连接时,它是从池中获取的,完成后则返回到池中。

池本身处理池化对象的创建和销毁,并管理任何时候可以创建多少个对象。

通常使用池来减少开销并限制对资源的访问。您不希望每个servlet请求都打开一个新的数据库连接。因为那样就有了活动请求和打开连接之间的1:1关系。创建和销毁这些连接的开销是浪费的,而且您可能会轻易地使数据库超负荷。通过使用池,这些打开的连接可以共享。例如,500个活动请求可能共享仅5个数据库连接,具体取决于典型请求需要连接的时间。

缓存池 - 主要似乎描述存在的(独立的?)缓存数量。例如,asp.net应用程序每个应用程序域具有1个缓存(缓存不在asp.net应用程序之间共享)。字面上是缓存池,尽管这个术语似乎很少使用。


9
缓存是为了重复使用而保存一个值/对象 - 通常是为了节省资源。 维基百科说:

缓存是一种组件,它透明地存储数据,以便未来对该数据的请求可以更快地服务。

轮询类似于缓存,其中您有许多这样的对象(池) - 一旦从池中取出并使用了一个对象,就会将其返回到池中以供以后重用。 维基百科说:

在计算机科学中,池是一组初始化的资源,这些资源已准备好使用,而不是按需分配和销毁。


6

两者都旨在实现对象的重用。它们的区别通常是根据状态来划分;池是无状态对象的集合,缓存是有状态对象的集合。详见此解释


2
缓存通常指保留数据的静态副本以便快速检索(假设检索或计算该值的成本很高)。
池化通常指保留一定数量的资源以便快速使用(假设创建和/或处理这些资源的成本很高)。

1
我认为@Haakon的回答最好地区分了缓存和池之间的差异。有状态或无状态。例如,缓存中的值可能会在数据库中更新其实际值,从而使缓存的值过时。而池化对象则不会面临这种情况。 - user1561783

2

使用池既可以重用内存,也可以减少进程的内存占用(同时消除对象创建开销)。值得一提的是,池在上下文的生命周期内反复使用相同的对象,而缓存(至少在LRU中)则会驱逐对象以为新创建的对象腾出空间。

另一个区别是回答以下问题。您想要返回特定对象还是任何对象都可以?答案明确了您需要什么 - 缓存或池。


0
Java 代码缓存接口:
public interface Cache { Resource acquire(Identity id)}  // implement usually Map

连接池接口:

public interface Pool { Resource acquire() }  // implement usually List

它们用于资源(内存、连接、线程等)的重复使用。这意味着缓存必须具有标识以便查找,但池不需要。因此,从池中获取资源是透明的。例如:内存池、内存缓存、缓冲区缓存池、连接池。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接