如何实现API响应的缓存';s(用PHP构建)?

如何实现API响应的缓存';s(用PHP构建)?,php,api,caching,redis,phpfastcache,Php,Api,Caching,Redis,Phpfastcache,我希望缓存API响应,以便减少对API服务器的请求数量。API是使用zend框架用PHP编写的。 我的方法是:我创建了一个redis集群,并使用phpfastcache连接到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();
    }
}


?>