首页 > 解决方案 > 如何实现对来自 API(用 PHP 构建)的响应的缓存?

问题描述

我想缓存 API 响应,以便减少对 API 服务器的请求数。API 是使用 Zend 框架用 PHP 编写的。我的方法:我创建了一个redis集群,并使用phpfastcache连接到redis集群。使用 phpfastcache,我们只能设置缓存响应的过期时间。每当响应在缓存到期之前更新时,我们都会使用上述方法获得较旧的响应。期望的是,每当更新响应时,必须清除旧缓存并且必须使用相同的键写入新缓存。我附上了我使用的示例脚本。如果有人可以为此提供解决方案,那就太好了。提前致谢。代码:

<?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();
    }
}


?>

标签: phpapicachingredisphpfastcache

解决方案


就像我在Github上告诉你的那样,我认为你误解了缓存的概念本身。概念缓存意味着您将数据缓存为所需的 TTL。

如果您需要最新的数据,那么您必须从源(您的数据库在此处)重新获取。

缓存不是动态的,而是静态的,可以帮助你冷却后端的请求。

因此,在您的情况下,只需从源代码中获取而不进行缓存,它会很好。每次要求 Phpfastcache 询问您的数据库然后将数据与缓存数据进行比较以检查您的数据库数据是否更新是没有任何意义的。

事实上,整个操作的时间成本将比仅从源获取更长。


推荐阅读