用法以下:php
$cache->set($key, $result, Configs::instance()->cacheDuration, new TagDependency([
'tags' => self::CACHE_TAG,
]));
在cache的set操做中,會將這個參數:ui
以$value = serialize([$value, $dependency]);的方式計算進cache的值中,而後$this->setValue($key, $value, $duration);保存下來。this
最重要的是在這以前,會:$dependency->evaluateDependency($this);lua
這個操做會致使$dependency對象的改變。從而引發$key對應的值的變化。對象
public function evaluateDependency($cache) { if ($this->reusable) { $hash = $this->generateReusableHash(); if (!array_key_exists($hash, self::$_reusableData)) { self::$_reusableData[$hash] = $this->generateDependencyData($cache); } $this->data = self::$_reusableData[$hash]; } else { $this->data = $this->generateDependencyData($cache); } }
一般$this-reusable爲false,即默認值。blog
執行$this->data = $this->generateDependencyData($cache);也即data屬性的改變,致使了該對象的改變。get
咱們此處用的是TagDependency,代碼以下:hash
protected function generateDependencyData($cache) { $timestamps = $this->getTimestamps($cache, (array) $this->tags); $newKeys = []; foreach ($timestamps as $key => $timestamp) { if ($timestamp === false) { $newKeys[] = $key; } } if (!empty($newKeys)) { $timestamps = array_merge($timestamps, static::touchKeys($cache, $newKeys)); } return $timestamps; }
獲取時間戳,第一次獲取爲全部$timestamp都是false。it
主要看:io
static::touchKeys($cache, $newKeys)
代碼以下:
protected static function touchKeys($cache, $keys) { $items = []; $time = microtime(); foreach ($keys as $key) { $items[$key] = $time; } $cache->multiSet($items); return $items; }
給給予的key賦予一個毫秒時間戳,並批量設置cache。而:
protected function getTimestamps($cache, $tags) { if (empty($tags)) { return []; } $keys = []; foreach ($tags as $tag) { $keys[] = $cache->buildKey([__CLASS__, $tag]); } return $cache->multiGet($keys); }
用於獲取對應key的值。
If a value is not cached or expired, the corresponding array value will be false.
這句話印證了前面說的,若是未設置會返回false。
總一句話,cache-set的第四個參數,生成了一組時間戳,賦值給了TagDependency的data,而且以$cache->buildKey([__CLASS__, $tag])所造成的key爲key,時間戳爲value存入cache。用這個時間戳來檢測變化。
而TagDependency::invalidate(Configs::cache(), self::CACHE_TAG);用來從新設置時間,也就是刷新cache中以$cache->buildKey([__CLASS__, $tag])爲key的值。