picamator/cachemanager

第三方缓存库包装器,用于优化API/'s搜索结果的保存

1.0.5 2016-11-20 22:51 UTC

This package is not auto-updated.

Last update: 2024-09-28 20:09:08 UTC


README

PHP 7 ready Latest Stable Version License SensioLabsInsight

主分支

Build Status StyleCI Coverage Status

开发分支

Build Status StyleCI Coverage Status

CacheManager是一个应用程序,它提供第三方缓存库的包装器,以优化保存RESTful API或SQL搜索结果。

保存搜索响应的一般方法是基于构建搜索查询的哈希值作为缓存键。但是,对于两个略有不同的查询,这种方法效果不佳。此外,它还未能结合缓存和服务器上的数据。CacheManager针对像通过id搜索实体这样的特殊情况解决了这些问题。

缓存库

CacheManager没有实现任何默认的缓存库,也没有自己的库。相反,CacheManager要求对象实现PSR-6。通过Symfony DIPSR-6 Adapters,可以无限制地使用任何缓存库。

要求

  • PHP 7.0.x

安装

  1. 更新到您的composer.json
{
    "require": {
        "picamator/cachemanager": "~1.0"
    }
}
  1. 运行composer install --no-dev

规格

RESTful API

假设应用程序使用RESTful API,其中

  • customer - 实体名称
  • query - 保存搜索标准的参数
  • IN - 与MySQL IN类似的功能
  • fields - 包含实体字段,以逗号分隔的参数

以下每个示例都显示了一对API请求。

示例1

  1. GET: customer?query="id IN(1,2,3)&fields='name,address'"
  2. GET: customer?query="id IN(1,2)&fields='name'"

第二个请求应使用缓存,因为它有关id为1和2的customer的信息。

示例2

  1. GET: customer?query="id IN(1,2,3)&fields='name'"
  2. GET: customer?query="id IN(1,2)&fields='name,address'"

第二个请求不应使用缓存,因为它请求比缓存中保存的customer更多的信息。因此,在从服务器获取数据后,应将其保存到缓存中,覆盖之前保存的数据。

示例3

  1. GET: customer?query="id IN(1,2,3)&fields='name,address'"
  2. GET: customer?query="id IN(3,4)&fields='name'"

第二个查询应使用缓存来处理id为3的customer,并且应用程序应仅从服务器请求id为4的信息。

SQL

让我们使用MySQL与以下内容一起使用应用程序

  • customer - 表
  • idnameaddress - customer表中的列

以下每个示例都显示了一对SQL查询。SQL示例的行为应类似于相应的RESTful API示例。

示例1

  1. SELECT name, address FROM customer WHERE id IN(1,2,3)
  2. SELECT name FROM customer WHERE id IN(1,2)

示例2

  1. SELECT name FROM customer WHERE id IN(1,2,3)
  2. SELECT name, address FROM customer WHERE id IN(1,2)

示例3

  1. SELECT name, address FROM customer WHERE id IN(1,2,3)
  2. SELECT name FROM customer WHERE id IN(3,4)

用法

CacheManager有两个不同的外观类

  1. CacheManager - 提供缓存的基本操作
  2. CacheManagerSubject - 使CacheManager可以通过events进行扩展

应用程序应根据需要选择使用哪种类型的扩展性。如果不需要使用events,则CacheManager外观是最好的选择。

以下是使用CacheManager的步骤

  1. 使用与PSR-6兼容的适配器选择您的缓存库
  2. 使用DI实例化用于CacheManager外观的依赖项
  3. 创建 CacheManagerCacheManagerSubject
  4. 准备 SearchCriteriaBuilder
  5. 在 CacheManager Facades 上应用操作
  6. 处理结果

通常步骤 1-3 在应用程序启动时只执行一次,但 4-6 步根据需要多次执行。

Memcached

MemcachedManager 是使用 Memcached 的 CacheManager 的示例。

其他缓存库

要使用任意缓存库与 CacheManager,需要

  1. 在您的库中实现 PSR-6 接口 Psr\Cache\CacheItemPoolInterface
  2. 或选择现有适配器之一 php-cache
  3. CacheManagerCacheManagerSubject 之间选择

下面的示例代码展示了如何使用 CacheManagerSubject 进行缓存搜索。请在实际应用程序中使用 DI 库构建依赖关系。

