cyber-duck / cacheing-memoizer
This package is auto-updated.
Last update: 2023-09-08 11:21:29 UTC
README
请考虑使用illuminate cache package。
简单缓存memoizer
我们的简单缓存memoizer是一个灵活的memoizer,也可以选择性地与缓存结合,以自动缓存函数调用的结果。
我们使用cyber-duck/laravel-cacheing-memoizer实现了一个后者的函数示例,将其添加到Laravel中,但它也可以用于其他框架 - 它最初是为一个从Codeigniter逐步升级到Laravel的旧网站编写的,在两者中都能正常工作。
用法
memoization
添加
use CyberDuck\CacheingMemoizer\MemoizesResults
到您的类中。
这将为您提供的类添加额外的功能,其中最重要的是memoize
方法。
Memoize接受两个或更多参数。
第一个是memoization键的构建块。第二个是返回要memoize的值的函数。第三个和任何后续参数将在调用函数时传递。
Memoization默认情况下是对象唯一的,但也可以使用singletonMemoize
,它与memoize
完全相同,除了它在一个singleton中memoize结果值。
重要提示:因为这是框架无关的,memoizer必须自己管理singleton。所以它可能不是框架保留的“相同”singleton。如果这很重要,请覆盖singletonMemoize
方法。
还有一个globallyMemoize
方法。这实际上是将结果与该键对任何对象进行memoize。
缓存
您还可以使用memoization功能与自动缓存。这需要两个步骤
-
通过以下方式设置memoizer以使用缓存
- 调用
CyberDuck\CacheingMemoizer\CacheingMemoizer::setCacheRetrievalFunction
,传入一个callable,它应接受一个参数 - 缓存键 - 如果有缓存命中,则返回结果,否则返回null。 - 至少调用一次
CyberDuck\CacheingMemoizer\CacheingMemoizer::addShutdownFunction
,传入一个callable,它应接受两个参数 - 键和值,这将写入缓存。 - 确保在请求结束时调用
CyberDuck\CacheingMemoizer\CacheingMemoizer::shutdown
。
- 调用
(如果您使用Laravel,cyber-duck/laravel-cacheing-memoizer
会为您这样做)
- 使用与
globallyMemoize
相同的方式使用globallyMemoizeWithCache
其他方法
请参阅源代码。文档即将推出。《code>forget和getMemoizeKey
是主要的,它们的重要性希望很明显。
###我能否看看一些使用示例?
当然,这里有一个使用示例,以避免昂贵的调用带来的开销
public function getPackageAttribute()
{
return $this->memoize('package',
function () {
return package()->create(['code' => $this->PackageTypeCode]);
});
}
以下是一个例子,展示我们如何快速地将记忆化(memoization)和缓存(caching)添加到一个5年以上的旧代码中的函数中,而无需重写任何新代码。原始函数看起来是这样的
public function find_all($params = array(), $skip = array('page', 'limit', 'sort-by'))
{
$this->db->select('waOrg.OrgID, waOrg.OrgName, waOrg.PackageTypeCode, waOrg.HasGallery, waOrg.HasShowReel, waOrg.AllowSearchResultsPageLogo');
$this->db->join($this->dbn.'[wlEntry]', 'wlEntry.OrgID = waOrg.OrgID');
$this->db->join($this->dbn_live.'[wpCountry]', 'wpCountry.Country = waOrg.Country', 'left');
$this->db->group_by('waOrg.OrgID, waOrg.OrgName, waOrg.PackageTypeCode, waOrg.HasGallery, waOrg.HasShowReel, waOrg.AllowSearchResultsPageLogo');
$this->db->distinct();
$this->_apply_filters($params, $skip);
$query = $this->db->get($this->dbn.'[waOrg] waOrg');
if(count($query->result()) > 0)
{
return count($query->result());
}
return false;
}
使用自动记忆化+缓存后,它现在看起来是这样的
public function find_all($params = array(), $skip = array('page', 'limit', 'sort-by'))
{
return $this->globallyMemoizeWithCache(['org.find.all', $params, $skip], function($params, $skip){
$this->db->select('waOrg.OrgID, waOrg.OrgName, waOrg.PackageTypeCode, waOrg.HasGallery, waOrg.HasShowReel, waOrg.AllowSearchResultsPageLogo');
$this->db->join($this->dbn.'[wlEntry]', 'wlEntry.OrgID = waOrg.OrgID');
$this->db->join($this->dbn_live.'[wpCountry]', 'wpCountry.Country = waOrg.Country', 'left');
$this->db->group_by('waOrg.OrgID, waOrg.OrgName, waOrg.PackageTypeCode, waOrg.HasGallery, waOrg.HasShowReel, waOrg.AllowSearchResultsPageLogo');
$this->db->distinct();
$this->_apply_filters($params, $skip);
$query = $this->db->get($this->dbn.'[waOrg] waOrg');
if(count($query->result()) > 0)
{
return count($query->result());
}
return false;
}, $params, $skip);
}