4

我对 AJAX 和缓存的想法很陌生。

AJAX - 从 W3Schools 向服务器发送请求,它说您应该添加"?t=" + Math.random()到要运行的脚本的 URL 的末尾以防止缓存。

在维基百科上,“缓存”的简单定义是:

在计算机科学中,缓存是一种透明存储数据的组件,以便可以更快地处理未来对该数据的请求。存储在缓存中的数据可能是先前计算的值,或者是存储在其他地方的原始值的副本。

但是,这不应该更好吗?如果计算机已经存储了一些重复数据,该脚本将运行得更快。此外,教程页面上的第一个示例,没有添加到 URL,工作正常。

有人可以告诉我使用背后的原因"?t=" + Math.random()吗?

4

3 回答 3

7

但是,这不应该更好吗?

是的,出于性能原因,最好有一个缓存系统,您的应用程序页面将快速加载,因为加载一次的元素将被检索,而无需每次都向服务器发出 HTTP 请求。

有人可以告诉我使用“?t =”+ Math.random()的原因吗?

添加它"?t=" + Math.random()就像每次重新加载脚本时重命名脚本的 URL。缓存系统会将其视为一个新元素,而不是将其视为已存储的旧元素,即使没有真正改变。所以它强制从服务器重新加载元素。

通常,我们可能希望对经常更新的元素(如图像、脚本)执行此操作。例如,用户可以更改网站中的个人资料图片,如果旧图片文件在缓存中,如果我们不使用随机数的技巧,用户将不会立即看到新图片. 用户可能认为他的上传不起作用。他必须在浏览器中手动清空缓存,这并不总是很直观。

第二个原因可能是在我们开发时这样做很好,因为我们不需要每分钟清空缓存,因为我们的代码更改被考虑在内......

但是,不要在您确定不会更改或很少更改的元素上使用此技巧。

于 2013-10-30T23:57:25.830 回答
1

像这样在 Web 服务请求的末尾添加一些随机元素的原因是,在许多情况下,您希望数据始终是最新的。如果您正在缓存它,则数据可能不是新鲜的。

例如,假设您有一个 AJAX 请求,它会为您提供游戏当前的最高分。你用http://example.com/get_high_score.php. 说它返回100。现在,假设您等待 5 秒钟并再次调用它(或者用户刷新他们的页面)。如果该请求被缓存,它可能会100再次返回。不过,在那个时候,分数实际上可能是现在125

如果您调用http://example.com/get_high_score.php?t=12345786,分数将是最新值,因为它没有被缓存。

url + "?t=" + Math.random()只是这样做的一种方法。我实际上更喜欢使用时间戳,因为它保证始终是唯一的。

url + "?t=" + (new Date()).getTime()

另一方面,如果您不需要数据始终是新鲜的(例如,您只是发送一个几乎从不改变的菜单项选项列表),那么缓存是可以的,您会想要省去额外的少量。

于 2013-10-30T23:54:02.193 回答
0

另一种方法是使用时间戳,或者设计一个每隔几秒更改一次的时间戳。尽管最好的方法(如果可以的话)是在服务器响应的标头中添加条目,以告诉浏览器不要缓存结果。

var t = new Date().getTime(); var t2 = Math.floor(t/10000); url = target_url + "?t=" + t2;

尽管在这种情况下不太可能,但请注意,如果您的网站不断生成指向随机内部 URL 的链接,例如通过服务器端代码,那么它就会变成“蜘蛛陷阱”,并且搜索引擎等爬虫会在这些随机链接之后陷入循环导致服务器负载达到峰值。

于 2014-06-10T20:25:32.293 回答