首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >什么是缓存?

什么是缓存?
EN

Stack Overflow用户
提问于 2009-02-14 01:12:39
回答 9查看 38K关注 0票数 73

我经常听说person y有性能问题x,他们通过缓存解决了这个问题。

或者,在程序代码中执行x,y,z操作如何损害您的缓存能力。

即使在最新的播客中,Jeff Atwood也谈到了他们如何缓存某些值以实现快速检索。

“缓存”和“缓存”这两个术语似乎有些含糊不清,这让我对它在不同情况下的含义感到困惑。无论您指的是应用程序或数据库缓存、cpu等,以及这意味着什么。

什么是缓存?缓存有哪些不同的类型?

从上下文中我可以了解它,将经常检索到的值存储到主内存中,并可以快速查找访问它。然而,它到底是什么呢?

这个词似乎在很多不同的上下文中使用,但含义略有不同(cpu、数据库、应用程序等),我真的希望把它弄清楚。

在应用程序中的缓存工作方式与在数据库缓存中的工作方式有区别吗?

当有人说他们发现了一段会损害缓存的代码,在他们修复了它之后,它提高了他们的应用程序的速度,他们在说什么?

程序的缓存是自动完成的吗?你如何允许在你的程序中缓存数值?我经常读到这个网站上的用户说他们在应用程序中缓存了一个值,我坐在这里想知道他们是什么意思。

另外,当有人谈论数据库缓存时,它的真正含义是什么?这仅仅是他们在数据库中打开的一个功能吗?您是否必须显式缓存值,或者数据库是否会为您挑选要缓存的值?

如何开始自己缓存项目以提高性能?

你能给我一些如何开始在我的applications?中缓存值的例子吗?

或者,这是不是已经在幕后完成了,我只需要以一种特殊的方式编写代码来允许“缓存”?

那么数据库缓存呢,我该如何开始呢?我听说过memcache之类的东西。是否需要在数据库中缓存此类型的实用程序?

我希望在应用程序和数据库中的缓存之间有一个很好的区别,它们是如何使用的,以及它们在这两种情况下是如何实现的。

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-02-14 01:30:34

缓存就是在高性能存储(通常是内存)中显式或隐式地存储和检索数据的实践。

让我解释一下。内存的访问速度比文件、远程URL (通常是)、数据库或任何其他您喜欢的外部信息存储都要快。因此,如果使用这些外部资源之一的行为是重大,那么您可能会从缓存中受益,从而提高性能。

Knuth曾经说过过早的优化是万恶之源。据我所知,过早缓存是所有令人头疼的问题的根源。a problem之前,不要解决一个问题。你所做的每一个决定都有一个代价,那就是你现在要付钱去实现它,以后再付钱去改变它,所以你可以推迟决定和改变你的系统的时间越长越好。

因此,首先确定您实际遇到了问题,以及问题出在哪里。性能分析、日志记录和其他形式的性能测试将在这方面为您提供帮助。我再怎么强调这一步的重要性也不为过。我看到人们“优化”不成问题的东西的次数是惊人的。

好的,所以你有一个性能问题。假设您的页面正在运行一个需要很长时间的查询。如果它是一个读取,那么你有很多选择:

  • 将查询作为单独的进程运行,并将结果放入缓存中。所有页面都只是访问缓存。你可以在适当的时候更新缓存的版本(一天一次,一周一次,每5秒一次,通过你的持久化提供者、对象关系映射或其他任何东西透明地更新appropriate);
  • Cache。当然,这取决于您使用的是什么技术。例如,Hibernate和Ibatis支持查询结果caching;
  • Have,如果结果不在缓存中(或者它是“过时的”,意味着它是在指定的“年龄”之前计算的),则页面运行查询并将其放入缓存中。如果两个(或更多)独立的进程都决定需要更新结果,这就会出现并发问题,因此您最终会一次运行相同的(昂贵的)查询8次。您可以处理此锁定缓存的问题,但这会产生另一个性能问题。您还可以在您的语言中使用并发方法(例如Java5并发API)。

