如何实现API响应的缓存';s(用PHP构建)?
我希望缓存API响应,以便减少对API服务器的请求数量。API是使用zend框架用PHP编写的。 我的方法是:我创建了一个redis集群,并使用phpfastcache连接到redis集群。使用phpfastcache,我们只能设置缓存响应的到期时间。 每当响应在缓存到期之前更新时,我们都会使用上述方法得到较旧的响应。所需要的是,无论何时更新响应,都必须清除旧缓存,并且必须使用相同的密钥写入新缓存。 我附上了一个我使用的示例脚本。 如果有人能为我提供解决方案,那就太好了。 提前谢谢。 代码:如何实现API响应的缓存';s(用PHP构建)?,php,api,caching,redis,phpfastcache,Php,Api,Caching,Redis,Phpfastcache,我希望缓存API响应,以便减少对API服务器的请求数量。API是使用zend框架用PHP编写的。 我的方法是:我创建了一个redis集群,并使用phpfastcache连接到redis集群。使用phpfastcache,我们只能设置缓存响应的到期时间。 每当响应在缓存到期之前更新时,我们都会使用上述方法得到较旧的响应。所需要的是,无论何时更新响应,都必须清除旧缓存,并且必须使用相同的密钥写入新缓存。 我附上了一个我使用的示例脚本。 如果有人能为我提供解决方案,那就太好了。 提前谢谢。 代码:
就像我在上一篇文章中告诉你的那样,我认为你误解了缓存的概念本身。
概念缓存意味着您为所需的TTL缓存数据
如果您需要最新的数据,则必须从源(此处是您的数据库)重新获取
缓存并不意味着是动态的,它意味着是静态的,并帮助您冷却后端的请求
因此,在您的情况下,只需从源代码中获取而不缓存,这将是一件好事。每次要求Phpfastcache查询数据库,然后将数据与缓存的数据进行比较,以检查数据库数据是否更新鲜,这没有任何意义
事实上,整个操作的时间成本将比仅从源代码获取要长。正如我在上一篇文章中告诉过你的,我认为你误解了缓存的概念本身。
概念缓存意味着您为所需的TTL缓存数据
如果您需要最新的数据,则必须从源(此处是您的数据库)重新获取
缓存并不意味着是动态的,它意味着是静态的,并帮助您冷却后端的请求
因此,在您的情况下,只需从源代码中获取而不缓存,这将是一件好事。每次要求Phpfastcache查询数据库,然后将数据与缓存的数据进行比较,以检查数据库数据是否更新鲜,这没有任何意义
事实上,整个操作的时间成本将比仅从源获取要长。然后您需要实现另一个函数以使该缓存项无效。当您知道employees表的内容已经更新时,然后调用通常会执行$CacheString=$InstanceCache->getItem($key)的另一个函数$缓存字符串->设置(空)$InstanceCache->save($CacheString);谢谢你的回复。是的……我知道必须实现新的失效函数,但是我怎么知道employee表已经更新了呢?我需要发一面旗子吗?如果是,我该怎么做?然后您需要实现另一个函数来使该缓存项无效。当您知道employees表的内容已经更新时,然后调用通常会执行$CacheString=$InstanceCache->getItem($key)的另一个函数$缓存字符串->设置(空)$InstanceCache->save($CacheString);谢谢你的回复。是的……我知道必须实现新的失效函数,但是我怎么知道employee表已经更新了呢?我需要发一面旗子吗?如果是,我该怎么做?
<?php
// phpfastcache is a package used for caching
use Phpfastcache\CacheManager;
use Phpfastcache\Drivers\Redis\Config;
require //path for composer autoloader;
#InstanceCache must be global
$InstanceCache = CacheManager::getInstance('redis', new Config([
'host' => 'IP_address',
'port' => 6379,
'password' => //password
'database' => //db_name
]));
public function function_name(parameter){
$key = "unique_name";
$CacheString = $InstanceCache->getItem($key);
if(is_null($CacheString->get())){
$sql="SELECT * FROM employees";//sql query for function_name
$res=$this->db_query($sql);
if($this->db_num_rows($res)==0):
$this->db_free_results($res);
else:
$row = $this->db_fetch_object($res);
$this->db_free_results($res);
endif;
$CacheString->set($row)->expiresAfter(/*time*/);
$InstanceCache->save($CacheString);
echo $CacheString->get();
}
else{
echo $CacheString->get();
}
}
?>