<?php
declare(strict_types = 1);

use \Picamator\CacheManager\Operation\Save;
use \Picamator\CacheManager\Operation\Search;
use \Picamator\CacheManager\Operation\Delete;

use \Picamator\CacheManager\ObjectManager;
use \Picamator\CacheManager\Cache\CacheItemFactory;
use \Picamator\CacheManager\Data\SearchResultFactory;

use \Picamator\CacheManager\Cache\KeyGenerator;
use \Picamator\CacheManager\CacheManager;
use \Picamator\CacheManager\CacheManagerSubject;

use \Picamator\CacheManager\Data\SearchCriteriaBuilder;

/** 
 * 1. Create dependencies objects
 */
// Use your implementation or existing adapters to fit PSR-6
/** @var \Psr\Cache\CacheItemPoolInterface $cacheItemPoolMock */
$cacheItemPoolMock = new CacheItemPoolMock();

// Use your implementation for extending CacheManagerSubject functionality
/** @var \Picamator\CacheManager\Spi\ObserverInterface $afterSearchMock */
$afterSearchMock = new AfterSearchMock();

// Object builder & factories
$objectManager          = new ObjectManager();
$cacheItemFactory       = new CacheItemFactory($objectManager);
$searchResultFactory    = new SearchResultFactory($objectManager);

// Building keys for saving data to cache
$cacheKeyGenerator      = new KeyGenerator();

// In real live please use Proxies or Lazy Loading
$operationSave          = new Save($cacheKeyGenerator, $cacheItemPoolMock, $cacheItemFactory);
$operationSearch        = new Search($cacheKeyGenerator, $cacheItemPoolMock, $searchResultFactory);
$operationDelete        = new Delete($cacheKeyGenerator, $cacheItemPoolMock);

/**
 * 2. Instantiate cache manager 
 */
// Instantiate main cache manager object
$cacheManager           = new CacheManager($operationSave, $operationSearch, $operationDelete);

// Wrap Cache managed as Observer, it's possible to omit wrapper if application does not need such kind extensibility
$cacheManagerSubject    = new CacheManagerSubject($cacheManager);

// Attach observer to execute after search
$cacheManagerSubject->attach('afterSearch', $afterSearchMock);

/**
 * 3. Provide search 
 */
// Prepare criteria
$searchCriteriaBuilder  = new SearchCriteriaBuilder($objectManager);
$searchCriteria = $searchCriteriaBuilder
                    ->setContextName('cloud')
                    ->setEntityName('customer')
                    ->setIdList([1, 2, 3])
                    ->setFieldList(['id', 'name'])
                    ->setIdName('id')
                    ->build();

$searchResult = $cacheManagerSubject->search($searchCriteria);

/**
 * 4. Handle search result 
 */
// result api details
$searchResult->count();         // number of returned data from cache e.g. 2
$searchResult->getData();       // array of cache items
$searchResult->getMissedData(); // array of missed in cache id's e.g. [1]
$searchResult->hasData();       // boolean to show does something fit $searchCriteria in cache

API & SPI

API

API 包括

SPI

SPI 包括

  • Spi 目录中的接口
  • 事件:beforeSaveafterSavebeforeSearchafterSearchbeforeDeleteafterDelete

文档

开发

要配置开发环境,请

  1. 按照 安装并运行 Docker 容器
  2. 在 Docker 容器中运行项目根目录下的 composer install

IDE 风格配置

请确保您的 IDE 已经导入 .editorconfig。有关更多信息,请访问 http://editorconfig.org/

向下兼容性

请按照以下步骤保持向下兼容性

  • 保持稳定的 API & SPI 应该
  • 保持稳定的构造函数注入签名
  • 保持稳定的抛出异常类型

向下兼容性验证

要检查向下兼容性,请在 MemcachedManager 中运行集成测试。

贡献

如果您认为这个项目值得使用,请给它加星。关注变更以查看所有活动。如果您看到改进的空间,请随时创建问题或发送拉取请求。这里有很好的 指南 来开始贡献。

请注意,该项目遵循 贡献者行为准则。通过参与此项目及其社区,您同意遵守这些条款。

许可证

CacheManager 根据 MIT 许可证授权。请参阅 LICENSE 文件以获取详细信息。