缓存和池化有什么区别?
答案 0 :(得分:27)
缓存 - 存储常用值,通常是因为查找和/或创建非常重要。例如如果经常使用数据库中的查找表,或者从磁盘上的文件中读取值,则将其保留在内存中并定期刷新它会更有效。
缓存仅管理缓存中的对象生存期,但不会对缓存中保留的内容施加语义。缓存也不会创建项目,只是存储对象。
池 - 用于描述由池本身管理的一组资源的术语。例如(数据库)连接池 - 当需要连接时,它从池中获取,并在完成时返回池中。
池本身处理池化对象的创建和销毁,并管理一次可以创建的对象数。
池通常用于减少开销并限制对资源的访问。您不希望每个servlet请求都打开与数据库的新连接。因为那时您在活动请求和打开连接之间存在1:1的关系。创建破坏这些连接的开销是浪费的,而且您可以轻松地压倒您的数据库。通过使用池,可以共享这些打开的连接。例如,500个活动请求可能只共享5个数据库连接,具体取决于典型请求需要连接的时间长度。
缓存池 - 大多数似乎描述了存在的(独立?)缓存的数量。例如。一个asp.net应用程序每个应用程序域有1个缓存(缓存不在asp.net应用程序之间共享)。字面上是一个缓存池,虽然这个术语似乎很少使用。
答案 1 :(得分:9)
缓存是为了重用而保存一个值/对象 - 通常是为了节省资源。
缓存是一个透明地存储数据的组件,以便可以更快地提供对该数据的未来请求。
轮询类似,你有许多这样的对象(一个池) - 一旦一个对象被从池中取出并被使用,它就会被返回到池中供以后重用。
计算机科学中的一个池是一组初始化资源,可以随时使用,而不是按需分配和销毁。
答案 2 :(得分:3)
缓存通常是指保留数据的静态副本以便快速检索(假设检索或计算值很昂贵)。
池化通常是指保留大量资源以便快速使用(假设创建和/或处置这些资源的成本很高)。
答案 3 :(得分:2)
两者都旨在重用对象。区别通常是有状态的;池是无状态对象的集合,缓存是有状态对象之一。请参阅this explanation。
答案 4 :(得分:1)
重用和减少进程的内存占用(也消除了对象创建开销)。一个值得注意的差异是一个池在你的上下文的生命周期中反复使用相同的对象,在缓存中(至少在LRU中)你驱逐对象为新创建的对象腾出空间。
另一个差异将是以下问题的答案。你想要退回一个特定的对象或任何对象会没事吗?答案清楚地说明了您的需求 - 缓存或池。
答案 5 :(得分:0)
Java代码缓存接口:
public interface Cache { Resource acquire(Identity id)} // implement usually Map
游泳池界面:
public interface Pool { Resource acquire() } // implement usually List
它们用于资源(内存,连接,线程等)的重用。这意味着缓存必须具有身份才能找到,但是池不需要它。因此从池中获取资源是透明的。这个例子很多。内存池,内存缓存,缓冲区缓存池,连接池。