MediaWiki
1.30.0
|
Multi-datacenter aware caching interface. More...
Public Member Functions | |
__construct (array $params) | |
adaptiveTTL ( $mtime, $maxTTL, $minTTL=30, $factor=0.2) | |
Get a TTL that is higher for objects that have not changed recently. More... | |
clearLastError () | |
Clear the "last error" registry. More... | |
clearProcessCache () | |
Clear the in-process caches; useful for testing. More... | |
delete ( $key, $ttl=self::HOLDOFF_TTL) | |
Purge a key from all datacenters. More... | |
get ( $key, &$curTTL=null, array $checkKeys=[], &$asOf=null) | |
Fetch the value of a key from cache. More... | |
getCheckKeyTime ( $key) | |
Fetch the value of a timestamp "check" key. More... | |
getLastError () | |
Get the "last error" registered; clearLastError() should be called manually. More... | |
getMulti (array $keys, &$curTTLs=[], array $checkKeys=[], array &$asOfs=[]) | |
Fetch the value of several keys from cache. More... | |
getMultiWithSetCallback (ArrayIterator $keyedIds, $ttl, callable $callback, array $opts=[]) | |
Method to fetch multiple cache keys at once with regeneration. More... | |
getMultiWithUnionSetCallback (ArrayIterator $keyedIds, $ttl, callable $callback, array $opts=[]) | |
Method to fetch/regenerate multiple cache keys at once. More... | |
getQoS ( $flag) | |
getWarmupKeyMisses () | |
getWithSetCallback ( $key, $ttl, $callback, array $opts=[]) | |
Method to fetch/regenerate cache keys. More... | |
makeGlobalKey () | |
makeKey () | |
makeMultiKeys (array $entities, callable $keyFunc) | |
reap ( $key, $purgeTimestamp, &$isStale=false) | |
Locally set a key to expire soon if it is stale based on $purgeTimestamp. More... | |
reapCheckKey ( $key, $purgeTimestamp, &$isStale=false) | |
Locally set a "check" key to expire soon if it is stale based on $purgeTimestamp. More... | |
resetCheckKey ( $key) | |
Delete a "check" key from all datacenters, invalidating keys that use it. More... | |
set ( $key, $value, $ttl=0, array $opts=[]) | |
Set the value of a key in cache. More... | |
setLogger (LoggerInterface $logger) | |
touchCheckKey ( $key, $holdoff=self::HOLDOFF_TTL) | |
Purge a "check" key from all datacenters, invalidating keys that use it. More... | |
Static Public Member Functions | |
static | newEmpty () |
Get an instance that wraps EmptyBagOStuff. More... | |
Public Attributes | |
const | AGE_NEW = 60 |
Never consider performing "popularity" refreshes until a key reaches this age. More... | |
const | CHECK_KEY_TTL = self::TTL_YEAR |
Seconds to keep dependency purge keys around. More... | |
const | DEFAULT_PURGE_CHANNEL = 'wancache-purge' |
const | ERR_NO_RESPONSE = 1 |
const | ERR_NONE = 0 |
const | ERR_RELAY = 4 |
const | ERR_UNEXPECTED = 3 |
const | ERR_UNREACHABLE = 2 |
const | FLD_FLAGS = 4 |
const | FLD_HOLDOFF = 5 |
const | FLD_TIME = 3 |
const | FLD_TTL = 2 |
const | FLD_VALUE = 1 |
const | FLD_VERSION = 0 |
const | HIT_RATE_HIGH = 1 |
Hits/second for a refresh to be expected within the "popularity" window. More... | |
const | HOLDOFF_NONE = 0 |
Idiom for delete() for "no hold-off". More... | |
const | HOLDOFF_TTL = 11 |
Seconds to tombstone keys on delete() More... | |
const | HOT_TTR = 900 |
The time length of the "popularity" refresh window for hot keys. More... | |
const | INTERIM_KEY_PREFIX = 'WANCache:i:' |
const | LOCK_TSE = 1 |
Default time-since-expiry on a miss that makes a key "hot". More... | |
const | LOCK_TTL = 10 |
Seconds to keep lock keys around. More... | |
const | LOW_TTL = 30 |
Default remaining TTL at which to consider pre-emptive regeneration. More... | |
const | MAX_COMMIT_DELAY = 3 |
Max time expected to pass between delete() and DB commit finishing. More... | |
const | MAX_READ_LAG = 7 |
Max replication+snapshot lag before applying TTL_LAGGED or disallowing set() More... | |
const | MIN_TIMESTAMP_NONE = 0.0 |
Idiom for getWithSetCallback() for "no minimum required as-of timestamp". More... | |
const | MUTEX_KEY_PREFIX = 'WANCache:m:' |
const | PC_PRIMARY = 'primary:1000' |
const | PURGE_VAL_PREFIX = 'PURGED:' |
const | RAMPUP_TTL = 30 |
Seconds to ramp up to the "popularity" refresh chance after a key is no longer new. More... | |
const | TIME_KEY_PREFIX = 'WANCache:t:' |
const | TINY_NEGATIVE = -0.000001 |
Tiny negative float to use when CTL comes up >= 0 due to clock skew. More... | |
const | TSE_NONE = -1 |
Idiom for getWithSetCallback() callbacks to 'lockTSE' logic. More... | |
const | TTL_LAGGED = 30 |
Max TTL to store keys when a data sourced is lagged. More... | |
const | TTL_UNCACHEABLE = -1 |
Idiom for getWithSetCallback() callbacks to avoid calling set() More... | |
const | VALUE_KEY_PREFIX = 'WANCache:v:' |
const | VERSION = 1 |
Cache format version number. More... | |
const | VFLD_DATA = 'WOC:d' |
const | VFLD_VERSION = 'WOC:v' |
Public Attributes inherited from IExpiringStore | |
const | ATTR_EMULATION = 1 |
const | ATTR_SYNCWRITES = 2 |
const | QOS_EMULATION_SQL = 1 |
const | QOS_SYNCWRITES_BE = 2 |
const | QOS_SYNCWRITES_NONE = 1 |
const | QOS_SYNCWRITES_QC = 3 |
const | QOS_SYNCWRITES_SS = 4 |
const | QOS_UNKNOWN = INF |
const | TTL_DAY = 86400 |
const | TTL_HOUR = 3600 |
const | TTL_INDEFINITE = 0 |
const | TTL_MINUTE = 60 |
const | TTL_MONTH = 2592000 |
const | TTL_PROC_LONG = 30 |
const | TTL_PROC_SHORT = 3 |
const | TTL_WEEK = 604800 |
const | TTL_YEAR = 31536000 |
Protected Member Functions | |
doGetWithSetCallback ( $key, $ttl, $callback, array $opts, &$asOf=null) | |
Do the actual I/O for getWithSetCallback() when needed. More... | |
getProcessCache ( $group) | |
isValid ( $value, $versioned, $asOf, $minTime) | |
Check whether $value is appropriately versioned and not older than $minTime (if set) More... | |
makePurgeValue ( $timestamp, $holdoff) | |
relayDelete ( $key) | |
Do the actual async bus delete of a key. More... | |
relayPurge ( $key, $ttl, $holdoff) | |
Do the actual async bus purge of a key. More... | |
unwrap ( $wrapped, $now) | |
Do not use this method outside WANObjectCache. More... | |
worthRefreshExpiring ( $curTTL, $lowTTL) | |
Check if a key should be regenerated (using random probability) More... | |
worthRefreshPopular ( $asOf, $ageNew, $timeTillRefresh, $now) | |
Check if a key is due for randomized regeneration due to its popularity. More... | |
wrap ( $value, $ttl, $now) | |
Do not use this method outside WANObjectCache. More... | |
Static Protected Member Functions | |
static | parsePurgeValue ( $value) |
static | prefixCacheKeys (array $keys, $prefix) |
Protected Attributes | |
BagOStuff | $cache |
The local datacenter cache. More... | |
int | $lastRelayError = self::ERR_NONE |
ERR_* constant for the "last error" registry. More... | |
LoggerInterface | $logger |
HashBagOStuff[] | $processCaches = [] |
Map of group PHP instance caches. More... | |
string | $purgeChannel |
Purge channel name. More... | |
EventRelayer | $purgeRelayer |
Bus that handles purge broadcasts. More... | |
Private Member Functions | |
getNonProcessCachedKeys (array $keys, array $opts) | |
getRawKeysForWarmup (array $keys, array $checkKeys) | |
processCheckKeys (array $timeKeys, array $wrappedValues, $now) | |
Private Attributes | |
int | $callbackDepth = 0 |
Callback stack depth for getWithSetCallback() More... | |
mixed[] | $warmupCache = [] |
Temporary warm-up cache. More... | |
int | $warmupKeyMisses = 0 |
Key fetched. More... | |
Multi-datacenter aware caching interface.
All operations go to the local datacenter cache, except for delete(), touchCheckKey(), and resetCheckKey(), which broadcast to all datacenters.
This class is intended for caching data from primary stores. If the get() method does not return a value, then the caller should query the new value and backfill the cache using set(). The preferred way to do this logic is through getWithSetCallback(). When querying the store on cache miss, the closest DB replica should be used. Try to avoid heavyweight DB master or quorum reads. When the source data changes, a purge method should be called. Since purges are expensive, they should be avoided. One can do so if:
The simplest purge method is delete().
There are three supported ways to handle broadcasted operations:
Broadcasted operations like delete() and touchCheckKey() are done asynchronously in all datacenters this way, though the local one should likely be near immediate.
This means that callers in all datacenters may see older values for however many milliseconds that the purge took to reach that datacenter. As with any cache, this should not be relied on for cases where reads are used to determine writes to source (e.g. non-cache) data stores, except when reading immutable data.
All values are wrapped in metadata arrays. Keys use a "WANCache:" prefix to avoid collisions with keys that are not wrapped as metadata arrays. The prefixes are as follows:
Definition at line 80 of file WANObjectCache.php.
WANObjectCache::__construct | ( | array | $params | ) |
array | $params |
|
Definition at line 181 of file WANObjectCache.php.
References $params, cache, DEFAULT_PURGE_CHANNEL, and setLogger().
WANObjectCache::adaptiveTTL | ( | $mtime, | |
$maxTTL, | |||
$minTTL = 30 , |
|||
$factor = 0.2 |
|||
) |
Get a TTL that is higher for objects that have not changed recently.
This is useful for keys that get explicit purges and DB or purge relay lag is a potential concern (especially how it interacts with CDN cache)
Example usage:
int | float | $mtime | UNIX timestamp |
int | $maxTTL | Maximum TTL (seconds) |
int | $minTTL | Minimum TTL (seconds); Default: 30 |
float | $factor | Value in the range (0,1); Default: .2 |
Definition at line 1427 of file WANObjectCache.php.
|
final |
Clear the "last error" registry.
Definition at line 1381 of file WANObjectCache.php.
WANObjectCache::clearProcessCache | ( | ) |
Clear the in-process caches; useful for testing.
Definition at line 1391 of file WANObjectCache.php.
|
final |
Purge a key from all datacenters.
This should only be called when the underlying data (being cached) changes in a significant way. This deletes the key and starts a hold-off period where the key cannot be written to for a few seconds (HOLDOFF_TTL). This is done to avoid the following race condition:
This is implemented by storing a special "tombstone" value at the cache key that this class recognizes; get() calls will return false for the key and any set() calls will refuse to replace tombstone values at the key. For this to always avoid stale value writes, the following must hold:
Note that set() can also be lag-aware and lower the TTL if it's high.
When using potentially long-running ACID transactions, a good pattern is to use a pre-commit hook to issue the delete. This means that immediately after commit, callers will see the tombstone in cache upon purge relay. It also avoids the following race condition:
Example usage:
The $ttl parameter can be used when purging values that have not actually changed recently. For example, a cleanup script to purge cache entries does not really need a hold-off period, so it can use HOLDOFF_NONE. Likewise for user-requested purge. Note that $ttl limits the effective range of 'lockTSE' for getWithSetCallback().
If called twice on the same key, then the last hold-off TTL takes precedence. For idempotence, the $ttl should not vary for different delete() calls on the same key.
string | $key | Cache key |
int | $ttl | Tombstone TTL; Default: WANObjectCache::HOLDOFF_TTL |
Definition at line 543 of file WANObjectCache.php.
References relayDelete(), and relayPurge().
Referenced by WANObjectCacheTest\testBusyValue(), WANObjectCacheTest\testGetMultiWithSetCallback(), WANObjectCacheTest\testGetMultiWithUnionSetCallback(), WANObjectCacheTest\testGetWithSetCallback(), WANObjectCacheTest\testGetWithSetCallback_versions(), WANObjectCacheTest\testLockTSE(), and WANObjectCacheTest\testLockTSESlow().
|
protected |
Do the actual I/O for getWithSetCallback() when needed.
string | $key | |
int | $ttl | |
callback | $callback | |
array | $opts | Options map for getWithSetCallback() |
float | &$asOf | Cache generation timestamp of returned value [returned] |
Definition at line 939 of file WANObjectCache.php.
References $callbackDepth, $value, AGE_NEW, cache, false, FLD_TIME, HOT_TTR, isValid(), list, MIN_TIMESTAMP_NONE, TSE_NONE, unwrap(), use, worthRefreshExpiring(), worthRefreshPopular(), and wrap().
Referenced by getWithSetCallback().
|
final |
Fetch the value of a key from cache.
If supplied, $curTTL is set to the remaining TTL (current time left):
If a key is tombstoned, $curTTL will reflect the time since delete().
The timestamp of $key will be checked against the last-purge timestamp of each of $checkKeys. Those $checkKeys not in cache will have the last-purge initialized to the current timestamp. If any of $checkKeys have a timestamp greater than that of $key, then $curTTL will reflect how long ago $key became invalid. Callers can use $curTTL to know when the value is stale. The $checkKeys parameter allow mass invalidations by updating a single key:
Source data entities might exists in a DB that uses snapshot isolation (e.g. the default REPEATABLE-READ in innoDB). Even for mutable data, that isolation can largely be maintained by doing the following:
However, pre-snapshot values might still be seen if an update was made in a remote datacenter but the purge from delete() didn't relay yet.
Consider using getWithSetCallback() instead of get() and set() cycles. That method has cache slam avoiding features for hot/expensive keys.
string | $key | Cache key |
mixed | &$curTTL | Approximate TTL left on the key if present/tombstoned [returned] |
array | $checkKeys | List of "check" keys |
float | &$asOf | UNIX timestamp of cached value; null on failure [returned] |
Definition at line 248 of file WANObjectCache.php.
References getMulti().
Referenced by JobQueueDB\doDeduplicateRootJob(), WANObjectCacheTest\testCheckKeyInitHoldoff(), WANObjectCacheTest\testGetMultiWithSetCallback(), WANObjectCacheTest\testGetMultiWithUnionSetCallback(), WANObjectCacheTest\testGetWithSetCallback(), and WANObjectCacheTest\testLockTSESlow().
|
final |
Fetch the value of a timestamp "check" key.
The key will be initialized to the current time if not set, so only call this method if this behavior is actually desired
The timestamp can be used to check whether a cached value is valid. Callers should not assume that this returns the same timestamp in all datacenters due to relay delays.
The level of staleness can roughly be estimated from this key, but if the key was evicted from cache, such calculations may show the time since expiry as ~0 seconds.
Note that "check" keys won't collide with other regular keys.
string | $key |
Definition at line 576 of file WANObjectCache.php.
References $time, cache, FLD_TIME, makePurgeValue(), parsePurgeValue(), and string.
Referenced by WANObjectCacheTest\testGetMulti(), WANObjectCacheTest\testGetMultiWithSetCallback(), WANObjectCacheTest\testGetMultiWithUnionSetCallback(), and WANObjectCacheTest\testGetWithSetCallback().
|
final |
Get the "last error" registered; clearLastError() should be called manually.
Definition at line 1355 of file WANObjectCache.php.
References $code, $lastRelayError, cache, BagOStuff\ERR_NO_RESPONSE, ERR_NO_RESPONSE, BagOStuff\ERR_NONE, ERR_NONE, ERR_UNEXPECTED, BagOStuff\ERR_UNREACHABLE, and ERR_UNREACHABLE.
|
final |
Fetch the value of several keys from cache.
array | $keys | List of cache keys |
array | &$curTTLs | Map of (key => approximate TTL left) for existing keys [returned] |
array | $checkKeys | List of check keys to apply to all $keys. May also apply "check" keys to specific cache keys only by using cache keys as keys in the $checkKeys array. |
float[] | &$asOfs | Map of (key => UNIX timestamp of cached value; null on failure) |
Definition at line 270 of file WANObjectCache.php.
References $keys, $value, array(), as, cache, captcha-old\count, false, FLD_HOLDOFF, FLD_TIME, list, prefixCacheKeys(), processCheckKeys(), and unwrap().
Referenced by get(), getMultiWithUnionSetCallback(), WANObjectCacheTest\testGetMulti(), and WANObjectCacheTest\testGetMultiCheckKeys().
|
final |
Method to fetch multiple cache keys at once with regeneration.
This works the same as getWithSetCallback() except:
Example usage:
ArrayIterator | $keyedIds | Result of WANObjectCache::makeMultiKeys() |
int | $ttl | Seconds to live for key updates |
callable | $callback | Callback the yields entity regeneration callbacks |
array | $opts | Options map |
Definition at line 1107 of file WANObjectCache.php.
References as, getNonProcessCachedKeys(), getRawKeysForWarmup(), getWithSetCallback(), and use.
Referenced by WANObjectCacheTest\testGetMultiWithSetCallback().
|
final |
Method to fetch/regenerate multiple cache keys at once.
This works the same as getWithSetCallback() except:
Example usage:
ArrayIterator | $keyedIds | Result of WANObjectCache::makeMultiKeys() |
int | $ttl | Seconds to live for key updates |
callable | $callback | Callback the yields entity regeneration callbacks |
array | $opts | Options map |
Definition at line 1193 of file WANObjectCache.php.
References as, getMulti(), getNonProcessCachedKeys(), getRawKeysForWarmup(), getWithSetCallback(), and use.
Referenced by WANObjectCacheTest\testGetMultiWithUnionSetCallback().
array | $keys | |
array | $opts |
Definition at line 1712 of file WANObjectCache.php.
References $keys, as, false, getProcessCache(), and PC_PRIMARY.
Referenced by getMultiWithSetCallback(), and getMultiWithUnionSetCallback().
|
protected |
string | $group |
Definition at line 1698 of file WANObjectCache.php.
References list.
Referenced by getNonProcessCachedKeys(), and getWithSetCallback().
WANObjectCache::getQoS | ( | $flag | ) |
int | $flag | ATTR_* class constant |
Definition at line 1400 of file WANObjectCache.php.
References cache.
array | $keys | |
array | $checkKeys |
Definition at line 1732 of file WANObjectCache.php.
References $keys, $warmupCache, as, and cache.
Referenced by getMultiWithSetCallback(), and getMultiWithUnionSetCallback().
WANObjectCache::getWarmupKeyMisses | ( | ) |
Definition at line 1445 of file WANObjectCache.php.
References $warmupKeyMisses.
Referenced by WANObjectCacheTest\testGetMultiWithSetCallback(), and WANObjectCacheTest\testGetMultiWithUnionSetCallback().
|
final |
Method to fetch/regenerate cache keys.
On cache miss, the key will be set to the callback result via set() (unless the callback returns false) and that result will be returned. The arguments supplied to the callback are:
It is strongly recommended to set the 'lag' and 'since' fields to avoid race conditions that can cause stale values to get stuck at keys. Usually, callbacks ignore the current value, but it can be used to maintain "most recent X" values that come from time or sequence based source data, provided that the "as of" id/time is tracked. Note that preemptive regeneration and $checkKeys can result in a non-false current value.
Usage of $checkKeys is similar to get() and getMulti(). However, rather than the caller having to inspect a "current time left" variable (e.g. $curTTL, $curTTLs), a cache regeneration will automatically be triggered using the callback.
The simplest way to avoid stampedes for hot keys is to use the 'lockTSE' option in $opts. If cache purges are needed, also:
Example usage (typical key):
Example usage (key that is expensive and hot):
Example usage (key with dynamic dependencies):
Example usage (hot key holding most recent 100 events):
string | $key | Cache key |
int | $ttl | Seconds to live for key updates. Special values are:
|
callable | $callback | Value generation function |
array | $opts | Options map:
|
Definition at line 857 of file WANObjectCache.php.
References $value, doGetWithSetCallback(), getProcessCache(), PC_PRIMARY, TTL_UNCACHEABLE, use, and VFLD_DATA.
Referenced by getMultiWithSetCallback(), getMultiWithUnionSetCallback(), WANObjectCacheTest\testBusyValue(), WANObjectCacheTest\testGetWithSetCallback(), WANObjectCacheTest\testGetWithSetCallback_versions(), WANObjectCacheTest\testLockTSE(), and WANObjectCacheTest\testLockTSESlow().
|
protected |
Check whether $value is appropriately versioned and not older than $minTime (if set)
array | $value | |
bool | $versioned | |
float | $asOf | The time $value was generated |
float | $minTime | The last time the main value was generated (0.0 if unknown) |
Definition at line 1579 of file WANObjectCache.php.
References $value.
Referenced by doGetWithSetCallback().
WANObjectCache::makeGlobalKey | ( | ) |
string | $keys,... | Key component |
Definition at line 1332 of file WANObjectCache.php.
References cache.
WANObjectCache::makeKey | ( | ) |
string | $keys,... | Key component |
Definition at line 1322 of file WANObjectCache.php.
References cache.
WANObjectCache::makeMultiKeys | ( | array | $entities, |
callable | $keyFunc | ||
) |
array | $entities | List of entity IDs |
callable | $keyFunc | Callback yielding a key from (entity ID, this WANObjectCache) |
Definition at line 1342 of file WANObjectCache.php.
References as.
Referenced by WANObjectCacheTest\testGetMultiWithSetCallback(), and WANObjectCacheTest\testGetMultiWithUnionSetCallback().
|
protected |
float | $timestamp | |
int | $holdoff | In seconds |
Definition at line 1690 of file WANObjectCache.php.
Referenced by getCheckKeyTime(), processCheckKeys(), and relayPurge().
|
static |
Get an instance that wraps EmptyBagOStuff.
Definition at line 201 of file WANObjectCache.php.
Referenced by FileBackendStore\__construct(), Wikimedia\Rdbms\LBFactory\__construct(), Wikimedia\Rdbms\LoadBalancer\__construct(), ClassicInterwikiLookupTest\testArrayStorage(), ClassicInterwikiLookupTest\testCDBStorage(), ClassicInterwikiLookupTest\testDatabaseStorage(), and ClassicInterwikiLookupTest\testGetAllPrefixes().
|
staticprotected |
string | $value | Wrapped value like "PURGED:<timestamp>:<holdoff>" |
Definition at line 1665 of file WANObjectCache.php.
References $value, and HOLDOFF_TTL.
Referenced by getCheckKeyTime(), processCheckKeys(), reapCheckKey(), and unwrap().
|
staticprotected |
array | $keys | |
string | $prefix |
Definition at line 1651 of file WANObjectCache.php.
References $keys, $res, and as.
Referenced by getMulti().
array | $timeKeys | List of prefixed time check keys |
array | $wrappedValues | |
float | $now |
Definition at line 361 of file WANObjectCache.php.
References as, cache, makePurgeValue(), and parsePurgeValue().
Referenced by getMulti().
WANObjectCache::reap | ( | $key, | |
$purgeTimestamp, | |||
& | $isStale = false |
||
) |
Locally set a key to expire soon if it is stale based on $purgeTimestamp.
This sets stale keys' time-to-live at HOLDOFF_TTL seconds, which both avoids broadcasting in mcrouter setups and also avoids races with new tombstones.
string | $key | Cache key |
int | $purgeTimestamp | UNIX timestamp of purge |
bool | &$isStale | Whether the key is stale |
Definition at line 1269 of file WANObjectCache.php.
References cache, and HOLDOFF_TTL.
WANObjectCache::reapCheckKey | ( | $key, | |
$purgeTimestamp, | |||
& | $isStale = false |
||
) |
Locally set a "check" key to expire soon if it is stale based on $purgeTimestamp.
string | $key | Cache key |
int | $purgeTimestamp | UNIX timestamp of purge |
bool | &$isStale | Whether the key is stale |
Definition at line 1298 of file WANObjectCache.php.
References cache, and parsePurgeValue().
|
protected |
Do the actual async bus delete of a key.
string | $key | Cache key |
Definition at line 1490 of file WANObjectCache.php.
References cache, and ERR_RELAY.
Referenced by delete(), and resetCheckKey().
|
protected |
Do the actual async bus purge of a key.
This must set the key to "PURGED:<UNIX timestamp>:<holdoff>"
string | $key | Cache key |
int | $ttl | How long to keep the tombstone [seconds] |
int | $holdoff | HOLDOFF_* constant controlling how long to ignore sets for this key |
Definition at line 1459 of file WANObjectCache.php.
References cache, ERR_RELAY, and makePurgeValue().
Referenced by delete(), and touchCheckKey().
|
final |
Delete a "check" key from all datacenters, invalidating keys that use it.
This is similar to touchCheckKey() in that keys using it via get(), getMulti(), or getWithSetCallback() will be invalidated. The differences are:
The advantage is that this does not place high TTL keys on every cache server, making it better for code that will cache many different keys and either does not use lockTSE or uses a low enough TTL anyway.
This is typically useful for keys with dynamically generated names where a high number of combinations exist.
Note that "check" keys won't collide with other regular keys.
string | $key | Cache key |
Definition at line 663 of file WANObjectCache.php.
References relayDelete().
|
final |
Set the value of a key in cache.
Simply calling this method when source data changes is not valid because the changes do not replicate to the other WAN sites. In that case, delete() should be used instead. This method is intended for use on cache misses.
If the data was read from a snapshot-isolated transactions (e.g. the default REPEATABLE-READ in innoDB), use 'since' to avoid the following race condition:
Setting 'lag' and 'since' help avoids keys getting stuck in stale states.
Example usage:
string | $key | Cache key |
mixed | $value | |
int | $ttl | Seconds to live. Special values are:
|
array | $opts | Options map:
|
Definition at line 436 of file WANObjectCache.php.
References $cache, cache, FLD_FLAGS, TSE_NONE, TTL_LAGGED, use, and wrap().
Referenced by JobQueueDB\doDeduplicateRootJob(), WANObjectCacheTest\testCheckKeyInitHoldoff(), WANObjectCacheTest\testGetMulti(), and WANObjectCacheTest\testGetMultiCheckKeys().
WANObjectCache::setLogger | ( | LoggerInterface | $logger | ) |
|
final |
Purge a "check" key from all datacenters, invalidating keys that use it.
This should only be called when the underlying data (being cached) changes in a significant way, and it is impractical to call delete() on all keys that should be changed. When get() is called on those keys, the relevant "check" keys must be supplied for this to work.
The "check" key essentially represents a last-modified field. When touched, the field will be updated on all cache servers. Keys using it via get(), getMulti(), or getWithSetCallback() will be invalidated. It is treated as being HOLDOFF_TTL seconds in the future by those methods to avoid race conditions where dependent keys get updated with stale values (e.g. from a DB replica DB).
This is typically useful for keys with hardcoded names or in some cases dynamically generated names where a low number of combinations exist. When a few important keys get a large number of hits, a high cache time is usually desired as well as "lockTSE" logic. The resetCheckKey() method is less appropriate in such cases since the "time since expiry" cannot be inferred, causing any get() after the reset to treat the key as being "hot", resulting in more stale value usage.
Note that "check" keys won't collide with other regular keys.
string | $key | Cache key |
int | $holdoff | HOLDOFF_TTL or HOLDOFF_NONE constant |
Definition at line 628 of file WANObjectCache.php.
References relayPurge().
Referenced by WANObjectCacheTest\testGetMultiCheckKeys().
|
protected |
Do not use this method outside WANObjectCache.
array | string | bool | $wrapped | |
float | $now | Unix Current timestamp (preferrably pre-query) |
Definition at line 1613 of file WANObjectCache.php.
References $flags, FLD_FLAGS, FLD_TIME, FLD_VALUE, and parsePurgeValue().
Referenced by doGetWithSetCallback(), and getMulti().
|
protected |
Check if a key should be regenerated (using random probability)
This returns false if $curTTL >= $lowTTL. Otherwise, the chance of returning true increases steadily from 0% to 100% as the $curTTL moves from $lowTTL to 0 seconds. This handles widely varying levels of cache access traffic.
float | $curTTL | Approximate TTL left on the key if present |
float | $lowTTL | Consider a refresh when $curTTL is less than this |
Definition at line 1521 of file WANObjectCache.php.
Referenced by doGetWithSetCallback().
|
protected |
Check if a key is due for randomized regeneration due to its popularity.
This is used so that popular keys can preemptively refresh themselves for higher consistency (especially in the case of purge loss/delay). Unpopular keys can remain in cache with their high nominal TTL. This means popular keys keep good consistency, whether the data changes frequently or not, and long-tail keys get to stay in cache and get hits too. Similar to worthRefreshExpiring(), randomization is used.
float | $asOf | UNIX timestamp of the value |
int | $ageNew | Age of key when this might recommend refreshing (seconds) |
int | $timeTillRefresh | Age of key when it should be refreshed if popular (seconds) |
float | $now | The current UNIX timestamp |
Definition at line 1548 of file WANObjectCache.php.
References RAMPUP_TTL.
Referenced by doGetWithSetCallback().
|
protected |
Do not use this method outside WANObjectCache.
mixed | $value | |
int | $ttl | [0=forever] |
float | $now | Unix Current timestamp just before calling set() |
Definition at line 1597 of file WANObjectCache.php.
References $value, and VERSION.
Referenced by doGetWithSetCallback(), and set().
|
protected |
|
private |
Callback stack depth for getWithSetCallback()
Definition at line 96 of file WANObjectCache.php.
Referenced by doGetWithSetCallback().
|
protected |
ERR_* constant for the "last error" registry.
Definition at line 93 of file WANObjectCache.php.
Referenced by getLastError().
|
protected |
Definition at line 90 of file WANObjectCache.php.
Referenced by setLogger().
|
protected |
Map of group PHP instance caches.
Definition at line 84 of file WANObjectCache.php.
|
protected |
Purge channel name.
Definition at line 86 of file WANObjectCache.php.
|
protected |
Bus that handles purge broadcasts.
Definition at line 88 of file WANObjectCache.php.
|
private |
Temporary warm-up cache.
Definition at line 98 of file WANObjectCache.php.
Referenced by getRawKeysForWarmup().
|
private |
const WANObjectCache::AGE_NEW = 60 |
Never consider performing "popularity" refreshes until a key reaches this age.
Definition at line 119 of file WANObjectCache.php.
Referenced by doGetWithSetCallback().
const WANObjectCache::CHECK_KEY_TTL = self::TTL_YEAR |
Seconds to keep dependency purge keys around.
Definition at line 110 of file WANObjectCache.php.
const WANObjectCache::DEFAULT_PURGE_CHANNEL = 'wancache-purge' |
Definition at line 172 of file WANObjectCache.php.
Referenced by __construct().
const WANObjectCache::ERR_NO_RESPONSE = 1 |
Definition at line 155 of file WANObjectCache.php.
Referenced by getLastError().
const WANObjectCache::ERR_NONE = 0 |
Definition at line 154 of file WANObjectCache.php.
Referenced by clearLastError(), and getLastError().
const WANObjectCache::ERR_RELAY = 4 |
Definition at line 158 of file WANObjectCache.php.
Referenced by relayDelete(), and relayPurge().
const WANObjectCache::ERR_UNEXPECTED = 3 |
Definition at line 157 of file WANObjectCache.php.
Referenced by getLastError().
const WANObjectCache::ERR_UNREACHABLE = 2 |
Definition at line 156 of file WANObjectCache.php.
Referenced by getLastError().
const WANObjectCache::FLD_FLAGS = 4 |
Definition at line 148 of file WANObjectCache.php.
const WANObjectCache::FLD_HOLDOFF = 5 |
Definition at line 149 of file WANObjectCache.php.
Referenced by getMulti().
const WANObjectCache::FLD_TIME = 3 |
Definition at line 147 of file WANObjectCache.php.
Referenced by doGetWithSetCallback(), getCheckKeyTime(), getMulti(), WANObjectCacheTest\testReap(), and unwrap().
const WANObjectCache::FLD_TTL = 2 |
Definition at line 146 of file WANObjectCache.php.
Referenced by WANObjectCacheTest\testReap().
const WANObjectCache::FLD_VALUE = 1 |
Definition at line 145 of file WANObjectCache.php.
Referenced by WANObjectCacheTest\testReap(), and unwrap().
const WANObjectCache::FLD_VERSION = 0 |
Definition at line 144 of file WANObjectCache.php.
Referenced by WANObjectCacheTest\testReap().
const WANObjectCache::HIT_RATE_HIGH = 1 |
Hits/second for a refresh to be expected within the "popularity" window.
Definition at line 123 of file WANObjectCache.php.
const WANObjectCache::HOLDOFF_NONE = 0 |
Idiom for delete() for "no hold-off".
Definition at line 134 of file WANObjectCache.php.
Referenced by WANObjectCacheTest\testDelete(), and WANObjectCacheTest\testGetMultiCheckKeys().
const WANObjectCache::HOLDOFF_TTL = 11 |
Seconds to tombstone keys on delete()
Definition at line 107 of file WANObjectCache.php.
Referenced by WANObjectCacheReaper\invoke(), MediaWikiGadgetsDefinitionRepo\loadGadgets(), parsePurgeValue(), and reap().
const WANObjectCache::HOT_TTR = 900 |
The time length of the "popularity" refresh window for hot keys.
Definition at line 121 of file WANObjectCache.php.
Referenced by doGetWithSetCallback().
const WANObjectCache::INTERIM_KEY_PREFIX = 'WANCache:i:' |
Definition at line 161 of file WANObjectCache.php.
const WANObjectCache::LOCK_TSE = 1 |
Default time-since-expiry on a miss that makes a key "hot".
Definition at line 116 of file WANObjectCache.php.
const WANObjectCache::LOCK_TTL = 10 |
Seconds to keep lock keys around.
Definition at line 112 of file WANObjectCache.php.
const WANObjectCache::LOW_TTL = 30 |
Default remaining TTL at which to consider pre-emptive regeneration.
Definition at line 114 of file WANObjectCache.php.
const WANObjectCache::MAX_COMMIT_DELAY = 3 |
Max time expected to pass between delete() and DB commit finishing.
Definition at line 103 of file WANObjectCache.php.
Referenced by CiteHooks\onLinksUpdateComplete().
const WANObjectCache::MAX_READ_LAG = 7 |
Max replication+snapshot lag before applying TTL_LAGGED or disallowing set()
Definition at line 105 of file WANObjectCache.php.
const WANObjectCache::MIN_TIMESTAMP_NONE = 0.0 |
Idiom for getWithSetCallback() for "no minimum required as-of timestamp".
Definition at line 136 of file WANObjectCache.php.
Referenced by doGetWithSetCallback().
const WANObjectCache::MUTEX_KEY_PREFIX = 'WANCache:m:' |
Definition at line 163 of file WANObjectCache.php.
const WANObjectCache::PC_PRIMARY = 'primary:1000' |
Definition at line 170 of file WANObjectCache.php.
Referenced by getNonProcessCachedKeys(), and getWithSetCallback().
const WANObjectCache::PURGE_VAL_PREFIX = 'PURGED:' |
Definition at line 165 of file WANObjectCache.php.
Referenced by MessageBlobStoreTest\setUp(), WANObjectCacheTest\testGetWithSeveralCheckKeys(), and WANObjectCacheTest\testReap().
const WANObjectCache::RAMPUP_TTL = 30 |
Seconds to ramp up to the "popularity" refresh chance after a key is no longer new.
Definition at line 125 of file WANObjectCache.php.
Referenced by worthRefreshPopular().
const WANObjectCache::TIME_KEY_PREFIX = 'WANCache:t:' |
Definition at line 162 of file WANObjectCache.php.
Referenced by WANObjectCacheTest\testGetWithSeveralCheckKeys(), and WANObjectCacheTest\testReap().
const WANObjectCache::TINY_NEGATIVE = -0.000001 |
Tiny negative float to use when CTL comes up >= 0 due to clock skew.
Definition at line 139 of file WANObjectCache.php.
const WANObjectCache::TSE_NONE = -1 |
Idiom for getWithSetCallback() callbacks to 'lockTSE' logic.
Definition at line 130 of file WANObjectCache.php.
Referenced by doGetWithSetCallback(), and set().
const WANObjectCache::TTL_LAGGED = 30 |
Max TTL to store keys when a data sourced is lagged.
Definition at line 132 of file WANObjectCache.php.
Referenced by set().
const WANObjectCache::TTL_UNCACHEABLE = -1 |
Idiom for getWithSetCallback() callbacks to avoid calling set()
Definition at line 128 of file WANObjectCache.php.
Referenced by ForeignDBFile\getDescriptionText(), File\getDescriptionText(), GadgetDefinitionNamespaceRepo\getGadget(), getWithSetCallback(), and MediaWikiGadgetsDefinitionRepo\loadGadgets().
const WANObjectCache::VALUE_KEY_PREFIX = 'WANCache:v:' |
Definition at line 160 of file WANObjectCache.php.
Referenced by WANObjectCacheTest\testGetMultiWithSetCallback(), and WANObjectCacheTest\testReap().
const WANObjectCache::VERSION = 1 |
Cache format version number.
Definition at line 142 of file WANObjectCache.php.
Referenced by WANObjectCacheTest\testReap(), and wrap().
const WANObjectCache::VFLD_DATA = 'WOC:d' |
Definition at line 167 of file WANObjectCache.php.
Referenced by getWithSetCallback().
const WANObjectCache::VFLD_VERSION = 'WOC:v' |
Definition at line 168 of file WANObjectCache.php.