cyber-duck/cacheing-memoizer

此包已被废弃,不再维护。作者建议使用cyber-duck/cacheing-memoizer包。

易于使用、灵活的memoizer,可选自动缓存

1.0.0 2017-01-23 19:27 UTC

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功能与自动缓存。这需要两个步骤

  1. 通过以下方式设置memoizer以使用缓存

    1. 调用CyberDuck\CacheingMemoizer\CacheingMemoizer::setCacheRetrievalFunction,传入一个callable,它应接受一个参数 - 缓存键 - 如果有缓存命中,则返回结果,否则返回null。
    2. 至少调用一次CyberDuck\CacheingMemoizer\CacheingMemoizer::addShutdownFunction,传入一个callable,它应接受两个参数 - 键和值,这将写入缓存。
    3. 确保在请求结束时调用CyberDuck\CacheingMemoizer\CacheingMemoizer::shutdown

(如果您使用Laravel,cyber-duck/laravel-cacheing-memoizer会为您这样做)

  1. 使用与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);
    }