如果是更新(或者发生了需要反映在读缓存中的更新),那么就有点复杂了,因为在缓存中使用旧值而在数据库中使用较新的值是不好的,这样会给页面提供不一致的数据视图。但总的来说,有四种方法可以做到这一点:

  • 更新缓存,然后对更新相关存储的请求进行排队;
  • 直写缓存:缓存提供程序可以提供一种机制来持久化更新并阻止调用方,直到做出该更改;

缓存:与直写式缓存相同,但它不会阻止调用方。更新以异步和独立的方式进行;and

  • Persistence即服务模型:这假设您的缓存机制支持某种可观察性(即缓存事件侦听器)。基本上是一个完全独立的进程--调用者不知道--监听缓存更新,并在必要时持久保存它们。

您选择上述哪种方法将在很大程度上取决于您的需求、您正在使用的技术以及一系列其他因素(例如,是否需要集群和故障转移支持?)

如果不知道你的问题的更多细节(比如你有没有问题),就很难更具体地告诉你该怎么做(更多细节)。

票数 60
EN

Stack Overflow用户

发布于 2009-02-14 01:46:53

您很可能会读到有关web应用程序上下文中的缓存的内容。由于Web的性质,缓存可以产生很大的性能差异。

请考虑以下几点:

web页面请求到达web服务器,web服务器将请求传递到应用程序服务器,应用程序服务器执行一些呈现页面的代码,该页面需要转向数据库以动态检索数据。

这种模型不能很好地扩展,因为随着对页面的请求数量的增加,服务器必须对每个请求一遍又一遍地做同样的事情。

如果web服务器、应用程序服务器和数据库位于不同的硬件上,并通过网络相互通信,则这将成为一个更大的问题。

如果您有大量用户访问此页面,则不必针对每个请求一直访问数据库是有意义的。相反,您可以求助于不同级别的缓存。

结果集缓存

结果集缓存将数据库查询的结果与查询一起存储在应用程序中。每次网页生成查询时,应用程序都会检查结果是否已缓存,如果缓存,则从内存中的数据集中提取结果。应用程序仍然需要呈现页面。

组件缓存

一个网页由不同的组件组成-- pagelets,或者你想叫它们的任何东西。组件缓存策略必须知道使用了哪些参数来请求组件。例如,网站上的一个小“最新新闻”栏使用用户的地理位置或偏好来显示当地新闻。因此,如果缓存了某个位置的新闻,则不需要呈现该组件,可以从缓存中提取该组件。

页面缓存

缓存整个页面的一种策略是将查询字符串和/或标题参数与完全呈现的HTML一起存储。文件系统已经足够快了--对于web服务器来说,读取文件仍然比调用应用服务器来渲染页面要便宜得多。在这种情况下,发送相同查询字符串的每个用户都将获得相同的缓存内容。

智能地组合这些缓存策略是为大量并发用户创建真正可伸缩的web应用程序的唯一方法。正如您很容易看到的,这里的潜在风险是,如果缓存中的一段内容不能通过其键唯一地标识,人们将开始看到错误的内容。这可能会变得非常复杂,特别是当用户有会话并且有安全上下文的时候。

票数 14
EN

Stack Overflow用户

发布于 2009-02-14 01:31:12

据我所知有两种含义。

一种是应用程序缓存。这种情况下,如果数据从某处(例如,通过网络)获取或计算缓慢,则应用程序缓存数据的副本(这样它就不需要再次获取或重新计算:它已经缓存了)。实现缓存需要一些额外的应用程序软件(使用缓存的逻辑)和额外的内存(用于存储缓存的数据)。

这就是你在这里引用的“缓存”:

从上下文中我可以了解它,将经常检索到的值存储到主内存中,并可以快速查找访问它。

另一种是CPU缓存,它在this Wikipedia article中进行了描述。CPU缓存是自动发生的。如果您从少量内存中进行大量读取,那么CPU可以从其缓存中执行大部分读取操作。OTOH如果你从大量的内存中读取,它不能全部放入缓存中,CPU必须花更多的时间来处理较慢的内存。

这就是你在这里引用的“缓存”:

当有人说他们发现了一段会损害缓存的代码,在他们修复了它之后,它提高了他们的应用程序的速度,他们在说什么?

这意味着他们找到了一种重新排列代码的方法,以减少Cache misses

至于数据库缓存,我不知道。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/548301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档