jamm / memory
内存中的键值存储。可作为存储使用的有:APC、Redis、Memcache、共享内存。所有存储对象都拥有一个接口,因此您可以在不更改工作代码的情况下切换它们。包含PHP Redis客户端。
Requires
- php: >=5.3.0
Suggests
- jamm/tester: allows to run unit-tests
This package is not auto-updated.
Last update: 2024-09-14 13:42:15 UTC
README
所有存储对象都拥有一个接口,因此您可以在不更改工作代码的情况下切换它们。
#特性
- 键标签
- 排除了“缓存雪崩”和“竞争条件”效应
- 通过一个命令即可加锁、解锁或获取键
- 自动解锁器 - 任何锁定的键都将自动解锁(在退出函数或脚本时,RAII)
- 您可以通过回调函数(Map)选择键
- 所有存储的单一接口 - 您可以更改存储而不更改代码
- Increment()方法可以与数组、字符串和数值一起使用
- MultiAccess类可用于任何资源,以创建一个访问模型 单写多读
#使用方法:请参阅demo.php以获取代码示例。
您可以使用MemoryObjects(RedisObject、CouchbaseObject、APCObject、MemcacheObject、SHMObject)作为常规的键值存储:获取/设置/删除。
该库的设计是为了提供附加功能,例如标签或避免“缓存雪崩”效应。
在所有存储中排除了竞争条件,但您也可以锁定键以避免算法中的竞争条件
例如,请参阅以下代码
$value = $mem->read('key');
if (some_condition()) $mem->save('key', $value . 'append');
如果此代码将由两个脚本同时执行,一个脚本的'append'将丢失。
为了避免这种情况,您可以锁定键
if ($mem->lock_key('key', $au))
{
if (some_condition()) $mem->save('key', $value . 'append');
}
或获取
if ($mem->acquire_key('key', $au))
{
if (some_condition()) $mem->save('key', $value . 'append');
}
这两种方法之间的区别在于当另一个进程锁定键时它们将做什么:lock_key()将仅返回'false',acquire_key()将等待直到键不再锁定(最大等待时间在代码中声明)。
这里的所有'锁'都是软锁。这意味着键不会为了写入或读取而锁定,但您可以检查键是否'锁定',以及如何处理它——这是您的脚本的决策。
它被设计用来避免死锁和客户等待访问键的无效队列。
代码示例
if ($mem->lock_key('key', $au))
{
if (some_condition()) $mem->save('key', $value . 'append');
}
else
{
// key is not hard-locked actually
$mem->del('key'); // we can do this
// but we can use 'locks' to manage multi-process interactions properly and easy (see previous code examples)
}
为了避免“缓存雪崩”效应(“缓存缺失风暴”、“缓存踩踏”),我们可以使用方法read()的第二个参数——当过期时间接近时,我们可以尝试锁定键,如果键已被锁定,则更新值。
请参阅demo.php中的示例。
#要求:您可以使用每个存储分别,要求对每个存储单独指定
###PHP版本:5.3+
##对于Redis:Redis服务器应已安装(在debian/ubuntu中:“apt-get install redis-server”)。
支持的版本是2.6.9及以下。另外,如果已安装,可以使用Redis(作为客户端库) - 只需使用PhpRedisObject
代替默认的RedisObject
。
##对于Couchbase:安装Couchbase PHP SDK
Couchbase Server 2.0
如果需要容错,请使用少量节点。
##对于Memcache:应安装Memcache或Memcached PHP扩展。
##对于APCObject:应安装APC,并将此设置添加到php.ini(或使用apc.ini时)
- apc.slam_defense = Off
- 建议: apc.user_ttl = 0
##对于SHMObject和MultiAccess:PHP应支持shm-functions和msg-functions (--enable-shmop --enable-sysvsem --enable-sysvshm --enable-sysvmsg)
仅在特定情况下(例如互斥锁)或无法安装其他扩展时使用。
##存储比较:Redis是最佳的缓存键值存储。
如果需要具有容错性和非常易于扩展的集群,并且能够承担(最小硬件要求),请使用Couchbase。
Redis、Couchbase和Memcache(d)可用于跨进程通信。此外,Redis和Couchbase存储中的数据在服务器重启后也将恢复。
APC是一种非常快且易于使用的存储,但在PHP 5.5版本发布内置的opcode缓存后已被弃用,因此它将仍存在于该库中,但请考虑使用Redis。
如果不能安装任何第三方包,可以使用共享内存 - 但您的PHP必须编译为支持shmop-functions。
测试
<?php
namespace Jamm\Memory\Tests;
header('Content-type: text/plain; charset=utf-8');
$testRedisObject = new TestMemoryObject(new \Jamm\Memory\RedisObject('test'));
$testRedisObject->RunTests();
$testRedisServer = new TestRedisServer();
$testRedisServer->RunTests();
$printer = new \Jamm\Tester\ResultsPrinter();
$printer->addTests($testRedisObject->getTests());
$printer->addTests($testRedisServer->getTests());
$printer->printResultsLine();
$printer->printFailedTests();
查看demo.php中的注释以获取更多信息。询问您想看到哪些注释。
许可协议:MIT