基于每个记录的到期日期在CakePHP中进行缓存

时间:2013-11-25 02:53:20

标签: cakephp

我在Cake 2.4的缓存系统中遇到了一些困境,我想知道是否有人能想到一个简单的解决方案。

我在组件中创建了一个函数,用于连接到API以获取数据。我还想缓存数据,以提高效率。

问题在于缓存何时到期取决于名为$result的{​​{1}}数组(来自API)中的字段。所以,我做到了这一点:

$result['expiry']

问题是,由于某种原因,Cake需要我指定写入和读取的到期时间,尽管缓存文件本身中存在到期时间戳。

我在上面的示例中称赞了必要的行class ApiComponent extends Component { public function getRecords($data) { $cacheName = $data['Model'] . "_" . $data['action']; // IMPOSSIBLE because we don't have $result: // Cache::set(array('duration' => '+' . $result['expiry'] . ' days')); $result = Cache::read($cacheName); if (!$result) { $result = $this->connect('getRecords',$data); Cache::set(array('duration' => '+' . $result['expiry'] . ' days')); Cache::write($cacheName, $result); } return $result; } public function connect($endpoint,$data) { // Code for connecting to the API } } 。根据{{​​3}},这是它应该如何工作的。不幸的是,这对我来说没有多大意义。

我理解必须在 write 之前设置到期但是为什么我需要在读取之前设置到期时缓存文件本身具有完全指定的UNIX时间戳当缓存过期时,根据我在设置 write 时的操作。

请注意,访问API只花费我100毫秒,所以除非我也缓存了本地数据库输出,否则每次都不会保存数据库的到期时间并且每次访问它都没有任何意义,但这似乎是一个真正令人头疼的事情。必须这样做:缓存缓存到期!

1 个答案:

答案 0 :(得分:1)

从理论上讲,从缓存中读取时不一定需要持续时间。在读取时可以使用它的原因是,在缓存数据后持续时间发生变化的情况下,能够使缓存无效。

https://github.com/cakephp/cakephp/commit/caa7bb621871706baf664b5e2e4f562353f3671f

不幸的是,没有干净的方法可以克服这种自动魔法,因为无论如何都会使用duration选项值,当没有定义自定义值时,将使用默认配置中的那个,如果一个低于写入时使用的那个,那么你的缓存将过早失效。

(有点丑陋)的解决方法是为读取操作设置一个非常高的duration虚拟值,你正在失去自动魔法,但你的缓存不会过早失效:

Cache::set(array('duration' => '+10 years'));
$result = Cache::read($cacheName);