社区文档构建中,欢迎编辑。 社区答疑群(非官方):717421103,点点小课堂(腾讯会议):5696651544

全站通知:

缓存

阅读

    

2024-04-27更新

    

最新编辑:Lu_23333

阅读:

  

更新日期:2024-04-27

  

最新编辑:Lu_23333

来自WIKI实验室WIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索
页面贡献者 :
Lu_23333

缓存能加快页面加载,提升用户体验。BWiki使用了多种缓存机制,这主要包括:页面缓存、资源缓存和针对URL的缓存。

下文将简述BWiki平台的缓存特性,缓存策略可能随平台优化变化,请以实际表现为准。要了解技术细节,请参考MW官方Manual:Cache

页面缓存

内容页面缓存能让用户更快访问页面。

CDN缓存

页面生成的HTML会被CDN(Content delivery network,内容分发网络)服务缓存。

未登录用户的缓存时间较长,无法主动刷新。

登录用户的缓存时间非常短。极端情况下会遇到客户端“串缓存”(RLCONF信息如小组件配置是其他用户的),但不影响使用。

Mediawiki缓存

Wiki系统会缓存解析器的解析结果,缓存时间可达数天。

只有在修改页面或手动刷新时,缓存才会提前更新。


例子:日期彩蛋

假设现有页面A,使用了解析函数 time 获取当前星期,如果今天是星期四,则显示彩蛋。然而,星期四访问页面时没有显示彩蛋。

因为访问页面A时会优先使用缓存内容,缓存不会每天刷新(有效期数天)。


例子:模板缓存

假设现有页面A,使用了模板B。修改模板B后,访问页面A,发现A没有变化

因为A的缓存是基于旧的B建立的。此时刷新页面A的即可显示最新内容。

用户访问页面时发生了什么?

  • 浏览器会优先使用自身缓存(此步骤与BWiki无关);
  • BWiki优先提供CDN缓存内容。离用户最近的CDN服务器仅需几毫秒就能响应用户请求(而不是等待延迟更高的远端服务器);
  • 如果没有CDN缓存,Wiki系统将尝试提供其缓存(解析器缓存)。这能手动刷新(purge)或通过空编辑刷新;
  • 如果没有缓存,Wiki系统将尝试重新构建这个页面,这需要从数据库获取数据(仍会使用其他页面/模板/SMW的缓存数据,并使用数据库缓存);
  • 这些(被过度简化描述的)步骤通常会在200毫秒内完成。如果用户请求成功命中某层缓存,其等待时间将大大缩短,同时降低服务器负载;
  • 浏览器收到页面HTML后,会开始解析、请求资源并显示给用户。

资源缓存

BWiki缓存的资源文件包括CSS、JavaScript和多媒体文件(图片、音频和视频等)。

多媒体文件

多媒体文件变更后,缓存会立即更新。

代码文件

CSS、JS文件变更后,缓存更新时间约30分钟(通常会更快)。

因此,很多BWiki的界面管理员会尝试若干“绕过缓存”的方法来实时测试更改(见下文)。

URL缓存

部分HTTP Get请求会被基于URL建立缓存,如对index.phpload.php的Get请求。

一些使用方式在底层触发了上述机制,如:

这些缓存与代码文件的缓存刷新时间一致,约30分钟。

因此,分享带有curid的“短链接”时,需要注意用户可能会访问到近期的缓存内容。

刷新和绕过缓存

刷新缓存

首先检查登录状态,因为未登录用户会优先显示无法绕过、刷新的缓存。

然后,判断需要刷新哪些缓存(修改了CSS、JS后,只能等待约30分钟等待缓存自动刷新。)

刷新页面: wiki功能 - 刷新

如修改模板后,不会触发引用此模板的页面刷新缓存。这需要最多数天时间自动刷新。此时如果需要尽快展示最新版本,可以手动刷新:

  • 页面右上方的菜单:Wiki功能 - 刷新,如右图所示。
  • 在页面后方增加参数action,值为purge。如?action=purge,对于本页面为:wiki.biligame.com/tools/缓存?action=purge
  • 空编辑,即编辑页面,在不更改的情况下保存页面。
  • API刷新,通过调用API的方式刷新缓存或进行空编辑来刷新页面。
  • 其他非通用方式。一些widget允许你批量刷新。部分Wiki在导航栏提供的页面操作-刷新页面,或部分油猴脚本提供的刷新功能(这些刷新功能是自动调用上述方法之一)。
    • Widget:刷新 刷新指定的多个页面(以英文逗号或顿号分隔)
    • MediaWiki:Bikit.js 中的 Bikit.fixs.purgeCategory 为分类页面增加批量刷新按钮
    • 刷新链入页面 提供了JS和Python代码。
    • BwikiBatchEditor小部件提供的额外工具栏中,包括刷新当前页面的功能,仅支持在安装此小部件的wiki使用。
    • BWiki工具列表。这个油猴脚本在所有BWiki站点增加额外工具栏,包括刷新当前页面的功能。
    • BWiki快捷菜单栏。这个油猴脚本让BWiki的功能菜单栏始终居右显示

绕过缓存

警告:让所有用户绕过缓存会极大增加服务器负载,浪费公共资源。

加载额外JS、CSS时,通常使用如mw.loader.load("/tools/MediaWiki:Demo.js?action=raw&ctype=text/javascript", "text/javascript");等写法。

如果为资源URL增加随机数,则可以“绕开”缓存,如mw.loader.load("/tools/MediaWiki:Demo.js?action=raw&ctype=text/javascript&rand="+Math.random(), "text/javascript");

这可以用于在开发期间手动在控制台加载额外的JS进行测试,也可以在Common.js中绕开缓存加载资源。


需要注意的是,绝不建议在Common.js、小组件JS中直接使用带随机数的加载方式。

推荐在需要时,使用mw.config.values.wgUserGroups变量检查用户权限,或用户bid来限制范围。(在mw生命周期早期,mw.config内容不完整时,用户权限可以用RLCONF.wgUserGroups替代。要获取用户名,除了mw变量,还可以使用主站api:line3-h5-pc-api.biligame.com/game/user/myinfo获取当前用户的bid和昵称)

相关资料

其他wiki农场关于缓存的文档。