picamator / cachemanager
第三方缓存库包装器,用于优化API/'s搜索结果的保存
Requires
- php: >=7.0
- cache/adapter-common: ^0.3
- psr/cache: ~1.0
Requires (Dev)
- phpdocumentor/phpdocumentor: 2.*
- phpunit/phpunit: ~5.5
- satooshi/php-coveralls: ~1.0
This package is not auto-updated.
Last update: 2024-09-28 20:09:08 UTC
README
主分支
开发分支
CacheManager是一个应用程序,它提供第三方缓存库的包装器,以优化保存RESTful API或SQL搜索结果。
保存搜索响应的一般方法是基于构建搜索查询的哈希值作为缓存键。但是,对于两个略有不同的查询,这种方法效果不佳。此外,它还未能结合缓存和服务器上的数据。CacheManager针对像通过id搜索实体这样的特殊情况解决了这些问题。
缓存库
CacheManager没有实现任何默认的缓存库,也没有自己的库。相反,CacheManager要求对象实现PSR-6。通过Symfony DI和PSR-6 Adapters,可以无限制地使用任何缓存库。
要求
- PHP 7.0.x
安装
- 更新到您的
composer.json
{ "require": { "picamator/cachemanager": "~1.0" } }
- 运行
composer install --no-dev
规格
RESTful API
假设应用程序使用RESTful API,其中
customer
- 实体名称query
- 保存搜索标准的参数IN
- 与MySQL IN类似的功能fields
- 包含实体字段,以逗号分隔的参数
以下每个示例都显示了一对API请求。
示例1
GET: customer?query="id IN(1,2,3)&fields='name,address'"
GET: customer?query="id IN(1,2)&fields='name'"
第二个请求应使用缓存,因为它有关id为1和2的customer
的信息。
示例2
GET: customer?query="id IN(1,2,3)&fields='name'"
GET: customer?query="id IN(1,2)&fields='name,address'"
第二个请求不应使用缓存,因为它请求比缓存中保存的customer
更多的信息。因此,在从服务器获取数据后,应将其保存到缓存中,覆盖之前保存的数据。
示例3
GET: customer?query="id IN(1,2,3)&fields='name,address'"
GET: customer?query="id IN(3,4)&fields='name'"
第二个查询应使用缓存来处理id为3的customer
,并且应用程序应仅从服务器请求id为4的信息。
SQL
让我们使用MySQL与以下内容一起使用应用程序
customer
- 表id
、name
和address
-customer
表中的列
以下每个示例都显示了一对SQL查询。SQL示例的行为应类似于相应的RESTful API示例。
示例1
SELECT name, address FROM customer WHERE id IN(1,2,3)
SELECT name FROM customer WHERE id IN(1,2)
示例2
SELECT name FROM customer WHERE id IN(1,2,3)
SELECT name, address FROM customer WHERE id IN(1,2)
示例3
SELECT name, address FROM customer WHERE id IN(1,2,3)
SELECT name FROM customer WHERE id IN(3,4)
用法
CacheManager有两个不同的外观类
CacheManager
- 提供缓存的基本操作CacheManagerSubject
- 使CacheManager
可以通过events
进行扩展
应用程序应根据需要选择使用哪种类型的扩展性。如果不需要使用events
,则CacheManager
外观是最好的选择。
以下是使用CacheManager的步骤
- 使用与PSR-6兼容的适配器选择您的缓存库
- 使用DI实例化用于CacheManager外观的依赖项
- 创建
CacheManager
或CacheManagerSubject
- 准备
SearchCriteriaBuilder
- 在 CacheManager Facades 上应用操作
- 处理结果
通常步骤 1-3 在应用程序启动时只执行一次,但 4-6 步根据需要多次执行。
Memcached
MemcachedManager 是使用 Memcached 的 CacheManager 的示例。
其他缓存库
要使用任意缓存库与 CacheManager,需要
- 在您的库中实现 PSR-6 接口
Psr\Cache\CacheItemPoolInterface
- 或选择现有适配器之一 php-cache
- 在
CacheManager
和CacheManagerSubject
之间选择
下面的示例代码展示了如何使用 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 目录中的接口
- 事件:
beforeSave
、afterSave
、beforeSearch
、afterSearch
、beforeDelete
、afterDelete
文档
- UML 类图:class.diagram.png
- 用例图:use-case.diagram.png
- 生成文档:phpdoc,请按照 说明 构建
开发
要配置开发环境,请
- 按照 安装并运行 Docker 容器
- 在 Docker 容器中运行项目根目录下的
composer install
IDE 风格配置
请确保您的 IDE 已经导入 .editorconfig。有关更多信息,请访问 http://editorconfig.org/。
向下兼容性
请按照以下步骤保持向下兼容性
- 保持稳定的 API & SPI 应该
- 保持稳定的构造函数注入签名
- 保持稳定的抛出异常类型
向下兼容性验证
要检查向下兼容性,请在 MemcachedManager 中运行集成测试。
贡献
如果您认为这个项目值得使用,请给它加星。关注变更以查看所有活动。如果您看到改进的空间,请随时创建问题或发送拉取请求。这里有很好的 指南 来开始贡献。
请注意,该项目遵循 贡献者行为准则。通过参与此项目及其社区,您同意遵守这些条款。
许可证
CacheManager 根据 MIT 许可证授权。请参阅 LICENSE 文件以获取详细信息。