netherphp/cache

缓存接口。

v3.0.5 2021-06-08 20:25 UTC

This package is auto-updated.

Last update: 2024-09-09 03:08:06 UTC


README

轻量级缓存存储和检索管理。

  • LocalEngine - 在应用程序运行时在本地内存中缓存数据。
  • MemcacheEngine - 访问 memcached 网络缓存。
  • FilesystemEngine - 将缓存数据作为文件存储。

可以通过 EngineInterface 实现额外的缓存引擎。

许可协议为 BSD-2-Clause-Patent。有关详细信息,请参阅 LICENSE。

使用方法

低级

创建一个缓存管理器并将缓存引擎抛入其中。如果没有设置优先级值,则优先级将设置为使缓存始终按 FIFO 检查。在本示例中,LocalEngine 将始终在 MemcacheEngine 之前进行检查,而 MemcacheEngine 将始终在 FilesystemEngine 之前进行检查。可以使用优先级从最快到最慢堆叠缓存。

$Manager = new Nether\Cache\Manager;

$Manager
->EngineAdd(new Nether\Cache\Engines\LocalEngine)
->EngineAdd(new Nether\Cache\Engines\MemcacheEngine(
	Servers: [ 'localhost:11211' ]
))
->EngineAdd(new Nether\Cache\Engines\FilesystemEngine(
	Path: '/where/ever'
));

将数据放入缓存,询问关于它,并将其取回。

$Manager->Set('unique-id','value');

var_dump(
	$Manager->Has('unique-id'),
	$Manager->Get('unique-id')
);

// bool(true)
// string(5) "value"

从缓存中删除数据。

$Manager->Drop('unique-id');

var_dump(
	$Manager->Has('unique-id'),
	$Manager->Get('unique-id')
);

// bool(false)
// NULL

调试

缓存的内容被一个小描述符对象包装,该对象描述了数据,并且可以通过获取缓存对象而不是直接获取缓存数据来检查。

  • CacheObject->Time 是数据添加到缓存时的 Unix 时间戳。
  • CacheObject->Engine 将是数据所在缓存引擎的实例。
  • CacheObject->Origin 将为 NULL,除非在设置数据时定义。它旨在作为元数据来跟踪哪个项目的哪个部分将数据推入缓存。
$Manager->Set('test', 'geordi', Origin:'engineering');
print_r($Manager->GetCacheObject('unique-id'));
Nether\Cache\Struct\CacheObject Object
(
	[Data]   => geordi
	[Time]   => 1622487745
	[Origin] => engineering
	[Engine] => Nether\Cache\Engines\LocalEngine Object
		(
			[...]
		)
)

LocalEngine

new Nether\Cache\Engines\LocalEngine(
	UseGlobal: bool
);

将 UseGlobal 设置为 TRUE 将允许多个实例访问同一数据集。这将允许在需要时创建实例,而不是在应用程序早期创建实例并将其存储为某个地方的单例。

此引擎的工作方式实际上就是一个本地于当前正在运行的应用程序的数组。如果我们第一次就记住它,为什么还要两次向 Memcached 请求相同的东西呢?

MemcacheEngine

new Nether\Cache\Engines\MemcacheEngine(
	UseGlobal: bool,
	Memcache: Memcache|null
);

将 UseGlobal 设置为 TRUE 将允许多个实例访问同一定义的服务器池。这将允许在需要时创建实例,而不是在应用程序早期创建实例并将其存储为某个地方的单例。

提供 Memcache 实例将使用该实例构建的任何池。此外,这还允许在测试中注入模拟依赖项。

Engine->ServerAdd(string Host, int Port=11211)

将服务器添加到 Memcache 池。

FilesystemEngine

new Nether\Cache\Engines\FilesystemEngine(
	Path: string,
	UseHashType: string|NULL,
	UseHashStruct: bool
	UseFullDrop: bool
);

路径是唯一必需的参数,即存储缓存数据的目录的路径。

默认情况下,文件系统引擎的工作方式与其它引擎类似。在“test”键下存储数据,并在引擎指向的目录中获取名为“test”的文件。尽管如此,还有其他功能可以帮助使文件系统引擎在大规模上更健壮。

Engine->UseHashType(?string HashAlgoName)

给定系统支持的任何哈希名称,而不是将缓存文件作为名为“test”的文本文件存储,它将被称为哈希出的任何内容。将其设置为 NULL 将禁用哈希。

Engine->UseHashStruct(bool Should)

如果为 TRUE,则引擎将对最终文件名进行一些操作,以帮助避免目录中文件数目的文件系统限制。给定一个计算出的文件名哈希为 abcdef,它将被转换为 ab/cdef,以帮助将缓存文件分布在许多目录中。截至编写本文时,这与 Git 在 .git 文件夹中存储其对象文件的方式相同。