Jump to content

对象缓存

From mediawiki.org
This page is a translated version of the page Object cache and the translation is 45% complete.
Outdated translations are marked like this.

MediaWiki在多个组件和多个层中使用缓存。 本页记录了我们在MediaWiki PHP应用程序中使用的各种缓存。

概述

MediaWiki中的对象缓存描述了两种存储:

  1. 缓存。存储计算结果或从外部源获取的数据的地方(用于更高的访问速度)。 这是计算机科学定义中的“缓存”。
  2. 贮存。一个存储轻量级数据的地方,而不是存储在其他地方。 也称为藏匿(或“囤积”物品)。 这些值不可能(或不允许)按需重新计算。

术语

如果程序能够验证该值是否过期,则称缓存密钥为“可验证”。

当一个密钥只能有一个可能的值时(例如计算π的第100位),这适用于可以缓存在密钥math_pi_digit:100下的情况。 结果可以安全地存储在高速访问存储中,无需协调,因为它永远不需要更新或清除。 如果它从缓存中过期,可以重新计算并产生相同的结果。 这同样适用于将某个版本的Wikitext存储到页面。 版本123已经被创建,并且将始终包含相同的内容。 如果程序知道它正在查找的修订ID,那么像revision_content:123这样的缓存密钥也可以是可验证的缓存密钥。

存储结构化数据


MediaWikiboolintstring stdClassPHPT161647使T264257



(一)使


(二)



 WANObjectCache::getWithSet使

  JSON BagOStuffWANObjectCache MediaWikiJsonUnserializableMediaWiki1.36

服务设施

这些是MediaWiki功能可用的抽象存储,请参见用途部分了解示例。

本地服务器


MediaWikiServices->getLocalServerObjectCache()访



<0.1ms

webRAM使php-apcu

webphp-apcu MediaWikiAPCuWinCache

本地集群

警告 警告: 主要用于内部使用,以在给定数据中心内提供有限的行动协调。 这使用与WAN缓存相同的存储后端,但在不同的密钥命名空间下,并且没有向其他数据中心广播清除的能力。

Memcached使

MediaWikiServices->getObjectCacheFactory()->getLocalClusterInstance()访

$wgMainCacheType

~1ms

WAN缓存


MediaWikiServices->getMainWANObjectCache()访

$wgMainWANCache$wgMainCacheType

~1ms

使Memcached 广使 WANObjectCache使

getWithSet 使使

wikitech.wikimedia.orgWANObjectCache

MicroStash

  • Accessed through MediaWikiServices->getMicroStash().
  • Configurable: Yes, via $wgMicroStashType , which defaults to CACHE_ANYTHING.
  • Behaviour: fast (~1ms, from service memory), medium capacity, shared between application servers, with invalidation done via TTL. Data stored will only be evicted only when the TTL expires regardless of if or not the data gets used.

Values in this store are stored centrally in the primary data centre (typically using Memcached as backend). Values are not replicated to other data centers, and data gets evicted only when the time to live (TTL) elapses.

主仓库


MediaWikiServices->getMainObjectStash()访

$wgMainStash

1-10ms

使 MySQL  (See wikitech:MariaDB#x2 for Wikipedia's configuration.) 使objectcache 贿

MainStash

使用

Session store

  • Accessed via Session objects, which itself is accessed via SessionManager, or RequestContext->getRequest()->getSession()
  • Configured via $wgSessionCacheType .

This is not really a cache, in the sense that the data is not stored elsewhere.

Interwiki cache

See Interwiki cache for details, and also ClearInterwikiCache.php.

Parser cache

  • Accessed via the ParserCache class.
  • Backend configured by $wgParserCacheType (typically MySQL).
  • Keys are canonical by page ID and populated when a page is parsed.
  • Revision ID is verified on retrieval.

See Manual:Parser cache for details. See also purgeParserCache.php.

Message cache

Revision text

  • Accessed via SqlBlobStore::getBlob.
  • Stored in the WAN cache, using key class SqlBlobStore-blob.
  • Keys are verifiable and values immutable. Cache is populated on demand.

Background

The main use case for caching revision text (as opposed to fetching directly from the text table or External Storage) is for handling cases where the text of many different pages is needed by a single web request.

This is primarily used by:

  • Parsing wikitext. When parsing a given wiki page, the Parser needs the source of the current page, but also recursively needs the source of all transcluded template pages (and Lua module pages). It is not unusual for a popular article to indirectly transclude over 300 such pages. The use of Memcached saves time when saving edits and rendering page views.
  • MessageCache. This is a wiki-specific layer on top of LocalisationCache, which consists primarily of message overrides from "MediaWiki:"-namespace pages on the given wiki. When building this blob, the source text of many different pages needs to be fetched. This is cached per-cluster in Memcached, and locally per-server (to reduce Memcached bandwidth ; r11678, commit 6d82fa2).

Example

Key WANCache:v:global:SqlBlobStore-blob:<wiki>:<content address>.

"content address" refers to the content.content_address on the wiki's main database (e.g. "tt:1123"). This in turn refers to the text table or (External Storage).

To reverse engineer which page/revision this relates to, Find content.content_id for the content address (SELECT content_id FROM content WHERE content_address = "tt:963546992";), then find the revision ID for that content slot (SELECT slot_revision_id FROM slots WHERE slot_content_id = 943285896;).

The revision ID can then be used on-wiki in a url like https://en.wikipedia.org/w/index.php?oldid=951705319, or you can look it up in the revision and page tables.

Revision meta data

  • Accessed via RevisionStore::getKnownCurrentRevision.
  • Stored in the WAN cache, using key class revision-row-1.29.
  • Keys are verifiable (by page and revision ID) and values immutable. Cache is populated on demand.

MessageBlobStore

Stores interface text used by ResourceLoader modules. It is similar to LocalisationCache, but includes the wiki-specific overrides. (LocalisationCache is wiki-agnostic). These overrides come from the database as wiki pages in the MediaWiki-namespace.

  • Accessed via MessageBlobStore.
  • Stored in the WAN cache, using key class MessageBlobStore.
  • Keys are verifiable (by ResourceLoader module name and hash of message keys). Values are mutable and expire after a week. Cache populated on demand.
  • All keys are purged when LocalisationCache is rebuild. When a user save a change to a MediaWiki-namespace page on the wiki, a subset of the keys are also purged.

Minification cache

ResourceLoader caches the minified versions of raw JavaScript and CSS input files.

  • Accessed via ResourceLoader::filter.
  • Stored locally on the server (APCu).
  • Keys are verifiable (deterministic value). No purge strategy needed. Cache populated on demand.

LESS compilation cache

ResourceLoader caches the meta data and parser output of LESS files it has compiled.

  • Accessed via ResourceLoaderFileModule::compileLessFile.
  • Stored locally on the server (APCu).

File content hasher

ResourceLoader caches the checksum of any file directly or indirectly used by a module. When serving the startup manifest to users, it needs the hashes of many thousands of files. To reduce I/O overhead, it caches this content hash locally, keyed by path and mtime.

  • Accessed via FileContentsHasher.
  • Stored locally on the server (APCu).

See also