我今年暑假做了一个代码,今天我第一次在我的代码中找到了,而且我对我所做的一件事感到不满。
我的系统是一个具有多种类型(页面,新闻简报等)和多种子类型(项目,存档,概念等)的系统。这个想法现在我有一个像这样的对象:
object { 1: { normal: { 1: { content: 'somecontent', title: 'sometitle' } } } }
另一个例子:
object { 1: { normal: { 1: { content: 'somecontent', title: 'sometitle' } }, archive: {} }, 2: { normal: {} } }
数据最初来自数据库。我正在建立一个系统来编辑网站上的页面和其他信息。因为我有多种类型和子类型。
我做了一个缓存,因为我不希望每次都从数据库中获取所有项目。但现在的问题是,如果我添加一个项目,编辑一个项目并删除一个项目,我必须从缓存/编辑/添加中删除它。
我的问题:这是一个好方法吗?我认为这是因为你不必调用AJAX文件来从数据库中获取数据。
如果我不允许在这里问这个问题,我很抱歉。
答案 0 :(得分:2)
我的问题:这是一个好方法吗?我以为是因为你没有 必须调用AJAX文件才能从数据库中获取数据。
答案是"它取决于"。缓存并不总是正确且总是错误的答案,因为缓存是数据效率和及时性之间的权衡。
如果您希望获得最高效率,则会像疯了一样缓存,但由于您使用了缓存中的旧数据,因此您的数据可能不是最新的。
如果您需要最新的数据,则不要缓存任何内容,以便始终获取最新数据,但如果您经常一遍又一遍地请求相同的数据,效率可能会受到影响。
因此,它是一种权衡,权衡取决于应用程序,它的需求,数据修改的频率以及产生陈旧数据或不缓存的后果。这种权衡没有单一的正确或错误的答案。它完全取决于您的应用程序的特定情况,并且对于某些类型的数据与同一应用程序中的其他数据之间的权衡甚至可能不同。
例如,假设您正在撰写一个提供eBay等功能的在线竞价网站。您可能会很好地缓存项目描述至少几个小时,因为它几乎从未改变,即使它确实如此,看到新项目描述有点拖延的后果相当低。但是,您永远无法将数据缓存在当前出价中,因为该信息的及时性至关重要。用户需要始终查看当前出价的最新信息,即使您必须在效率方面做出一些牺牲。
另外,请记住,缓存并非全部或全部都没有。您可以为缓存值设置生存期,以便它只能用于适合数据类型的特定时间段。例如,您可以在上述拍卖中缓存项目描述最多2小时。这样可以实现一些效率提升,但最终还是可以看到新数据发生变化。
通常,您必须查看显示陈旧数据的后果。如果数据过时甚至过时的后果很高(如实时拍卖中的最新价格),那么您根本无法缓存这些数据。
如果数据过时甚至过时的后果很少,那么您可能会将该值缓存至少几个小时 - 甚至可能更长。
而且,在考虑要缓存的内容时,您显然希望首先查看最需要的项目,并且是要检索的服务器上最昂贵的项目。对服务器上的使用模式进行一些分析可以为您提供优先考虑的缓存候选列表。
答案 1 :(得分:1)
我的问题:这是一个好方法吗?我以为是因为你没有 必须调用AJAX文件才能从数据库中获取数据。
罚款如果
1)您希望为用户提供离线阅读连续性。用户不必等待互联网连接可用,以便他们可以随时阅读。
2)您的数据服务非常繁重,您希望避免多次/频繁访问服务器以反复获取相同的数据。
3)您希望自己的应用与本机包(如phonegap)捆绑在一起,成为混合应用,并为用户提供完整的离线体验。
这不是一个全面的列表,只是为了让您了解何时离线以及何时完全离线
另一方面,如果
,这是一个糟糕的想法1)您的本地存储结构将经常更改,以便用户需要重新安装(除非您可以确定本地存储的自动升级)
2)您的所有功能都是交易功能,也需要与其他用户同步。
答案 2 :(得分:1)
您的方法没有错,只需确保在管理客户端缓存时牢记这些要点
您有一个变量'版本'维护时,只要结构发生任何变化,该版本就会增加,每次发送给客户端,如果服务器版本大于客户端版本,客户端负责版本比较和空客户端缓存。 / p>
您可以实施或查找任何开源来处理您的ajax响应,这可能很有用 - https://github.com/SaneMethod/jquery-ajax-localstorage-cache。
您可以从服务器设置正确的到期标记,这也可以帮助浏览器缓存您的响应,如果它是“获取”#39;请求。
您还可以实现服务器端缓存,它不会调用数据库,它会缓存针对request-url的响应,注意 - 如果不同的用户应该接收不同的响应,则此方法不起作用。如果发生与该特定数据集相关的任何更改,则可以删除缓存 - 删除/更新
在您的情况下,您还可以在服务器上维护标志,该标志只是告知数据是否已更新文章更新的时间,如果存储的版本较旧,您可以提出服务器请求或只使用本地版本。
我希望它有所帮助。