treasure-chest/treasure-chest

一个简单的命名空间支持键/值存储,支持后端为memcached、apc等。

0.1.5 2013-01-25 17:27 UTC

This package is not auto-updated.

Last update: 2024-09-14 15:12:07 UTC


README

一个简单的命名空间支持的键/值存储,支持memcached、apc、文件系统等后端。

TreasureChest最大的特点是命名空间。大多数现有的键/值存储将数据放在一个单独的全局环境中,这可能导致在大型数据集中键名冲突。它们也不支持在删除键时使用通配符。无法执行类似于store('user1_username', 'bob')然后delete('user1_*');的操作。这使得跟踪和使大量相关键无效变得困难。TreasureChest提供了一种包装您最喜欢的键/值存储(memcached、apc、xcache等)的方法,使其成为可能。

内部,TreasureChest使用一个指针来跟踪每个命名空间的版本号。这个版本号被添加到所有传递给类的键之前。当命名空间被invalidate时,指针增加1,从而改变传递给数据存储的键。

需求

  • PHP 5.3或更高版本
  • Composer
  • APC 3.1.1或更高版本(如果使用APC作为后端)
  • Memcached 1.2.0和PECL memcached 0.1.0或更高版本(如果使用Memcached作为后端)

安装

使用 Composer 安装 treasure-chest/treasure-chest 包。包详细信息可在 Packagist.org 上找到 这里

将以下内容添加到您的 composer.json 中,并运行 composer install(或 composer update)。

"require": {
    "treasure-chest/treasure-chest": "0.1.*"
}

用法

创建一个 TreasureChest\Instance 类的实例,传递您希望使用的数据存储实例。

$bounty = new \TreasureChest\Instance(new \TreasureChest\Cache\APC);

使用 addstorefetchreplaceexistsincdecdelete 方法来存储、检索和操作您的数据。例如

$bounty->store('email', 'bob@example.org');
$bounty->store('age', 45);
$bounty->fetch('email'); // returns bob@example.org
$bounty->inc('age', 5); // returns 50
$bounty->dec('age', 10); // returns 40
$bounty->delete('email');
$bounty->fetch('email'); // returns boolean FALSE

可以使用命名空间来逻辑分组键/值对集。只需将键与所需的命名空间附加在一起,并用冒号(此分隔符字符可以更改)分隔即可。例如

$bounty->add('user123:username', 'bob');
$bounty->add('user123:email', 'bob@example.org');
$bounty->add('user123:age', 21);

// Clear the entire user123 namespace
$cache->invalidate('user123');

$cache->fetch('user123:username'); // returns boolean FALSE
$cache->fetch('user123:email'); // returns boolean FALSE
$cache->fetch('user123:age'); // returns boolean FALSE

已知问题

目前存在一个并发问题,可能导致TreasureChest返回应该被使无效的数据。如果另一个PHP进程在第一个进程仍在运行时调用 invalidate,就会发生这种情况。这可以通过在每个 fetchstore 等调用之前检查命名空间版本号来修复。这将影响性能,因此我将其作为用户启用选项。

待办事项

  • 引入在每次缓存调用之前检查命名空间版本的功能。
  • 改进测试套件。将当前的PHPUnit测试扩展到覆盖更多代码。